predictivesearch/PcsServer/src/CPcsSession.cpp
branchRCL_3
changeset 6 e8e3147d53eb
parent 0 e686773b3f54
child 13 a6539d1e8e43
--- a/predictivesearch/PcsServer/src/CPcsSession.cpp	Fri Mar 12 15:41:25 2010 +0200
+++ b/predictivesearch/PcsServer/src/CPcsSession.cpp	Mon Mar 15 12:39:26 2010 +0200
@@ -82,12 +82,7 @@
 {
 	PRINT ( _L("Enter CPcsSession::~CPcsSession") );
 
-	if ( iSettings )
-	{
-		delete iSettings;
-		iSettings = NULL;
-	}
-	
+	delete iSettings;
 	delete iDes;
 
 	PRINT ( _L("End CPcsSession::~CPcsSession") );
@@ -151,7 +146,7 @@
         case ESearchMatchString:
             PRINT ( _L("Received function ESearchMatchString") );
             SearchMatchStringL(aMessage);
-            break;    	    
+            break;
 
     	case ELangSupport:
 			PRINT ( _L("Received function ELangSupport") );
@@ -247,25 +242,19 @@
         // -------------------------------------------------------------
 
 	    // Read search query from the message
-	    HBufC8* searchQuery = HBufC8::NewLC(KBufferMaxLen);
-
-	    TPtr8 searchQueryPtr(searchQuery->Des());
-        aMessage.ReadL(0, searchQueryPtr);
-
-	    // Stream over the buffer
-	    RDesReadStream searchQueryStream(searchQueryPtr);
-	    searchQueryStream.PushL();
-
-	    // Query object
-	    CPsQuery* psQuery = CPsQuery::NewL();
-
-	    psQuery->InternalizeL(searchQueryStream);
-
-	    // searchQueryStream, searchQuery
-	    CleanupStack::PopAndDestroy(2, searchQuery);
+	    CPsQuery* psQuery = ReadQueryLC( 0, aMessage );
 
 	    // -------------------------------------------------------------
 
+        RPointerArray<CPsClientData>  searchResults;
+        RPointerArray<CPsPattern>     searchSeqs;
+
+        iServer->PluginInterface()->PerformSearchL(*iSettings,
+                                                   *psQuery,
+                                                   searchResults,
+                                                   searchSeqs);
+        CleanupStack::PopAndDestroy( psQuery );
+
 		// Dynamic data buffer
 	    CBufFlat* buf = CBufFlat::NewL(KBufferMaxLen);
 	    CleanupStack::PushL(buf);
@@ -274,20 +263,11 @@
 	    RBufWriteStream stream(*buf);
 	    stream.PushL();
 
-        RPointerArray<CPsClientData>  searchResults;
-	    RPointerArray<CPsPattern>     searchSeqs;
-
-
-		iServer->PluginInterface()->PerformSearchL(*iSettings,
-		                                           *psQuery,
-		                                           searchResults,
-		                                           searchSeqs);
-
         // Write the number of contacts
 	    stream.WriteInt32L(searchResults.Count());
 
 	    // Write the contacts
-	    for ( int i = 0; i < searchResults.Count(); i++ )
+	    for ( TInt i = 0; i < searchResults.Count(); i++ )
 	    {
 	        searchResults[i]->ExternalizeL(stream);
 	    }
@@ -296,7 +276,7 @@
 	    stream.WriteInt32L(searchSeqs.Count());
 
 	    // Write the seqs
-	    for ( int j = 0; j < searchSeqs.Count(); j++ )
+	    for ( TInt j = 0; j < searchSeqs.Count(); j++ )
 	    {
 	        searchSeqs[j]->ExternalizeL(stream);
 	    }
@@ -304,16 +284,15 @@
 	    // Cleanup
 	    searchResults.ResetAndDestroy();
 	    searchSeqs.ResetAndDestroy();
-	    delete psQuery;
 
         // Results are already packed in the stream
         stream.CommitL();
 
         // Create a heap descriptor from the buffer
-	    iDes = HBufC8::NewL(buf->Size());
-	    TPtr8 ptr(iDes->Des());
-	    buf->Read(0, ptr, buf->Size());
-
+        delete iDes;
+        iDes = NULL;
+	    iDes = buf->Ptr(0).AllocL();
+	    
 	    CleanupStack::PopAndDestroy(2, buf); // buf, stream
     }
 
