syncmlfw/ds/syncagent/src/nsmldsagent.cpp
changeset 60 eb6690d0d439
parent 51 2e64dc50f295
--- a/syncmlfw/ds/syncagent/src/nsmldsagent.cpp	Fri Aug 06 18:29:23 2010 +0530
+++ b/syncmlfw/ds/syncagent/src/nsmldsagent.cpp	Thu Aug 19 17:35:34 2010 +0530
@@ -43,8 +43,10 @@
 #include "nsmldscontent.h"
 #include "nsmldserror.h"
 #include "nsmldssettings.h"
+#include "nsmldsoperatorsettings.h"
 #include "nsmlagentlog.h"
 #include "nsmlroam.h"
+#include "nsmloperatorerrorcrkeys.h"
 //RD_AUTO_RESTART
 #include <e32base.h>
 #include <centralrepository.h> 
@@ -61,6 +63,11 @@
 #pragma diag_remark 174
 #endif
 
+// CONSTANTS
+const TInt KGranularity = 12;
+const TInt KErrorCodeRangeFirst = 400;
+const TInt KErrorCodeRangeLast = 516;
+
 // ============================ MEMBER FUNCTIONS ===============================
 
 // -----------------------------------------------------------------------------
@@ -68,7 +75,8 @@
 // C++ constructor.
 // -----------------------------------------------------------------------------
 //
-CNSmlDSAgent::CNSmlDSAgent()
+CNSmlDSAgent::CNSmlDSAgent(): 
+        iServerStatusCodeArray ( RArray< TInt >( KGranularity ) )
     {
 	}
 
@@ -112,6 +120,15 @@
 	}
 	//RD_AUTO_RESTART
 	
+    iRepositorySSC = CRepository::NewL( KCRUidOperatorDatasyncErrorKeys );
+    CNSmlDSOperatorSettings* settings = CNSmlDSOperatorSettings::NewLC();
+    iErrorReportingEnabled = settings->SyncErrorReportingEnabled();
+    if ( iErrorReportingEnabled )
+        {
+        settings->PopulateStatusCodeListL( iServerStatusCodeArray );
+        }
+    CleanupStack::PopAndDestroy( settings );
+	
 	// security policies for P&S reading and writing
 	_LIT_SECURITY_POLICY_S0( KNSmlPSWritePolicy, KNSmlSOSServerPolicyUID.iUid ); // SID check (sosserver) when writing
 	_LIT_SECURITY_POLICY_PASS( KNSmlPSReadPolicy ); // no checks done when reading
@@ -162,8 +179,11 @@
 	{
 		delete iDSNetmon;		
 		iDSNetmon = NULL;
-	}	
-	//RD_AUTO_RESTART	
+	}
+    //RD_AUTO_RESTART
+	
+    iServerStatusCodeArray.Close();
+    delete iRepositorySSC;
 	}
 
 // -----------------------------------------------------------------------------
@@ -1645,6 +1665,12 @@
                         EDataSyncRunning12 );	    
         }
     
+    if ( iRepositorySSC )
+        {
+        iRepositorySSC->Set( KNsmlOpDsSyncErrorCode, KErrNone );
+        iRepositorySSC->Set( KNsmlOpDsSyncProfId, profile->IntValue( EDSProfileId ) );
+        iRepositorySSC->Set( KNsmlOpDsSyncInitiation, iSyncInitiation );
+        }
 
 	TBool ifInternet = ETrue ; // CR: 403-1188
 	if ( iMediumType == KUidNSmlMediumTypeInternet )
@@ -2902,6 +2928,11 @@
     
     // Set sync stopped to P&S
     RProperty::Set( KPSUidDataSynchronizationInternalKeys, KDataSyncStatus, EDataSyncNotRunning );
+  
+    if ( iRepositorySSC )
+        {
+        iRepositorySSC->Set( KNsmlOpDsSyncInitiation, EDataSyncNotRunning );
+        }
 	
 	ResetDSSessionInfoL();
 	}
@@ -2957,6 +2988,12 @@
 	TNSmlError::TNSmlSyncMLStatusCode status = STATIC_CAST( TNSmlError::TNSmlSyncMLStatusCode, iSyncMLCmds->ResponseController()->StatusCode( aEntryID ) );
 	TBool error( EFalse );
 			
+    // Store status code to cenrep if it is on the list
+    if ( iErrorReportingEnabled )
+        {
+        StoreServerStatusCode( status );
+        }
+        
 	switch ( status )
 		{
 		case TNSmlError::ESmlStatusInProgress:
@@ -4264,4 +4301,29 @@
     CleanupStack::PopAndDestroy(rep);
     }
 
+// ------------------------------------------------------------------------------------------------------------------
+// CNSmlDSAgent::StoreServerStatusCode(TInt aServerStatusCode)
+// @description This function stores Sync ML Server Status code to cenrep for Operator profile sync if matched with configured list of codes,
+//              and the same code can be used by any client for error logging.
+//              If there are multiple status codes during sync, the last server status code is stored.
+// @param aServerStatusCode Sync ML server status code while sync ongoing.
+// ------------------------------------------------------------------------------------------------------------------
+void CNSmlDSAgent::StoreServerStatusCode( TInt aServerStatusCode ) const
+    {
+    DBG_FILE(_S8("CNSmlDSAgent::StoreServerStatusCode() begins"));
+
+    if( ( iServerStatusCodeArray.Count() == 0 && 
+      ( aServerStatusCode >=  KErrorCodeRangeFirst ) && 
+      ( aServerStatusCode <=  KErrorCodeRangeLast ) ) ||
+      ( iServerStatusCodeArray.Find( aServerStatusCode ) != KErrNotFound ) )
+        {
+        TInt error = iRepositorySSC->Set( KNsmlOpDsSyncErrorCode, aServerStatusCode );
+        if ( error != KErrNone )
+            {
+            DBG_FILE(_S8("Error in storing the server status code in cenrep"));
+            }
+        }
+
+    DBG_FILE(_S8("CNSmlDSAgent::StoreServerStatusCode() ends"));
+    }
 // End of file