diff -r 81f8547efd4f -r e8e3147d53eb predictivesearch/PcsServer/src/CPcsSession.cpp --- 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 searchResults; + RPointerArray 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 searchResults; - RPointerArray 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 searchSeqs; // To hold matched location RArray 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 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 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; +}