Здраствуйте, помогите написать клиента для веб сервиса под симбу 9 под ноку
Новичек в симбе и с++ в часности
Вообщем дело обстоит так, после долгий поисков и перчитывания инфы, я нашел такую тулзовину как wsdl-to-c++
Эта тулзовина доступна для скачивания на сайте ноки
Скачал так же карбид 1.2 и sdk для симбы 9
Вобщем дальше я написал веб-сервис, используя дот нет 2, оно состоит и одного простинкого веб метода GetByPhone(string _strPhoneNumber)
это типа телефонного справочника, задеш номер возращяет абонента
получил wsdl и с помощю wsld-to-c++ сгенерил 6 файлов, из них 3 cpp и 3 h
Service, ServiceType и ServiceCallback
Потом я это все дело подключил в свой проект в карбиде, после прочтения мануала по wsdl-to-c++ я написал вот такой не замысловытый код
_LIT8(KServiceEndpoint, "http://localhost:1108/HiDayPhoneDirectoryService/Service.asmx?wsdl");
CSenXmlServiceDescription *pServiceDesc = CSenXmlServiceDescription::NewLC(KServiceEndpoint(), KNullDesC8());
pServiceDesc->SetFrameworkIdL(KDefaultBasicWebServicesFrameworkID);
CServiceCallback* pObserver = CServiceCallback::NewLC();
CServiceService* pService = CServiceService::NewLC(*pObserver,*pServiceDesc);
RGetByPhone ParamGetByPhone;
RGetByPhoneResponse result;
ParamGetByPhone.i_strPhoneNamber=HBufC::NewL(100);
_LIT(ddd,"111111111111");
*(ParamGetByPhone.i_strPhoneNamber) =ddd; //set a param
CSenSoapFault* fault = NULL;
pService->GetByPhoneL(ParamGetByPhone,result,&fault); //request
После компиляции, я запустил эту чудо програму и нажатия на кнопочку мне вылитает ексепшен с номером ошибки,
после поиска че это за ошибка, я узнал что это KErrSenNotInitialized
После просмотра инфы, я понял что это типа сеть не готова, т.е. оно должно сначала загрузить диалог с подключением к точке доступа, а потом законенктиться и делать запрос.
Но вот как я не знаю, я читал форумы ноки и там, есть обрывки фраз, что нужно использывать колбек класс, но как?
Искал так же пример готового клиента для веб-сериса, ниче не нашол!
Подскажите че делать дальше и скиньте пример веб-севриса, пожулуйста?
Здравствуйте, JTOne, Вы писали:
JTO>Но вот как я не знаю, я читал форумы ноки и там, есть обрывки фраз, что нужно использывать колбек класс, но как?
Под symbian c++ не работал с WSF, но было интересно самому глянуть. Так вот, сли открыть s60_cpp_sdk_3rd_mr.chm и сделать поиск по WSF, то первой же ссылкой будет Usage, в котором довольно подробно на мой взгляд (хотя, согласен документация в symbian c++ — это обычно дикий ужас, но в данном случае там все-таки получше, чем всегда

) описано, как создавать соединение:
Creating a connection
...
The creation of a connection is done by creating a CSenServiceConnection object using the provided CSenServiceConnection::NewL() or CSenServiceConnection::NewLC() factory methods. The client registers itself as an observer by passing a reference to itself (*this) as the first parameter to the factory methods for the callback functions presented in the MSenServiceConsumer interface:.
То есть нужно смотреть в сторону MSenServiceConsumer, а когда вызываются его методы написано в начале этого документа.
Понимаю, что помог не сильно, но пока это все, что нашел.
Просто если посмотреть в файл Service.cpp там есть такая фича, что то вроде с MSenServiceConsumer и с ..... CSenServiceConnection::NewL() or CSenServiceConnection::NewLC() factory methods....
Ну это на первый взгляд, и оно там в уже вроде реализовано, хотя это можеть что другое
Здравствуйте, JTOne, Вы писали:
JTO>Просто если посмотреть в файл Service.cpp там есть такая фича, что то вроде с MSenServiceConsumer и с ..... CSenServiceConnection::NewL() or CSenServiceConnection::NewLC() factory methods....
Кстати, пример то в СДК прямо и есть. Поиск по MSenServiceConsumer дает AddressBook
The purpose of this application is to provide an example, including source code, of the use of the Nokia Web Services Framework so that developers can test and run the application against a live server. The server will be hosted by Forum Nokia and provide the interface specified later in this document.
Да есть, спору нет, я его смотрел, но там другой подход, оно сделано не wsdl-to-c++, а описано все руками, а я не могу никак соопоставить и сделать выводы
Если бы де нарить рабочий пример именно сделаный с помощью wsdl-to-c++, но я пока не нашел
Вчера весь вечер разбирался что общего между примером addressbook и тем что я получаю после использования wsdl-to-c++, вобщем все сделано по схожому принцыпу, все работает с одними и теми же интерфейсам и класам, правда каждая в своей интерпритации. Ну как бы я не пытался, все равно нимогу понять как зделать так что бы появился стандартный диолог соединения с сетью, вроде бы все делаю как надо, но!!!
У меня такое чуство что этой тулзовниной wsdl-to-c++ не кто не умеет пользоваться и не кто ее не использует! Ни единого пример в интернете не нашол
JTO>У меня такое чуство что этой тулзовниной wsdl-to-c++ не кто не умеет пользоваться и не кто ее не использует! Ни единого пример в интернете не нашол
Я SOAP-овские вызовы реализовывал ручками (то бишь формировал XML и слал его по HTTP, ответы парсил). Не знаю, поможет ли тебе но вот куски кода которые у меня отвечают за установление соединения. Нужный Internet Access Point я выбираю не через стандартный диалог, а в своём кастомном интерфейсе. Нужно подшаманить с флажками TCommDbConnPrefs::SetDialogPreference чтобы получить стандартный диалог (на каких-то моделях телефонов у меня это периодически глючило, в итоге от стандартного диалога я отказался совсем). Если что-то покажется полезным но непонятным — спрашивай, попробую разъяснить.
-------------- skip -----------------
class CInternetConnection :
public CActive
{
public:
IMPORT_C LOCAL_C CInternetConnection* NewL(MInternetConnectionObserver& aObserver);
IMPORT_C ~CInternetConnection();
public: // From base classes
IMPORT_C void StartInterfaceL(TUint32 aIapID);
IMPORT_C void CloseInterfaceL();
IMPORT_C RSocketServ& SocketServer();
IMPORT_C RConnection& Connection();
IMPORT_C void GetIAPArrayL(RIAPArray& aArray);
private:
CInternetConnection(MInternetConnectionObserver& aObserver);
void ConstructL();
virtual void DoCancel();
virtual void RunL();
private:
MInternetConnectionObserver& iObserver;
rclass<RSocketServ> iSocketServer;
rclass<RConnection> iConnection;
};
-------------- skip -----------------
EXPORT_C CInternetConnection* CInternetConnection::NewL(MInternetConnectionObserver& aObserver)
{
auto_ptr<CInternetConnection> self(new (ELeave) CInternetConnection(aObserver));
self->ConstructL();
return self.release();
}
CInternetConnection::CInternetConnection(MInternetConnectionObserver& aObserver) :
CActive(CActive::EPriorityStandard),
iObserver(aObserver)
{
CActiveScheduler::Add(this);
}
CInternetConnection::~CInternetConnection()
{
Cancel();
}
void CInternetConnection::ConstructL()
{
User::LeaveIfError(iSocketServer.Connect());
iSocketServer.SetOpened();
}
void CInternetConnection::DoCancel()
{
iConnection.Stop();
}
void CInternetConnection::RunL()
{
if (iStatus.Int() == KErrNone)
{
iObserver.OnConnectionStarted();
}
else
{
TRACE("Connection failed with error = " << iStatus.Int());
iObserver.OnConnectionFailed(iStatus.Int());
}
}
EXPORT_C void CInternetConnection::GetIAPArrayL(RIAPArray& aArray)
{
auto_ptr<CCommsDatabase> commDB(CCommsDatabase::NewL(EDatabaseTypeIAP));
auto_ptr<CCommsDbTableView> commView(commDB->OpenIAPTableViewMatchingBearerSetLC(
ECommDbBearerCSD|ECommDbBearerGPRS, ECommDbConnectionDirectionOutgoing), LCFunction);
User::LeaveIfError(commView->GotoFirstRecord());
for (TInt errCode = KErrNone; KErrNotFound != errCode; errCode = commView->GotoNextRecord())
{
User::LeaveIfError(errCode);
TIAP iap;
commView->ReadTextL(TPtrC(COMMDB_NAME), iap.iIAPName);
commView->ReadUintL(TPtrC(COMMDB_ID), iap.iIAP);
aArray.AppendL(iap);
}
}
EXPORT_C void CInternetConnection::StartInterfaceL(TUint32 aIapID)
{
if( !iConnection.SubSessionHandle() )
{
User::LeaveIfError(iConnection.Open(iSocketServer));
iConnection.SetOpened();
}
TCommDbConnPref prefs;
prefs.SetDialogPreference(ECommDbDialogPrefDoNotPrompt);
prefs.SetDirection(ECommDbConnectionDirectionOutgoing);
prefs.SetIapId(aIapID);
iConnection.Start(prefs, iStatus);
SetActive();
}
EXPORT_C void CInternetConnection::CloseInterfaceL()
{
iConnection.Close();
}
EXPORT_C RSocketServ& CInternetConnection::SocketServer()
{
return iSocketServer;
}
EXPORT_C RConnection& CInternetConnection::Connection()
{
return iConnection;
}
-------------- skip -----------------
iHTTPSession.OpenL();
iHTTPSession.SetOpened();
RStringPool strP = iHTTPSession.StringPool();
RHTTPConnectionInfo connInfo = iHTTPSession.ConnectionInfo();
connInfo.SetPropertyL( strP.StringF(HTTP::EHttpSocketServ,
RHTTPSession::GetTable() ), THTTPHdrVal (aConnection.SocketServer().Handle() ) );
TInt connPtr = REINTERPRET_CAST(TInt, &(aConnection.Connection()));
connInfo.SetPropertyL( strP.StringF(HTTP::EHttpSocketConnection,
RHTTPSession::GetTable() ), THTTPHdrVal (connPtr) );
iHTTPSession.ConnectL();
... << RSDN@Home 1.2.0 alpha rev. 717>>
[offtop]
Я так понял оценки теперь ставят за любой выложеный код под Symbian

Уж очень там всё плохо с наличием нормальных примеров кода, одна из причин по которой я симбиан всем сердцем ненавижу

[/offtop]
... << RSDN@Home 1.2.0 alpha rev. 717>>