@@ -370,21 +349,7 @@
     // -------------------------------------------------------------
 
     // Read search query from the message
-    HBufC8* searchQuery = HBufC8::NewLC(KBufferMaxLen);
-
-    TPtr8 searchQueryPtr(searchQuery->Des());
-    aMessage.ReadL(0, searchQueryPtr);
-
-    // Stream over the buffer
-    RDesReadStream searchQueryStream(searchQueryPtr);
-    searchQueryStream.PushL();
-
-    // Query object
-    CPsQuery* psQuery = CPsQuery::NewL();
-    psQuery->InternalizeL(searchQueryStream);
-
-    // searchQueryStream, searchQuery
-    CleanupStack::PopAndDestroy(2, searchQuery);
+    CPsQuery* psQuery = ReadQueryLC( 0, aMessage );
 
     // -------------------------------------------------------------
 
@@ -405,24 +370,16 @@
 
     // searchQueryStream, searchQuery
     CleanupStack::PopAndDestroy(2, searchData);
+    CleanupStack::PushL( data );
 
     // -------------------------------------------------------------
 
-	// Dynamic data buffer
-    CBufFlat* buf = CBufFlat::NewL(KBufferMaxLen);
-    CleanupStack::PushL(buf);
-
-    // Stream over the buffer
-    RBufWriteStream stream(*buf);
-    stream.PushL();
-
     // To hold the matches
     RPointerArray<TDesC> searchSeqs;
 
     // To hold matched location
     RArray<TPsMatchLocation> sequenceLoc;
 
