diff -r b5d63d5fc252 -r a469c0e6e7fb smf/smfservermodule/smfclient/client/smfclientsymbian.cpp --- a/smf/smfservermodule/smfclient/client/smfclientsymbian.cpp Mon Jun 07 11:43:45 2010 +0100 +++ b/smf/smfservermodule/smfclient/client/smfclientsymbian.cpp Wed Jun 23 19:51:49 2010 +0530 @@ -27,7 +27,7 @@ #include //testing end // For starting the server process -static TInt StartServerL(); +static TInt StartServer(); static TInt CreateServerProcessL(); CSmfClientSymbian::CSmfClientSymbian(smfObserver* aObserver) @@ -102,59 +102,66 @@ default: { - writeLog("RunL:-SmfContactRetrievePostsComplete"); + writeLog("RunL:-default"); //This contains error followed by actual data QByteArray receivedData(reinterpret_cast(iSession.iDataPtr.Ptr()),iSession.iDataPtr.Length()); - QString errStr; + writeLog("receivedData size="); + writeLog(QString::number(receivedData.size())); SmfError errVal; int errInt; QByteArray data; QDataStream reader(&receivedData,QIODevice::ReadOnly); reader>>errInt; + writeLog("errInt="); + writeLog(QString::number(errInt)); errVal = (SmfError)errInt; reader>>data; + writeLog("data size="); + writeLog(QString::number(data.size())); SmfRequestTypeID opcode = (SmfRequestTypeID)iSession.getLastRequest(); - iObserver->resultsAvailable(data,opcode,errVal); + if(iObserver) + { + iObserver->resultsAvailable(data,opcode,errVal); + } } break; } } QByteArray CSmfClientSymbian::sendRequest(QString aInterfaceName, - SmfRequestTypeID requestType) + SmfRequestTypeID requestType,TInt maxSize) { //This will be a synchronous request //note session is opened in ctor and closed in dtor writeLog("CSmfClientSymbian::sendRequest="); writeLog(aInterfaceName); //Gets data synchronously from the server - TPtr8 symbianBuf(iSession.sendSyncRequest(aInterfaceName,requestType)); + TPtr8 symbianBuf(iSession.sendSyncRequest(aInterfaceName,requestType,maxSize)); //convert this into bytearray QByteArray receivedData(reinterpret_cast(symbianBuf.Ptr()),symbianBuf.Length()); return receivedData; // } - +QByteArray CSmfClientSymbian::sendDSMSyncRequest(SmfRequestTypeID requestType,QByteArray& aSerializedData,SmfError& aErr,TInt maxSize) + { + writeLog("CSmfClientSymbian::sendDSMSyncRequest="); + writeLog(QString::number(requestType)); + SmfError err; + //Gets data synchronously from the server + TPtr8 symbianBuf(iSession.sendDSMSyncRequest(requestType,aSerializedData,err,maxSize)); + //convert this into bytearray + QByteArray receivedData(reinterpret_cast(symbianBuf.Ptr()),symbianBuf.Length()); + writeLog("receivedData size="); + writeLog(QString::number(receivedData.size())); + return receivedData; + } TInt CSmfClientSymbian::sendRequest(QByteArray& aSerializedData, QString aInterfaceName, - SmfRequestTypeID requestType) + SmfRequestTypeID requestType,TInt aMaxAllocation,QByteArray xtraInfo) { - //TODO:-testing puspose only, should be removed in the release - if(requestType == SmfTest) - { - QString log("Before iSesson.SendAsync"); - writeLog(log); - iSession.sendAsyncRequest(aSerializedData,aInterfaceName,requestType,iStatus); + //RSessionBase objects sendreceive is called + iSession.sendAsyncRequest(aSerializedData,aInterfaceName,requestType,iStatus,aMaxAllocation,xtraInfo); SetActive(); - QString log2("After setactive"); - writeLog(log2); - } - else - { - //RSessionBase objects sendreceive is called - iSession.sendAsyncRequest(aSerializedData,aInterfaceName,requestType,iStatus); - SetActive(); - } } TInt CSmfClientSymbian::sendDummyRequest(QByteArray* provider,QString aInterfaceName, @@ -181,7 +188,9 @@ } RSmfClientSymbianSession::RSmfClientSymbianSession() -:iDataPtr(NULL, 0, 0),iDataPtr16(NULL,0),iIntfNamePtr(NULL,0),iIntfNamePtr8(NULL,0),iPtrProvider(NULL,0) +:iDataPtr(NULL, 0, 0),iDataPtr16(NULL,0), + iIntfNamePtr(NULL,0),iIntfNamePtr8(NULL,0), + iPtrProvider(NULL,0),iPtrToSlot0(NULL,0) { // No implementation required } @@ -189,14 +198,14 @@ TInt RSmfClientSymbianSession::connectToServer() { writeLog("RSmfClientSymbianSession::connectToServer"); - TInt error = ::StartServerL(); + TInt error = ::StartServer(); writeLog("StartServerL="); QString err = QString::number(error); writeLog(err); if ( KErrNone == error ) { - error = CreateSession( KSmfServerName, + error = CreateSession(KSmfServerName, Version(), 4 ); QString crtSessionErr = QString::number(error); @@ -217,9 +226,55 @@ file.close(); #endif } +/** + * Sends sync request to the Smf server + */ +TPtr8 RSmfClientSymbianSession::sendDSMSyncRequest(SmfRequestTypeID aRequestType, + QByteArray& aSerializedData,SmfError aErr, + TInt maxSize) + { + /** + * Slot 0:- Data to be passed to DSM + * Slot 1:- Data returned from DSM + * Slot 2:- Error + */ + writeLog("RSmfClientSymbianSession::sendDSMSyncRequest"); + iLastRequest = aRequestType; + if(iSlot0Buffer) + { + delete iSlot0Buffer; + iSlot0Buffer = NULL; + } + iSlot0Buffer = HBufC8::NewL(aSerializedData.size()); + iPtrToSlot0.Set(iSlot0Buffer->Des()); + if(iBuffer) + { + delete iBuffer; + iBuffer = NULL; + } + iBuffer = HBufC8::NewL(maxSize); + iDataPtr.Set(iBuffer->Des()); + + TIpcArgs args; + args.Set(0, &iPtrToSlot0); + args.Set(1, &iDataPtr); + iDSMErr.Zero(); + args.Set(2,&iDSMErr); + + TInt sendErr = SendReceive(aRequestType,args); + writeLog("SendReceive="); + writeLog(QString::number(sendErr)); + TInt numIndex; + TLex iLex(iDSMErr); + + iLex.Val(numIndex); + aErr = (SmfError)numIndex; + return iDataPtr; + } TPtr8 RSmfClientSymbianSession::sendSyncRequest(QString aInterfaceName, - SmfRequestTypeID aRequestType) + SmfRequestTypeID aRequestType, + TInt maxSize) { iLastRequest = aRequestType; /** @@ -267,8 +322,14 @@ delete iBuffer; iBuffer = NULL; } - iMaxMessageSize = 1000 ; - iBuffer = HBufC8::NewL(iMaxMessageSize); + writeLog("Allocated for SmfProviderList="); + writeLog(QString::number(maxSize)); + if(iBuffer) + { + delete iBuffer; + iBuffer = NULL; + } + iBuffer = HBufC8::NewL(maxSize); iDataPtr.Set(iBuffer->Des()); log.clear(); log = QString("After iDataPtr.Set"); @@ -279,7 +340,11 @@ args.Set(0, &iInterfaceSymbian8); args.Set(1, &iDataPtr); - + if(maxSize) + { + iMaxSize = maxSize; + args.Set(2,iMaxSize); + } TInt err(KErrBadHandle); writeLog("Before handle"); log.clear(); @@ -310,114 +375,121 @@ void RSmfClientSymbianSession::sendAsyncRequest(QByteArray& aSerializedData, QString aInterfaceName, SmfRequestTypeID aRequestType, - TRequestStatus& aStatus) + TRequestStatus& aStatus, + TInt aMaxAllocation, + QByteArray aXtraInfo) { - iLastRequest = aRequestType; /** * The message body consists of.- - * 1. Provider Info(SmfProvider*)+ Other common class data - * (when applicable)-serialized - * 2. Interface name as string ("org.symbian.smf.client.gallery") - * 3. Data pointer to be filled by serialized data + * Modified,- + * slot 0 = SmfProvider +PageInfo flag+ aPageNum + aPerPage + XtraInfo flag(size of xtra data) Serialized + * slot 1 = Interface name serialized + * slot 2 = Data pointer to filled by server + * slot 3= Xtra info when required by server else empty buffer */ - QString log("RSmfClientSymbianSession::sendAsyncRequest-start-"); - writeLog(log); + writeLog("RSmfClientSymbianSession::sendAsyncRequest-start-"); + iLastRequest = aRequestType; - iBaseProvider= aSerializedData; - iInterfaceName = aInterfaceName ; + + - int size = aSerializedData.size(); - log.clear(); - log = QString("aSerializedData size=")+ QString::number(size); - - writeLog(log); - if(iProviderBuf) - { + if(iProviderBuf) + { delete iProviderBuf; iProviderBuf = NULL; - } - //TODO:- KSmfProviderMaxSize - iProviderBuf = HBufC8::NewL(iBaseProvider.size()*2); - iPtrProvider.Set(iProviderBuf->Des()); - //convert the QByteArray into TPtr - iPtrProvider.Copy(reinterpret_cast(iBaseProvider.constData()),iBaseProvider.length()); - + } + iProviderBuf = HBufC8::NewL(aSerializedData.size()); + iPtrProvider.Set(iProviderBuf->Des()); + iPtrProvider.Copy(reinterpret_cast(aSerializedData.constData()),aSerializedData.length()); + + + - log.clear(); - log = QString("iPtrProvider.Copy"); - writeLog(log); - - //Convert the interface name into TPtr//////////////////////// + //convert the QByteArray into TPtr + TPtrC8 ptrSlot0(reinterpret_cast(aSerializedData.constData()),aSerializedData.length()); + writeLog("ptrSlot0 size="); + writeLog(QString::number(ptrSlot0.Size())); + //Convert the interface name into TPtr iInterfaceName.clear(); - iInterfaceName = aInterfaceName ; + iInterfaceName.append(aInterfaceName) ; writeLog(QString("iInterfaceName=")+iInterfaceName); + iInterfaceNamebyte.clear(); //Pass serialized QString for interface name QDataStream intfNameStream(&iInterfaceNamebyte,QIODevice::WriteOnly); intfNameStream<Des()); - log.clear(); - log = QString("After iDataPtr.Set"); - writeLog(log); - - + writeLog("After iDataPtr.Set"); TIpcArgs args; - + //filling the slots args.Set(0, &iPtrProvider); args.Set(1, &iIntfNamePtr8); args.Set(2, &iDataPtr); - + writeLog("After setting 0,1,2 slots"); + if(aXtraInfo.size()) + { + TPtrC8 ptrToXtraInfo(reinterpret_cast(aXtraInfo.constData()),aXtraInfo.length()); + writeLog("ptrToXtraInfo size="); + writeLog(QString::number(ptrToXtraInfo.Size())); + args.Set(3, &ptrToXtraInfo); + } TInt err(KErrBadHandle); - log.clear(); - log = QString("Before Handle()"); - writeLog("Before handle"); + writeLog("Before Handle()"); if (Handle()) { err = KErrNone; - log.clear(); - log = QString("Before sendreceive"); - writeLog(log); - SendReceive(aRequestType, args, aStatus); - + writeLog("Before sendreceive"); + SendReceive(aRequestType, args, aStatus); } } // ----------------------------------------------------------------------------- -// StartServerL() -// Starts the server if it is not already running +// CreateServerProcessL() +// Creates a server process // ----------------------------------------------------------------------------- // -static TInt StartServerL() +static TInt CreateServerProcessL() + { + TInt result; + TUid KSmfServerUID3 = { 0xE5027327 }; + const TUidType serverUid( KNullUid, KNullUid, KSmfServerUID3 ); + + RProcess server; + + result = server.Create( KSmfServerFilename, KNullDesC, serverUid ); + + if ( result != KErrNone ) + { + return result; + } + + server.Resume(); + server.Close(); + + return KErrNone; + } +static TInt StartServer() { TInt result; - TFindServer findSmfServer( KSmfServerName ); + TFindServer findSmfServer( KSmfServerFilename ); TFullName name; result = findSmfServer.Next( name ); @@ -427,21 +499,31 @@ return KErrNone; } + RSemaphore semaphore; + result = semaphore.CreateGlobal( KSmfServerSemaphoreName, 0 ); + if ( result != KErrNone ) + { + return result; + } + result = CreateServerProcessL(); if ( result != KErrNone ) { return result; } + semaphore.Wait(); + semaphore.Close(); + return KErrNone; } // ----------------------------------------------------------------------------- -// CreateServerProcessL() +// CreateServerProcess() // Creates a server process // ----------------------------------------------------------------------------- // -static TInt CreateServerProcessL() +static TInt CreateServerProcess() { TInt result; //SmfServer SID @@ -450,22 +532,15 @@ RProcess server; - result = server.Create( KSmfServerFilename, KNullDesC, serverUid ); - User::LeaveIfError(result); - if (KErrNone != result) { - return result; - } - else { - //User::WaitForRequest going for infinite loop, temporary work-around - //TRequestStatus status; - //server.Rendezvous(status); - server.Resume(); // logon OK - start the server - //Going for infinite loop - //User::WaitForRequest(status);// wait for start or death - User::After(700000); - server.Close(); - return KErrNone; - //return status.Int(); // return the error - } + result = server.Create( KSmfServerName, KNullDesC, serverUid ); + + if ( result != KErrNone ) + { + return result; + } + + server.Resume(); + server.Close(); + return KErrNone; }