smf/smfservermodule/smfclient/client/smfclientsymbian.cpp
changeset 14 a469c0e6e7fb
parent 7 be09cf1f39dd
--- 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 <QFile>
 //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<const char*>(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<const char*>(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<const char*>(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<const TText8*>(iBaseProvider.constData()),iBaseProvider.length());
-    
+		}
+	iProviderBuf = HBufC8::NewL(aSerializedData.size());
+	iPtrProvider.Set(iProviderBuf->Des());
+	iPtrProvider.Copy(reinterpret_cast<const TText8*>(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<const TText8*>(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<<iInterfaceName;
-	log.clear();
-    log = QString("iInterfaceNamebyte size=");
-    log += QString::number(iInterfaceNamebyte.size());
-    writeLog(log);
+	writeLog("iInterfaceNamebyte size=");
+	writeLog(QString::number(iInterfaceNamebyte.size()));
 	if(iIntfNameBuffer8)
 		{
 		delete iIntfNameBuffer8;
-		iIntfNameBuffer8 =NULL;
+		iIntfNameBuffer8 = NULL;
 		}
-	iIntfNameBuffer8 = HBufC8::NewL(aInterfaceName.size()*2);
+	iIntfNameBuffer8 = HBufC8::NewL(iInterfaceNamebyte.size());
 	iIntfNamePtr8.Set(iIntfNameBuffer8->Des());
-	//Convert into symbian data type
-	iIntfNamePtr8.Copy(reinterpret_cast<TUint8*>(iInterfaceNamebyte.data()),iInterfaceNamebyte.length());
-	log.clear();
-    log = QString("iIntfNamePtr8 size=")+QString::number(iIntfNamePtr8.Size());
-    writeLog(log);
-	
-
+	iIntfNamePtr8.Copy(reinterpret_cast<const TText8*>(iInterfaceNamebyte.constData()),iInterfaceNamebyte.length());
+	writeLog("After iIntfNamePtr8.Copy");
 	if(iBuffer)
 		{
 		delete iBuffer;
 		iBuffer = NULL;
 		}
-	//TODO:-KSmfMaxDataSize
-	iMaxMessageSize = 2000 ;
-    iBuffer = HBufC8::NewL(iMaxMessageSize);
+    iBuffer = HBufC8::NewL(aMaxAllocation);
     iDataPtr.Set(iBuffer->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<const TText8*>(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;
     }