-
 	iServer->PluginInterface()->SearchInputL(*psQuery,
 	                                         *data,
 	                                         searchSeqs,
@@ -430,15 +387,24 @@
 
 
     // Delete the search query and search data
-    delete psQuery;
-    delete data;
+	CleanupStack::PopAndDestroy( data );
+    CleanupStack::PopAndDestroy( psQuery );
+
+    // --------- create write stream ---------------------------
+    // Dynamic data buffer
+    CBufFlat* buf = CBufFlat::NewL(KBufferMaxLen);
+    CleanupStack::PushL(buf);
+
+    // Stream over the buffer
+    RBufWriteStream stream(*buf);
+    stream.PushL();
 
     // --------- write match sequence ---------------------------
     // Write the number of match seqs
     stream.WriteUint16L(searchSeqs.Count());
 
     // Write the matches
-    for ( int j = 0; j < searchSeqs.Count(); j++ )
+    for ( TInt j = 0; j < searchSeqs.Count(); j++ )
     {
         TInt length = searchSeqs[j]->Length();
 
@@ -476,14 +442,10 @@
 
     stream.CommitL();
 
-    // Create a heap descriptor from the buffer
-    HBufC8* des = HBufC8::NewLC(buf->Size());
-    TPtr8 ptr(des->Des());
-    buf->Read(0, ptr, buf->Size());
-
-	aMessage.Write(2, *des);
+	aMessage.Write(2, buf->Ptr(0));
 	aMessage.Complete(KErrNone);
-	CleanupStack::PopAndDestroy(3, buf); // buf, stream, des
+	
+	CleanupStack::PopAndDestroy(2, buf); // buf, stream
 	
     PRINT ( _L("End CPcsSession::SearchInputL") );
     __LATENCY_MARKEND ( _L("CPcsSession::SearchInputL") );
@@ -501,22 +463,14 @@
 
     // -------------------------------------------------------------
 
-    // Read search query from the message
-    HBufC8* searchQuery = HBufC8::NewLC(KBufferMaxLen);
-
-    TPtr8 searchQueryPtr(searchQuery->Des());
-    aMessage.ReadL(0, searchQueryPtr);
+    // Create result buffer
+    HBufC* des = HBufC::NewLC(KBufferMaxLen);
+    TPtr ptr(des->Des());
+    
+    // -------------------------------------------------------------
 
-    // Stream over the buffer
-    RDesReadStream searchQueryStream(searchQueryPtr);
-    searchQueryStream.PushL();
-
-    // Query object
-    CPsQuery* psQuery = CPsQuery::NewL();
-    psQuery->InternalizeL(searchQueryStream);
-
-    // searchQueryStream, searchQuery
-    CleanupStack::PopAndDestroy(2, searchQuery);
+    // Read search query from the message
+    CPsQuery* psQuery = ReadQueryLC( 0, aMessage );
 
     // -------------------------------------------------------------
 
@@ -537,29 +491,22 @@
 
     // searchQueryStream, searchQuery
     CleanupStack::PopAndDestroy(2, searchData);
+    CleanupStack::PushL( data );
 
     // -------------------------------------------------------------
 
-    // Dynamic data buffer
-    CBufFlat* buf = CBufFlat::NewL(KBufferMaxLen);
-    CleanupStack::PushL(buf);
-
-    // Create a heap descriptor from the buffer
-    HBufC* des = HBufC::NewLC(KBufferMaxLen);
-    TPtr ptr(des->Des());
-    
     iServer->PluginInterface()->SearchMatchStringL(*psQuery,
-                                             *data,
-                                             ptr);
+                                                   *data,
+                                                   ptr);
 
 
     // Delete the search query and search data
-    delete psQuery;
-    delete data;
+    CleanupStack::PopAndDestroy( data );
+    CleanupStack::PopAndDestroy( psQuery );
 
     aMessage.Write(2, *des);
     aMessage.Complete(KErrNone);
-    CleanupStack::PopAndDestroy(2, buf); // buf, des
+    CleanupStack::PopAndDestroy(des);
     
     PRINT ( _L("End CPcsSession::SearchMatchStringL") );
     __LATENCY_MARKEND ( _L("CPcsSession::SearchMatchStringL") );
@@ -613,14 +560,9 @@
 
     // --------------------------------------------------------------
 
-    // Create a heap descriptor from the buffer
-    HBufC8* des = HBufC8::NewLC(buffer1->Size());
-    TPtr8 ptr(des->Des());
-    buffer1->Read(0, ptr, buffer1->Size());
-
-	aMessage.Write(1, *des);
+	aMessage.Write(1, buffer1->Ptr(0));
 	aMessage.Complete(KErrNone);
-	CleanupStack::PopAndDestroy(3, buffer1); // buffer1, stream1, des
+	CleanupStack::PopAndDestroy(2, buffer1); // buffer1, stream1
 
 	PRINT ( _L("End CPcsSession::IsLanguageSupportedL") );
 }
@@ -680,7 +622,7 @@
 	stream1.WriteUint16L(fieldCount);
 
 	// Pack the fields
-	for ( int i = 0; i < fieldCount; i++ )
+	for ( TInt i = 0; i < fieldCount; i++ )
 	{
 		stream1.WriteUint16L(dataOrder[i]);
 	}
@@ -689,14 +631,9 @@
 
     // --------------------------------------------------------------
 
-    // Create a heap descriptor from the buffer
-    HBufC8* des = HBufC8::NewLC(buffer1->Size());
-    TPtr8 ptr(des->Des());
-    buffer1->Read(0, ptr, buffer1->Size());
-
-	aMessage.Write(1, *des);
+	aMessage.Write(1, buffer1->Ptr(0));
 	aMessage.Complete(KErrNone);
-	CleanupStack::PopAndDestroy(4, &dataOrder); // des, stream1, buffer1, dataOrder
+	CleanupStack::PopAndDestroy(3, &dataOrder); // stream1, buffer1, dataOrder
 
     PRINT ( _L("End CPcsSession::GetDataOrderL") );
 }
@@ -725,7 +662,10 @@
 	TInt uriSize = stream.ReadUint16L();
 
     // URI
