predictivesearch/PcsAlgorithm/Algorithm1/src/CPcsAlgorithm1.cpp
branchRCL_3
changeset 35 4ae315f230bc
parent 21 b3431bff8c19
child 39 a6539d1e8e43
--- a/predictivesearch/PcsAlgorithm/Algorithm1/src/CPcsAlgorithm1.cpp	Tue May 11 16:00:21 2010 +0300
+++ b/predictivesearch/PcsAlgorithm/Algorithm1/src/CPcsAlgorithm1.cpp	Tue May 25 12:26:45 2010 +0300
@@ -32,9 +32,6 @@
 
 const TText KSpace = ' ';
 
-// UID used for Publish and Subscribe mechanism
-// This should be same as the one defined in CPsPropertyHandler.cpp
-const TUid KCStatus = {0x2000B5B6};
 
 // ============================== MEMBER FUNCTIONS ============================
 
@@ -80,23 +77,19 @@
     iPluginLauncher = CIdle::NewL( CActive::EPriorityStandard );
     
     // Define cache status property used to inform clients about the caching status.
-    TInt err = RProperty::Define(KCStatus,0, RProperty::EInt);      
-    if ( err != KErrAlreadyExists )
-    {
-    	User::LeaveIfError(err);
-    }
+    DefinePropertyL( EPsKeyCacheStatus );
     
     // Define cache error property used to inform client about the errors.
-    err = RProperty::Define(KCStatus,1, RProperty::EInt);
-    if ( err != KErrAlreadyExists )
-    {
-    	User::LeaveIfError(err);
-    }
+    DefinePropertyL( EPsKeyCacheError );
     
+    // Define properties for notifying about cache updates
+    DefinePropertyL( EPsKeyContactRemovedCounter );
+    DefinePropertyL( EPsKeyContactModifiedCounter );
+    DefinePropertyL( EPsKeyContactAddedCounter );
+
     // Initialize key map and pti engine
-    //iKeyMap = CPcsKeyMap::NewL();
     TInt keyMapErr = KErrNone;
-    TRAP( keyMapErr, iKeyMap = CPcsKeyMap::NewL());
+    TRAP( keyMapErr, iKeyMap = CPcsKeyMap::NewL() );
     if ( keyMapErr != KErrNone )
     {
         PRINT ( _L("**********************************************."));
@@ -117,8 +110,7 @@
      
     PRINT ( _L("End CPcsAlgorithm1::ConstructL") );
 } 
-	
-	
+
 // ----------------------------------------------------------------------------
 // CPcsAlgorithm1::~CPcsAlgorithm1
 // Destructor
@@ -147,6 +139,23 @@
 }
 
 // ----------------------------------------------------------------------------
+// CPcsAlgorithm1::DefinePropertyL
+// Define a P&S property with given key under the internal category 
+// UID of PCS. Leave if definition fails for any other reason than
+// key already existing. 
+// ----------------------------------------------------------------------------
+void CPcsAlgorithm1::DefinePropertyL( TPcsInternalKeyCacheStatus aPsKey )
+    {
+    TInt err = RProperty::Define( KPcsInternalUidCacheStatus, 
+                                  aPsKey, 
+                                  RProperty::EInt );
+    if ( err != KErrAlreadyExists )
+        {
+        User::LeaveIfError(err);
+        }
+    }
+
+// ----------------------------------------------------------------------------
 // CPcsAlgorithm1::RemoveSpacesL
 // Remove leading and trailing spaces of search query
 // ----------------------------------------------------------------------------
@@ -533,16 +542,16 @@
 // CPcsAlgorithm1::DoSearchL
 // Search function helper
 // ----------------------------------------------------------------------------
