--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/predictivesearch/PcsUtils/src/CPsSettings.cpp Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,300 @@
+/*
+* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Utility class to store settings for predictive search.
+* Used to set the desired data stores to search and
+* the display fields for predictive search.
+*
+*/
+
+
+// INCLUDE FILES
+#include <s32mem.h>
+#include "CPsSettings.h"
+
+// ============================== MEMBER FUNCTIONS ============================
+
+
+// ----------------------------------------------------------------------------
+// CPsSettings::NewL
+// Two Phase constructor
+// ----------------------------------------------------------------------------
+EXPORT_C CPsSettings* CPsSettings::NewL()
+{
+ CPsSettings* self = new (ELeave) CPsSettings();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::CPsSettings
+// Default constructor
+// ----------------------------------------------------------------------------
+CPsSettings::CPsSettings()
+{
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::ConstructL
+// Two phase construction
+// ----------------------------------------------------------------------------
+void CPsSettings::ConstructL()
+{
+ iMaxResults = -1;
+ iSortType = EAlphabetical;
+}
+
+
+// ----------------------------------------------------------------------------
+// CPsSettings::CloneL
+// Returns the clone.
+// ------------------------------------------------------------------------
+EXPORT_C CPsSettings* CPsSettings::CloneL() const
+{
+ CPsSettings* self = CPsSettings::NewL();
+ CleanupStack::PushL(self);
+ // Set the Max reslts
+ self->SetMaxResults(iMaxResults);
+ self->SetSortType(iSortType);
+
+ // Copy the search uris
+ RPointerArray<TDesC> newUris;
+
+ for(TInt i =0; i < iSearchUri.Count() ; i++)
+ {
+ newUris.Append(iSearchUri[i]->AllocL());
+ }
+ self->SetSearchUrisL(newUris);
+ self->SetSearchUrisL(iSearchUri);
+
+ // Set the display fields
+ self->SetDisplayFieldsL(iDisplayFields);
+
+ newUris.ResetAndDestroy();
+
+ CleanupStack::Pop();
+ return self;
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::~CPsSettings
+// Destructor
+// ----------------------------------------------------------------------------
+EXPORT_C CPsSettings::~CPsSettings()
+{
+ iSearchUri.ResetAndDestroy();
+ iDisplayFields.Reset();
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::SetSearchUrisL
+// Sets the list of URIs to search from.
+// ----------------------------------------------------------------------------
+EXPORT_C void CPsSettings::SetSearchUrisL(const RPointerArray<TDesC>& aSearchUri)
+{
+ iSearchUri.ResetAndDestroy();
+ for(TInt i =0 ; i < aSearchUri.Count();i++)
+ {
+ const HBufC* uriToAppend = aSearchUri[i]->AllocL();
+ iSearchUri.Append(uriToAppend);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::SetDisplayFieldsL
+// Sets the list of fields to display.
+// ----------------------------------------------------------------------------
+EXPORT_C void CPsSettings::SetDisplayFieldsL(const RArray<TInt>& aDisplayFields)
+{
+ iDisplayFields.Reset();
+ for(TInt i =0 ; i < aDisplayFields.Count();i++)
+ {
+ iDisplayFields.Append(aDisplayFields[i]);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::SetMaxResults
+// Sets the number of elements (contacts) to be given to client.
+// ----------------------------------------------------------------------------
+EXPORT_C void CPsSettings::SetMaxResults(const TInt aMaxResults)
+{
+ if(aMaxResults >= -1)
+ {
+ iMaxResults = aMaxResults;
+ }
+ else
+ {
+ iMaxResults = -1;
+ }
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::SetSortType
+// Sets the sort type for the search
+// ----------------------------------------------------------------------------
+EXPORT_C void CPsSettings::SetSortType(const TSortType aSortType)
+{
+ iSortType = aSortType;
+}
+
+// CPsSettings::SearchUrisL
+// Returns the list of URIs configured to search from.
+// ----------------------------------------------------------------------------
+EXPORT_C void CPsSettings:: SearchUrisL(RPointerArray<TDesC>& aSearchUri) const
+{
+ //Cleanup already existing memory
+ for(TInt i =0 ; i < iSearchUri.Count();i++)
+ {
+ const HBufC* uriToAppend =iSearchUri[i]->AllocL();
+ aSearchUri.Append(uriToAppend);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::DisplayFieldsL
+// Returns the list of fields to display.
+// ----------------------------------------------------------------------------
+EXPORT_C void CPsSettings:: DisplayFieldsL(RArray<TInt>& aDisplayFields) const
+{
+ for(TInt i =0 ; i < iDisplayFields.Count();i++)
+ {
+ aDisplayFields.Append(iDisplayFields[i]);
+ }
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::MaxResults
+// Returns the number of elements (contacts) to be given to client.
+// ----------------------------------------------------------------------------
+EXPORT_C TInt CPsSettings::MaxResults() const
+{
+ return iMaxResults;
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::GetSortType
+// Returns the sort type based on which results will be sorted.
+// ----------------------------------------------------------------------------
+EXPORT_C TSortType CPsSettings::GetSortType() const
+{
+ return iSortType;
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::GetGroupIdsL
+// Returns the array groupId from the URIs specified in the settings
+// ----------------------------------------------------------------------------
+EXPORT_C void CPsSettings::GetGroupIdsL(RArray<TInt>& aGroupIdArray)
+{
+ aGroupIdArray.Reset();
+
+ // The format for groups URI is "cntdb:://group.gdb/group?=<groupId>"
+ // We use "=" to identify if it is a group URI
+ TChar equalToCharacter('=');
+
+ // Parse through all the URIs
+ for ( TInt i =0; i < iSearchUri.Count(); i++ )
+ {
+ TInt offset = iSearchUri[i]->Locate(equalToCharacter);
+
+ if ( offset != KErrNotFound )
+ {
+ // Parse and Extract the group name
+ TInt len = iSearchUri[i]->Length();
+ HBufC* grpIdBuf = iSearchUri[i]->Right(len - offset - 1).AllocL();
+
+ // Convert to decimal
+ TInt grpIdVal = 0;
+ TLex16 myDocId(*grpIdBuf);
+ TInt err = myDocId.Val(grpIdVal);
+
+ // Append to aGroupIdArray, if conversion is successful
+ if( KErrNone == err)
+ {
+ aGroupIdArray.Append(grpIdVal);
+ }
+
+ // Cleanup memory
+ delete grpIdBuf;
+ grpIdBuf = NULL;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::ExternalizeL
+// Writes 'this' to aStream
+// ----------------------------------------------------------------------------
+EXPORT_C void CPsSettings::ExternalizeL(RWriteStream& aStream) const
+{
+ aStream.WriteUint8L(iSearchUri.Count()); // Number of databse URIs
+
+ for ( int index = 0; index < iSearchUri.Count(); index++ )
+ {
+ HBufC* uri = iSearchUri[index]->AllocL();
+ if ( uri ) // Write uri to the stream (or a NULL descriptor)
+ {
+ aStream.WriteUint8L( uri->Size() ); // uri size
+ aStream << *uri; // uri
+ }
+ else
+ {
+ aStream.WriteUint8L( 0 );
+ aStream << KNullDesC8;
+ }
+ delete uri;
+ uri = NULL;
+ }
+
+ aStream.WriteUint8L(iDisplayFields.Count()); // Number of display fields
+ for ( int index = 0; index < iDisplayFields.Count(); index++ )
+ {
+ aStream.WriteInt16L(iDisplayFields[index]);
+ }
+
+ aStream.WriteInt16L(iMaxResults); // Number of contacts that will be displayed to the client
+ aStream.WriteInt8L(iSortType); // Set the sort type
+}
+
+// ----------------------------------------------------------------------------
+// CPsSettings::InternalizeL
+// Initializes 'this' with the contents of aStream
+// ----------------------------------------------------------------------------
+EXPORT_C void CPsSettings::InternalizeL(RReadStream& aStream)
+{
+ // Read number of database URIs
+ TInt szNumUri = aStream.ReadUint8L();
+
+ for ( int index = 0; index < szNumUri; index++ )
+ {
+ // Read uri size
+ TUint8 szUri = aStream.ReadUint8L();
+
+ HBufC* uri = HBufC::NewL(aStream, szUri);
+ iSearchUri.InsertL(uri, index);
+ }
+
+ // Read number of display fields
+ TInt szNumFields = aStream.ReadUint8L();
+ for ( int index = 0; index < szNumFields; index++ )
+ {
+ iDisplayFields.InsertL(aStream.ReadInt16L(), index);
+ }
+
+ // Read Number of contacts that will be displayed to the client
+ iMaxResults = aStream.ReadInt16L();
+ iSortType = (TSortType)aStream.ReadInt8L();
+}