diff -r b183ec05bd8c -r 19bba8228ff0 syncmlfw/ds/syncagent/src/nsmldsagent.cpp --- a/syncmlfw/ds/syncagent/src/nsmldsagent.cpp Tue Aug 31 16:04:06 2010 +0300 +++ b/syncmlfw/ds/syncagent/src/nsmldsagent.cpp Wed Sep 01 12:27:42 2010 +0100 @@ -22,9 +22,6 @@ #include #include #include -#include -#include -#include // common includes with DM #include "nsmlagenttestdefines.h" @@ -43,15 +40,16 @@ #include "nsmldscontent.h" #include "nsmldserror.h" #include "nsmldssettings.h" -#include "nsmldsoperatorsettings.h" #include "nsmlagentlog.h" #include "nsmlroam.h" -#include "nsmloperatorerrorcrkeys.h" +#include "NsmlOperatorErrorCRKeys.h" //RD_AUTO_RESTART #include #include #include "SyncMLErr.h" #include "nsmldsconstants.h" +#include +#include "nsmloperatordefines.h" //RD_AUTO_RESTART _LIT( KNetMon,"\\netmon.exe" ); _LIT( KAutoRestart,"netmon" ); @@ -64,9 +62,9 @@ #endif // CONSTANTS -const TInt KGranularity = 12; -const TInt KErrorCodeRangeFirst = 400; -const TInt KErrorCodeRangeLast = 516; +const TInt KNSmlDsHTTPErrCodeBase = 1400; +const TInt KNSmlDsErrCodeFirst = 400; +const TInt KNSmlDsErrCodeLast = 516; // ============================ MEMBER FUNCTIONS =============================== @@ -75,8 +73,7 @@ // C++ constructor. // ----------------------------------------------------------------------------- // -CNSmlDSAgent::CNSmlDSAgent(): - iServerStatusCodeArray ( RArray< TInt >( KGranularity ) ) +CNSmlDSAgent::CNSmlDSAgent() { } @@ -120,15 +117,6 @@ } //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 @@ -139,8 +127,16 @@ RProperty::EInt, // type KNSmlPSReadPolicy, // read policy KNSmlPSWritePolicy ); // write policy - DBG_FILE(_S8("CNSmlDSAgent::ConstructL ends")); - + + //For Syncml Status Extended Error Codes + FeatureManager::InitializeLibL(); + iIsExtendedServerErrorCodesSupported = EFalse; + if(FeatureManager::FeatureSupported(KFeatureIdFfSyncmlStatusExtendedErrorCodes)) + { + InitializeServerStatusCodeList(); + } + TRAP_IGNORE( iErrorReportingRep = CRepository::NewL( KCRUidOperatorDatasyncErrorKeys ) ); + DBG_FILE(_S8("CNSmlDSAgent::ConstructL ends")); } // ----------------------------------------------------------------------------- @@ -181,9 +177,20 @@ iDSNetmon = NULL; } //RD_AUTO_RESTART + if(iServerStatusCodeArray) + { + delete iServerStatusCodeArray; + } + if(iRepositorySSC) + { + delete iRepositorySSC; + } - iServerStatusCodeArray.Close(); - delete iRepositorySSC; + if(iErrorReportingRep) + { + delete iErrorReportingRep; + } + FeatureManager::UnInitializeLib(); } // ----------------------------------------------------------------------------- @@ -992,7 +999,7 @@ if ( !iDSContent->ClientItemCountAsked() ) { iDSContent->SetClientItemCountAsked(); - iDSObserver->OnSyncMLSyncProgress( MSyncMLProgressObserver::ESmlSendingModificationsToServer, iDSContent->ClientItemCount(), iDSContent->TaskId() ); + iDSObserver->OnSyncMLSyncProgress( MSyncMLProgressObserver::ESmlSendingModificationsToServer, iDSContent->ClientItemCount(), 0 ); } break; case CNSmlCmdsBase::EReturnBufferFull: @@ -1564,7 +1571,10 @@ iSyncMLCmds = CNSmlDSCmds::NewL( this, sessionIdString, KNSmlDSAgentVerProto12, KNSmlSyncMLPublicId12, *iSyncMLUserName, iSyncServer, *iDSContent, *iDSObserver, versionCheck ); } - TInt value(0); + TInt value(0); + if ( !iSyncMLCmds ) + User::Leave( KErrGeneral ); + TRAPD (err , ReadRepositoryL(KNSmlMaxMsgSizeKey, value)); if ( ( iMediumType == KUidNSmlMediumTypeInternet ) && ( err == KErrNone ) ) { @@ -1650,7 +1660,22 @@ iSyncHTTPAuthPassword = profile->StrValue( EDSProfileHttpAuthPassword ).AllocL(); iSyncHTTPAuthUsed = profile->IntValue( EDSProfileHttpAuthUsed ); iProtocolVer = static_cast( profile->IntValue( EDSProfileProtocolVersion ) ); - + + //For extended error code logging + if(iRepositorySSC) + { + TBuf tempStr; + //Get the Operator server ID configured in cenrep + TInt error = iRepositorySSC->Get(KNsmlOperatorProfileServerId, tempStr); + if(error == KErrNone) + { + if(tempStr.Compare(*iDSServerId)== KErrNone) + { + //Extended Server Error logging supported, set the the flag + iIsExtendedServerErrorCodesSupported = ETrue; + } + } + } // set sync started to P&S (if fails -> sync not interrupted) if ( iProtocolVer == ESmlVersion1_1_2 ) { @@ -1665,12 +1690,12 @@ EDataSyncRunning12 ); } - if ( iRepositorySSC ) - { - iRepositorySSC->Set( KNsmlOpDsSyncErrorCode, KErrNone ); - iRepositorySSC->Set( KNsmlOpDsSyncProfId, profile->IntValue( EDSProfileId ) ); - iRepositorySSC->Set( KNsmlOpDsSyncInitiation, iSyncInitiation ); - } + if ( iErrorReportingRep ) + { + iErrorReportingRep->Set( KNsmlOpDsErrorCode, KErrNone ); + iErrorReportingRep->Set( KNsmlOpDsSyncProfUid, profile->IntValue( EDSProfileId ) ); + iErrorReportingRep->Set( KNsmlOpDsSyncInitiation, iSyncInitiation ); + } TBool ifInternet = ETrue ; // CR: 403-1188 if ( iMediumType == KUidNSmlMediumTypeInternet ) @@ -1917,39 +1942,23 @@ profileUtil->AccessPointIdL(LastUsedIAPId); if(LastUsedIAPId > 0) { - //Check Whether the IAPID still exists - RCmManager cmmanager; - cmmanager.OpenL(); - CleanupClosePushL(cmmanager); - RCmConnectionMethod cm; - TRAPD(err, cm = cmmanager.ConnectionMethodL( LastUsedIAPId )); - CleanupClosePushL( cm ); - TUint32 bearer = 0; - if( err == KErrNone ) - { - bearer = cm.GetIntAttributeL( CMManager::ECmBearerType ); - DBG_FILE_CODE( bearer ,_S8("CNSmlDSAgent::ReadSettingsL, BearerType")); - if ( bearer == KUidWlanBearerType ) - { - DBG_FILE(_S8("CNSmlDSAgent::ReadSettingsL, The Access Point ID is invalid WLAN")); - iPacketDataUnAvailable = ETrue; - StopDSSession(); - } - else - { - iIAPId = LastUsedIAPId; - DBG_FILE_CODE(iIAPId , _S8("CNSmlDSAgent::ReadSettingsL, The Access Point ID Replaced from the CenRep:")); - } - } - else - { - DBG_FILE_CODE( err ,_S8("CNSmlDSAgent::ReadSettingsL, The Access Point ID is invalid")); - iPacketDataUnAvailable = ETrue; - StopDSSession(); - } - CleanupStack::PopAndDestroy( 2 ); //cmmanagerext,cm + //Check Whether the IAPID still exists + TApBearerType bearertype = CheckAPBearerTypeL(LastUsedIAPId); + if(bearertype != TApBearerType(-1)) + { + iIAPId = LastUsedIAPId; + DBG_FILE_CODE(iIAPId , _S8("CNSmlDSAgent::ReadSettingsL, The Access Point ID Replaced from the CenRep:")); + } + else + { + //Stop the DS Sync Session + DBG_FILE(_S8("CNSmlDSAgent::ReadSettingsL, The Access Point ID is invalid so stopping the session")); + iPacketDataUnAvailable = ETrue; + StopDSSession(); + } } - } + } + CleanupStack::PopAndDestroy(profileUtil); } } @@ -2895,7 +2904,10 @@ TTime time; time.UniversalTime(); + if (iError) iSyncLog->SetResult( time, iError->SyncLogErrorCode() ); + else + iSyncLog->SetResult( time, KErrGeneral ); CNSmlDSSettings* settings = CNSmlDSSettings::NewLC(); CNSmlDSProfile* profile = settings->ProfileL( iProfileID ); @@ -2929,9 +2941,9 @@ // Set sync stopped to P&S RProperty::Set( KPSUidDataSynchronizationInternalKeys, KDataSyncStatus, EDataSyncNotRunning ); - if ( iRepositorySSC ) + if ( iErrorReportingRep ) { - iRepositorySSC->Set( KNsmlOpDsSyncInitiation, EDataSyncNotRunning ); + iErrorReportingRep->Set( KNsmlOpDsSyncInitiation, EDataSyncNotRunning ); } ResetDSSessionInfoL(); @@ -2987,13 +2999,10 @@ TDesC8& cmd = iSyncMLCmds->ResponseController()->Cmd( aEntryID ); 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 ); - } - + if(iIsExtendedServerErrorCodesSupported) + { + StoreServerStatusCode(status); + } switch ( status ) { case TNSmlError::ESmlStatusInProgress: @@ -3095,11 +3104,29 @@ } //RD_SUSPEND_RESUME break; + + /* Implementation of CMCC PIM v3 begins*/ + case TNSmlError::ESmlStatusDeviceFull: // 420 + if ( FeatureManager::FeatureSupported(KFeatureIdFfTdCmccpimpromptserverfullwhenreceive420statuscodefromserver) ) + { + // CMCC server full error enabled + iDSObserver->OnSyncMLSyncError( MSyncMLProgressObserver::ESmlFatalError, SyncMLError::KErrServerFull, 0, 0, 0); + error = ETrue; + } + break; + /* Implementation of CMCC PIM v3 ends*/ default: error = ETrue; } + // Store status code to cenrep in case of error + if ( error && iErrorReportingRep + && ( status >= KNSmlDsErrCodeFirst && status <= KNSmlDsErrCodeLast ) ) + { + iErrorReportingRep->Set( KNsmlOpDsErrorCode, status ); + } + if ( cmd == KNSmlAgentSyncHdr ) { SaveIfNonceL( *iSyncMLCmds->ResponseController(), aEntryID ); @@ -3436,6 +3463,23 @@ { DBG_FILE(_S8("CNSmlDSAgent::FinaliseWhenErrorL begins")); + // Store error code to cenrep + if ( iErrorReportingRep ) + { + TInt errCode = iError->SyncLogErrorCode(); + + if ( errCode >= ( KNSmlDsHTTPErrCodeBase + KNSmlDsErrCodeFirst ) && + errCode <= ( KNSmlDsHTTPErrCodeBase + KNSmlDsErrCodeLast ) ) + { + errCode -= KNSmlDsHTTPErrCodeBase; + } + + if ( errCode >= KNSmlDsErrCodeFirst && errCode <= KNSmlDsErrCodeLast ) + { + iErrorReportingRep->Set( KNsmlOpDsErrorCode, errCode ); + } + } + // if( iDSContent->ResendUsed() ) { @@ -4302,28 +4346,90 @@ } // ------------------------------------------------------------------------------------------------------------------ +// CNSmlDSAgent::InitializeServerStatusCodeList() +// @description This function reads list of configured server status codes +// from cenrep and stores them locally in an array for later comparision during sync +// ------------------------------------------------------------------------------------------------------------------ +void CNSmlDSAgent::InitializeServerStatusCodeList() + { + DBG_FILE(_S8("CNSmlDSAgent::InitializeServerStatusCodeList() begins")); + TRAPD(error, iRepositorySSC = CRepository::NewL(KNsmlOperatorCenrepUID)); + if(error == KErrNone && iRepositorySSC!= NULL) + { + TBuf tempStr; + error = iRepositorySSC->Get(KNsmlExtendedServerStatusCodeList, tempStr); + if(error == KErrNone) + { + TInt commaPos = -1; + TInt codesCount = 0; + while ((commaPos = tempStr.Locate(',')) > KErrNotFound) + { + ++codesCount; + tempStr.Replace(commaPos,1,KSpace); + } + TRAPD(error, iServerStatusCodeArray = new (ELeave) RArray(codesCount)); + if(error == KErrNone && iServerStatusCodeArray!= NULL) + { + TLex lex(tempStr); + while(!lex.Eos()) + { + TPtrC token=lex.NextToken(); + TLex temp(token); + TInt val; + temp.Val(val); + TRAP(error, iServerStatusCodeArray->AppendL(val)); + if(error !=KErrNone) + { + DBG_FILE(_S8("Item Could not be appended to array")); + } + } + } + else + { + iServerStatusCodeArray = NULL; + DBG_FILE(_S8("Error creating iServerStatusCodeArray")); + } + } + else + { + DBG_FILE(_S8("Could not find ServerStatusCodeList Key in cenrep")); + } + } + else + { + iRepositorySSC = NULL; + DBG_FILE(_S8("Error opening cenrep to store Server Status Codes")); + } + DBG_FILE(_S8("CNSmlDSAgent::InitializeServerStatusCodeList() ends")); + } +// ------------------------------------------------------------------------------------------------------------------ // 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 +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")); - } - } - + if(iServerStatusCodeArray) + { + if(iServerStatusCodeArray->Find(aServerStatusCode) != KErrNotFound) + { + if(iRepositorySSC) + { + TInt error = iRepositorySSC->Set(KNsmlExtendedServerStatusCode, aServerStatusCode); + if (error != KErrNone) + { + DBG_FILE(_S8("Error in storing the server status code in cenrep")); + } + } + else + { + DBG_FILE(_S8("Repository for SSC could not be found")); + } + } + } DBG_FILE(_S8("CNSmlDSAgent::StoreServerStatusCode() ends")); } // End of file