-void  CPcsAlgorithm1::DoSearchL(const CPsSettings& aSettings,
-								CPsQuery& aQuery,
-								RPointerArray<CPsData>& aSearchResults,
-								RPointerArray<CPsPattern>& aSearchSeqs )
+void  CPcsAlgorithm1::DoSearchL( const CPsSettings& aSettings,
+                                 CPsQuery& aQuery,
+                                 RPointerArray<CPsData>& aSearchResults,
+                                 RPointerArray<CPsPattern>& aSearchSeqs )
 {
     PRINT ( _L("Enter CPcsAlgorithm1::DoSearchL") );
 
     __LATENCY_MARK ( _L("CPcsAlgorithm1::DoSearchL") ); 
     
-    // -(0)----------------- Check if group search is required ---------------    
+    // (0)------------------ Check if group search is required ---------------
     RArray<TInt> contactsInGroup;
     CleanupClosePushL( contactsInGroup );
     RArray<TInt> groupIdArray;
@@ -619,10 +628,10 @@
 // CPcsAlgorithm1::DoSearchInputL
 // Search function helper
 // ----------------------------------------------------------------------------
-void  CPcsAlgorithm1::DoSearchInputL(CPsQuery& aQuery,
-		                             const TDesC& aData,
-		                             RPointerArray<TDesC>& aMatchSet,
-		                             RArray<TPsMatchLocation>& aMatchLocation )
+void  CPcsAlgorithm1::DoSearchInputL( CPsQuery& aQuery,
+                                      const TDesC& aData,
+                                      RPointerArray<TDesC>& aMatchSet,
+                                      RArray<TPsMatchLocation>& aMatchLocation )
 {
     PRINT ( _L("Enter CPcsAlgorithm1::DoSearchInputL") );
 
@@ -699,7 +708,7 @@
 // CPcsAlgorithm1::RemoveData
 // Remove a data element from the pool
 // ----------------------------------------------------------------------------
-void CPcsAlgorithm1::RemoveData(TDesC &aDataStore, TInt aItemId)
+void CPcsAlgorithm1::RemoveData(TDesC& aDataStore, TInt aItemId)
 {
     TInt arrayIndex = GetCacheIndex(aDataStore);
     
@@ -775,10 +784,10 @@
 	{
 		SetCachingError(aDataStore, err);
 		return;
-	}		    
+	}
     cache->SetDataFields(dataFields); 
     
-    // Check if sort order is persisted already    
+    // Check if sort order is persisted already
     RArray<TInt> sortOrder;
     TRAP(err, ReadSortOrderFromCenRepL(cache->GetURI(), sortOrder));
     if ( err != KErrNone )
@@ -808,7 +817,7 @@
 		SetCachingError(aDataStore, err);
 		UpdateCachingStatus(aDataStore,ECachingCompleteWithErrors);
 		return;
-	}		
+	}
 }
 
 // ----------------------------------------------------------------------------