-    HBufC* uri = HBufC::NewLC(stream, uriSize);
+    HBufC* uri = HBufC::NewL(stream, uriSize);
+    CleanupStack::PopAndDestroy( &stream );
+    CleanupStack::PopAndDestroy( buffer );
+    CleanupStack::PushL( uri );
 
     // --------------------------------------------------------------
 
@@ -733,8 +673,7 @@
     RArray<TInt> sortOrder;
     iServer->PluginInterface()->GetSortOrderL(*uri, sortOrder);
     
-    // uri, stream, buffer
-    CleanupStack::PopAndDestroy(3, buffer);
+    CleanupStack::PopAndDestroy( uri );
     
     CleanupClosePushL( sortOrder );
     
@@ -753,7 +692,7 @@
 	stream1.WriteUint16L(fieldCount);
 
 	// Pack the fields
-	for ( int i = 0; i < fieldCount; i++ )
+	for ( TInt i = 0; i < fieldCount; i++ )
 	{
 		stream1.WriteUint16L(sortOrder[i]);
 	}
@@ -762,14 +701,9 @@
 
     // --------------------------------------------------------------
 
-    // Create a heap descriptor from the buffer
-    HBufC8* des = HBufC8::NewLC(buffer1->Size());
-    TPtr8 ptr(des->Des());
-    buffer1->Read(0, ptr, buffer1->Size());
-
-	aMessage.Write(1, *des);
+	aMessage.Write(1, buffer1->Ptr(0));
 	aMessage.Complete(KErrNone);
-	CleanupStack::PopAndDestroy(4, &sortOrder); // des, buffer1, stream1, sortOrder
+	CleanupStack::PopAndDestroy(3, &sortOrder); // buffer1, stream1, sortOrder
 
     PRINT ( _L("End CPcsSession::GetSortOrderL") );
 }
@@ -799,27 +733,26 @@
 
     // URI
     HBufC* uri = HBufC::NewLC(stream, uriSize);
-    CleanupStack::Pop(); // uri
 
     // Number of data fields
     TInt fieldCount = stream.ReadUint16L();
     RArray<TInt> sortOrder;
+    CleanupClosePushL( sortOrder );
 
-    for ( int i = 0; i < fieldCount; i++ )
+    for ( TInt i = 0; i < fieldCount; i++ )
     {
-    	sortOrder.Append(stream.ReadUint16L());
+    	sortOrder.AppendL(stream.ReadUint16L());
     }
 
-    // stream, buffer
-    CleanupStack::PopAndDestroy(2, buffer);
-
     // --------------------------------------------------------------
 
     // Set the sort order
     iServer->PluginInterface()->ChangeSortOrderL(*uri, sortOrder);
 
-    delete uri;
-    sortOrder.Reset();
+    CleanupStack::PopAndDestroy( &sortOrder ); // Close
+    CleanupStack::PopAndDestroy( uri );
+    CleanupStack::PopAndDestroy( &stream );
+    CleanupStack::PopAndDestroy( buffer );
 
     // --------------------------------------------------------------
 
@@ -841,3 +774,33 @@
 
 	PRINT ( _L("End CPcsSession::ShutdownServerL") );
 }
+
+// ----------------------------------------------------------------------------
+// CPcsSession::ReadQueryLC
+//
+// ----------------------------------------------------------------------------
+CPsQuery* CPcsSession::ReadQueryLC( TInt aParam, const RMessage2& aMessage )
+{
+    TInt size = aMessage.GetDesLength( aParam );
+    HBufC8* tempBuf = HBufC8::NewLC( size );
+
+    TPtr8 ptr( tempBuf->Des() );
+    aMessage.ReadL( aParam, ptr );
+
+    // Stream over the buffer
+    RDesReadStream stream( ptr );
+    stream.PushL();
+
+    // Query object
+    CPsQuery* psQuery = CPsQuery::NewL();
+    CleanupStack::PushL( psQuery );
+
+    psQuery->InternalizeL( stream );
+
+    CleanupStack::Pop( psQuery ); // temporarily
+    CleanupStack::PopAndDestroy( &stream );
+    CleanupStack::PopAndDestroy( tempBuf );
+    CleanupStack::PushL( psQuery );
+    
+    return psQuery;
+}