@@ -821,7 +830,7 @@
     {
     	CPcsCache* cache = iPcsCache[i];
     	
-    	if ( cache->GetURI().CompareC(aDataStore) == 0 ) 
+    	if ( cache->GetURI().CompareC(aDataStore) == 0 )
     	{
     		delete iPcsCache[i];
     		iPcsCache.Remove(i);
@@ -850,7 +859,7 @@
     for ( i = 0; i < iPcsCache.Count(); i++ )
     {
     	if ( iPcsCache[i]->GetUriId() == aUriId ) 
-    	{    	   
+    	{
     	   found = ETrue;
     	   break;
     	}
@@ -870,15 +879,15 @@
 // ----------------------------------------------------------------------------
 TInt CPcsAlgorithm1::FindStoreUri ( const TDesC& aDataStore )
 {
-    for ( int i = 0; i < iPcsCache.Count(); i++ )
+    for ( TInt i = 0; i < iPcsCache.Count(); i++ )
     {
         if ( aDataStore.CompareC(iPcsCache[i]->GetURI()) == 0 ) 
     	{
-    	   return i;   
+    	   return i;
     	}
     }
 
-    return -1;
+    return KErrNotFound;
 }
 
 // ----------------------------------------------------------------------------
@@ -889,12 +898,24 @@
 {
 	PRINT ( _L("Enter CPcsAlgorithm1::UpdateCachingStatus") );
 	
+	// Handle data store update events
+	if ( aStatus == ECacheUpdateContactRemoved ||
+	     aStatus == ECacheUpdateContactModified ||
+	     aStatus == ECacheUpdateContactAdded )
+	    {
+        HandleCacheUpdated( static_cast<TCachingStatus>(aStatus) );
+        return;
+	    }
+	
+	// If not a cache update event, then this event is related to the initial
+	// cache construction.
 	TInt index = FindStoreUri(aDataStore);
+	
 	iPcsCache[index]->UpdateCacheStatus(aStatus);
 	
 	// Check if any error occurred
 	// If so, update the cache status, Set the property and return
-	if( aStatus < 0)
+	if ( aStatus < 0 )
 	{
 		SetCachingError(aDataStore, aStatus);
 		//return;
@@ -905,20 +926,20 @@
 	TBool atLeastOneStoreCachingCompleteWithErrors(EFalse);
 	for ( TInt i = 0; i < iPcsCache.Count(); i++ )
 	{
-		if( iPcsCache[i]->GetCacheStatus() == ECachingComplete)
-		  {
-	      continue;
-	      }	
-		else if ( iPcsCache[i]->GetCacheStatus() == ECachingCompleteWithErrors)
-		   {
-		 	 atLeastOneStoreCachingCompleteWithErrors = ETrue;
-		 	 continue;
-		   }
+		if ( iPcsCache[i]->GetCacheStatus() == ECachingComplete )
+		{
+	        continue;
+	    }
+		else if ( iPcsCache[i]->GetCacheStatus() == ECachingCompleteWithErrors )
+		{
+            atLeastOneStoreCachingCompleteWithErrors = ETrue;
+            continue;
+		}
 		else
 		{
 			status = ECachingInProgress;
 			break;
-		}			
+		}
 	}
 	
 	if ( status == ECachingComplete )
@@ -933,7 +954,7 @@
 	if ( status != iCacheStatus )
 	{
 		iCacheStatus = status;
-		RProperty::Set(KCStatus,0,iCacheStatus );
+		RProperty::Set(KPcsInternalUidCacheStatus, EPsKeyCacheStatus, iCacheStatus );
 	}
 	
 	PRINT ( _L("End CPcsAlgorithm1::UpdateCachingStatus") );
@@ -945,10 +966,10 @@
 // ----------------------------------------------------------------------------
 void CPcsAlgorithm1::SetCachingError(const TDesC& aDataStore, TInt aError)
 {
-	PRINT2 ( _L("SetCachingError::URI %S ERROR %d"), &aDataStore, aError );
+    PRINT2 ( _L("SetCachingError::URI %S ERROR %d"), &aDataStore, aError );
 
-	iCacheError = aError;
-	RProperty::Set( KCStatus, 1, iCacheError );
+    iCacheError = aError;
+    RProperty::Set( KPcsInternalUidCacheStatus, EPsKeyCacheError, iCacheError );
 }
 
 // ----------------------------------------------------------------------------
@@ -960,7 +981,7 @@
 {
 	__LATENCY_MARK ( _L("CPcsAlgorithm1::GetAllContentsL") );
     
-    PRINT ( _L("Enter CPcsAlgorithm1::GetAllContentsL") );   
+    PRINT ( _L("Enter CPcsAlgorithm1::GetAllContentsL") );
     
     // To hold array of results from different data stores
     typedef RPointerArray<CPsData> CPSDATA_R_PTR_ARRAY;
@@ -1145,7 +1166,7 @@
 {
     PRINT ( _L("End CPcsAlgorithm1::GetDataOrderL") );
 
-    TInt arrayIndex = -1;     
+    TInt arrayIndex = KErrNotFound;
     
     if ( CPcsAlgorithm1Utils::IsGroupUri(aURI) )
     {
@@ -1153,8 +1174,8 @@
         arrayIndex = GetCacheIndex(KVPbkDefaultCntDbURI);
     }
     else 
-    {		
-		arrayIndex = GetCacheIndex(aURI);
+    {
+        arrayIndex = GetCacheIndex(aURI);
     }
     
     if ( arrayIndex < 0 ) return;
@@ -1178,17 +1199,16 @@
 {
     PRINT ( _L("End CPcsAlgorithm1::GetSortOrderL") );
 
-    TInt arrayIndex = -1;
+    TInt arrayIndex = KErrNotFound;
     
     if ( CPcsAlgorithm1Utils::IsGroupUri(aURI) )
     {
         // If search in a group uri, use contacts db
-        TBuf<255> cntdb(KVPbkDefaultCntDbURI);
-        arrayIndex = GetCacheIndex(cntdb);
+        arrayIndex = GetCacheIndex(KVPbkDefaultCntDbURI);
     }
     else 
     {
-		arrayIndex = GetCacheIndex(aURI);
+        arrayIndex = GetCacheIndex(aURI);
     }
     
     if ( arrayIndex < 0 ) return;
@@ -1237,10 +1257,10 @@
     RArray<TInt> mySortOrder;
     cache->GetSortOrder(mySortOrder);
     
-    if ( aSortOrder.Count() == mySortOrder.Count() )    
+    if ( aSortOrder.Count() == mySortOrder.Count() )
     {
         TBool same = ETrue;
-        for ( TInt i = 0; i < mySortOrder.Count(); i++ )	
+        for ( TInt i = 0; i < mySortOrder.Count(); i++ )
         {
             if ( mySortOrder[i] != aSortOrder[i] )
             {
@@ -1363,8 +1383,8 @@
 	TInt keyIndex = -1;
 
 	for ( TInt i(KCenrepFieldsStartKey); 
-	  		   i < KCenrepFieldsStartKey + KCenrepNumberOfFieldsCount; 
-	           i++ )
+	      i < KCenrepFieldsStartKey + KCenrepNumberOfFieldsCount; 
+	      i++ )
 	{
 		TInt err = repository->Get( i, str );
 
@@ -1395,8 +1415,8 @@
 	{
 		// Find the next free key index
 		for ( TInt i(KCenrepFieldsStartKey); 
-		  		   i < KCenrepFieldsStartKey + KCenrepNumberOfFieldsCount; 
-		           i++ )
+		      i < KCenrepFieldsStartKey + KCenrepNumberOfFieldsCount; 
+		      i++ )
 	    {
 		    TInt err = repository->Get( i, str );
 
@@ -1479,6 +1499,45 @@
 }
 
 // ---------------------------------------------------------------------------------
+// HandleCacheUpdated.
+// ---------------------------------------------------------------------------------
+void CPcsAlgorithm1::HandleCacheUpdated( TCachingStatus aStatus )
+    {
+    TInt psKey( KErrNotFound );
+    
+    switch ( aStatus )
+        {
+        case ECacheUpdateContactRemoved:
+            psKey = EPsKeyContactRemovedCounter;
+            break;
+            
+        case ECacheUpdateContactModified:
+            psKey = EPsKeyContactModifiedCounter;
+            break;
+            
+        case ECacheUpdateContactAdded:
+            psKey = EPsKeyContactAddedCounter;
+            break;
+            
+        default:
+            break;
+        }
+
+    if ( psKey != KErrNotFound )
+        {
+        // Increment the related counter in P&S by one to signal the clients about
+        // the cache update.
+        TInt counter( KErrNotFound );
+        TInt err = RProperty::Get( KPcsInternalUidCacheStatus, psKey, counter );
+        if ( !err )
+            {
+            counter++;
+            RProperty::Set( KPcsInternalUidCacheStatus, psKey, counter );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------------
 // DoLaunchPluginsL.
 // launch plugins by idle
 // ---------------------------------------------------------------------------------