diff -r b183ec05bd8c -r 19bba8228ff0 syncmlfw/syncmlnotifier/src/SyncMLAppLaunchNotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/syncmlnotifier/src/SyncMLAppLaunchNotifier.cpp Wed Sep 01 12:27:42 2010 +0100 @@ -0,0 +1,909 @@ +/* +* Copyright (c) 2005 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: Methods to parse the server alert messages for data sync and device +* Management frameworks. Launches respective application +* in appropriate conditions +* +*/ + + + +// INCLUDE FILES +#include // Eikon environment +#include +#include // Localisation stringloader +#include +#include +#include +#include +#include +#include +#include +#include // Own resources +#include "SyncMLAppLaunchNotifier.h" // Class declaration +#include "SyncMLTimedMessageQuery.h" +#include "SyncMLTimedQueryDialog.h" +#include "SyncMLNotifDebug.h" +#include +#include +#include "nsmlconstantdefs.h" +#include "CPreSyncPlugin.h" +#include "SyncMLPreSyncPluginInterface.h" + +// CONSTANTS +_LIT( KSmlNPanicCategory, "SyncMLNotifier"); + +// medium type uids +//const TUid KUidNSmlMediumTypeInternet = { 0x101F99F0 }; +const TUid KUidNSmlMediumTypeBluetooth = { 0x101F99F1 }; +const TUid KUidNSmlMediumTypeUSB = { 0x101F99F2 }; +const TUid KUidNSmlMediumTypeIrDA = { 0x101F99F3 }; +const TUid KUidSmlSyncApp = { 0x101F6DE5 }; + + +enum TASpBearerType + { + EAspBearerInternet = 0, + EAspBearerUsb = 1, + EAspBearerBlueTooth = 2, + EAspBearerIrda = 3, + EAspBearerWsp = 4, + EAspBearerSmlUsb = 5, + EAspBearerLast = 6 + }; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::CSyncMLAppLaunchNotifier +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSyncMLAppLaunchNotifier::CSyncMLAppLaunchNotifier() : + iAlwaysAsk( EFalse ) + { + iBearerType = KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CSyncMLDSNotifier::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSyncMLAppLaunchNotifier* CSyncMLAppLaunchNotifier::NewL() + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::NewL()")); + CSyncMLAppLaunchNotifier* self = new (ELeave) CSyncMLAppLaunchNotifier(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::NewL() completed")); + return self; + } + + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CSyncMLAppLaunchNotifier::~CSyncMLAppLaunchNotifier() + { + delete iObserver; + delete iDMSyncService; + delete iDSSyncService; + Cancel(); // Free own resources + } + +// ----------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::RetrieveSyncParams +// Leaves if the job identifier is not found. +// ----------------------------------------------------------------------------- +// +void CSyncMLAppLaunchNotifier::RetrieveSyncParamsL( + TSyncServiceParam& aParam, + TDes& aServerName, + TSmlServerAlertedAction& aUserInteraction ) + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RetrieveSyncParamsL()")); + TSmlJobId currentJobId; + TSmlUsageType usageType; + + // sync session + RSyncMLSession syncSession; + syncSession.OpenL(); + CleanupClosePushL( syncSession ); + syncSession.CurrentJobL( currentJobId, usageType ); + + if ( currentJobId == iJobId && + usageType == ESmlDataSync ) + { + RSyncMLDataSyncProfile syncProfile; + syncProfile.OpenL( syncSession, iProfileId, ESmlOpenRead ); + CleanupClosePushL( syncProfile ); + + aParam.iProfileId = iProfileId; + aParam.iJobId = iJobId; + aServerName = syncProfile.DisplayName(); + aUserInteraction = syncProfile.SanUserInteraction(); + + // Check if always ask is selected as accesspoint + RSyncMLConnection connection; + TRAPD( iapError, connection.OpenL( syncProfile, KUidNSmlMediumTypeInternet.iUid ) ); + CleanupClosePushL( connection ); + + if ( !iapError ) + { + const TDesC8& iap = connection.GetPropertyL( KNSmlIAPId ); + if ( iap.Compare( KNSmlAlwaysAsk() ) == 0 ) + { + iAlwaysAsk = ETrue; + } + + TInt id = connection.Identifier(); + if (id == KUidNSmlMediumTypeInternet.iUid) + { + iBearerType = EAspBearerInternet; + } + else if (id == KUidNSmlMediumTypeBluetooth.iUid) + { + iBearerType = EAspBearerBlueTooth; + } + else if (id == KUidNSmlMediumTypeUSB.iUid) + { + iBearerType = EAspBearerUsb; + } + else if (id == KUidNSmlMediumTypeIrDA.iUid) + { + iBearerType = EAspBearerIrda; + } + else + { + iBearerType = KErrNotFound; + } + } + + connection.Close(); + CleanupStack::Pop( &connection ); + + syncProfile.Close(); + CleanupStack::Pop( &syncProfile ); + } + else + { + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RetrieveSyncParamsL() Could not find job %d"), + iJobId ) ); + User::Leave( KErrNotFound ); + } + + syncSession.Close(); + CleanupStack::Pop( &syncSession ); + + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RetrieveSyncParamsL() completed, aServerName = \"%S\""), + &aServerName ) ); + } + +// ----------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::RetrieveMgmtParamsL +// Leaves if the job identifier is not found. +// ----------------------------------------------------------------------------- +// +void CSyncMLAppLaunchNotifier::RetrieveMgmtParamsL( + TSyncServiceParam& aParam, + TDes& aServerName, + TSmlServerAlertedAction& aUserInteraction ) + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RetrieveMgmtParamsL()")); + + TSmlJobId currentJobId; + TSmlUsageType usageType; + + RSyncMLSession syncSession; + + syncSession.OpenL(); + CleanupClosePushL( syncSession ); + + syncSession.CurrentJobL( currentJobId, usageType ); + + if ( currentJobId == iJobId && + usageType == ESmlDevMan ) + { + RSyncMLDevManProfile syncProfile; + syncProfile.OpenL( syncSession, iProfileId, ESmlOpenRead ); + CleanupClosePushL( syncProfile ); + + aParam.iProfileId = iProfileId; + aParam.iJobId = iJobId; + aServerName = syncProfile.DisplayName(); + aUserInteraction = syncProfile.SanUserInteraction(); + syncProfile.Close(); + CleanupStack::Pop( &syncProfile ); + } + else + { + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RetrieveMgmtParamsL() Could not find job %d"), + iJobId ) ); + User::Leave( KErrNotFound ); + } + + syncSession.Close(); + CleanupStack::Pop( &syncSession ); + + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RetrieveMgmtParamsL() completed, aServerName = \"%S\""), + &aServerName ) ); + } + +// ----------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::IsSilent +// Only automatic acception from the profile is checked, since notifier has no +// information about the preferences included in the server alert. +// ----------------------------------------------------------------------------- +// +TBool CSyncMLAppLaunchNotifier::IsSilent( + TSmlServerAlertedAction& aUserInteraction ) + { + TBool retval = EFalse; + if ( aUserInteraction == ESmlEnableSync ) + { + retval = ETrue; + } + return retval; + } + +// ----------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::RegisterL +// ----------------------------------------------------------------------------- +// +CSyncMLAppLaunchNotifier::TNotifierInfo CSyncMLAppLaunchNotifier::RegisterL() + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RegisterL()")); + iInfo.iUid = KSyncMLAppLaunchNotifierUid; + iInfo.iChannel = KSmlAppLaunchChannel; + iInfo.iPriority = ENotifierPriorityVHigh; + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RegisterL() completed")); + return iInfo; + } + +// ----------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::Cancel +// Release all own resources (member variables) +// ----------------------------------------------------------------------------- +// +void CSyncMLAppLaunchNotifier::Cancel() + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::Cancel()")); + + CSyncMLNotifierBase::Cancel(); + + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::Cancel() completed")); + } + +// ----------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::GetParamsL +// Initialize parameters and check if device is already +// in registry. Jump to RunL as soon as possible. +// ----------------------------------------------------------------------------- +// +void CSyncMLAppLaunchNotifier::GetParamsL( const TDesC8& aBuffer, + TInt aReplySlot, + const RMessagePtr2& aMessage ) + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::GetParamsL()")); + + if( iReplySlot != NULL || iNeedToCompleteMessage ) + { + User::Leave( KErrInUse ); + } + + iMessage = aMessage; + iNeedToCompleteMessage = ETrue; + iReplySlot = aReplySlot; + iAlwaysAsk = EFalse; + + TSyncMLAppLaunchNotifParams param; + TPckgC pckg( param ); + pckg.Set(aBuffer); + + iSmlProtocol = pckg().iSessionType; + iJobId = pckg().iJobId; + iProfileId = pckg().iProfileId; + TInt SanSupport( KErrNone ); +CRepository* centrep = NULL; + TRAPD( err, centrep = CRepository::NewL( KCRUidDeviceManagementInternalKeys) ); + User::LeaveIfError( err ); + centrep->Get( KDevManSANUIBitVariation, SanSupport ); + delete centrep; + if( SanSupport == EON ) + { + iUimode = pckg().iUimode; + } + // Call SetActive() so RunL() will be called by the active scheduler + // + SetActive(); + iStatus = KRequestPending; + TRequestStatus* stat = &iStatus; + User::RequestComplete( stat, KErrNone ); + + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::GetParamsL() completed, iSmlProtocol = %d, iJobId = %d, iProfileId = %d"), + iSmlProtocol, iJobId, iProfileId ) ); + } + +// ----------------------------------------------------------------------------- +// CAspSyncHandler::ReadRepositoryL +// +// ----------------------------------------------------------------------------- +// +void CSyncMLAppLaunchNotifier::ReadRepositoryL(TInt aKey, TInt& aValue) + { + CRepository* rep = CRepository::NewLC(KCRUidNSmlDSApp); + TInt err = rep->Get(aKey, aValue); + User::LeaveIfError(err); + + CleanupStack::PopAndDestroy(rep); + } + +void CSyncMLAppLaunchNotifier::ShowRoamingMessageL(TInt keypress, TUint profileId) + { + TBool roaming = EFalse; + + if( (keypress == EAknSoftkeyYes || keypress == EAknSoftkeyOk) && (iSmlProtocol == ESyncMLSyncSession) ) + { + TBool bCanSync = ETrue; + + TInt aValue = 0; + ReadRepositoryL(KNSmlDSRoamingFeature, aValue); + IsRoamingL(roaming); + if(( roaming ) && (aValue == EAspRoamingSettingFeatureEnabled)) + { + if (iBearerType == EAspBearerInternet) + { + CPreSyncPluginInterface* syncPluginInterface = CPreSyncPluginInterface::NewL(); + CPreSyncPlugin* syncPlugin = + syncPluginInterface->InstantiateRoamingPluginLC(profileId); + + // Turn lights on and deactivate apps -key + TurnLightsOn(); + SuppressAppSwitching( ETrue ); + + if(syncPlugin->IsSupported()) + { + bCanSync = syncPlugin->CanSyncL(); + } + + SuppressAppSwitching( EFalse ); + + CleanupStack::PopAndDestroy(syncPlugin); + //syncPluginInterface->UnloadPlugIns(); + delete syncPluginInterface; + + if(!bCanSync) + { + iNeedToCompleteMessage=EFalse; + iReplySlot = NULL; + iMessage.Complete( KErrCancel ); + return; + } + + } + } + } + } +// ----------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::RunL +// Ask user response and return it to caller. +// ----------------------------------------------------------------------------- +// +void CSyncMLAppLaunchNotifier::RunL() + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL()")); + stringholder =NULL; + + TLanguage language = User::Language(); + // Load the parameters and set the query text according to the session type. + switch( iSmlProtocol ) + { + case ESyncMLSyncSession: + { + FLOG( _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL() Synchronisation session") ); + + TBuf serverName; + RetrieveSyncParamsL( param, serverName, uiAction ); + stringholder = StringLoader::LoadL( R_SML_INIT_DS_SERVER_PROMPT, + serverName ); + if(!stringholder) + return; + } + break; + case ESyncMLMgmtSession: + { + TBool status = HandleDMSessionL(); + if( !status ) + return; + } + break; + default: // Unknown value + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL() unknown protocol value")); + User::Leave( KErrArgument ); // Leave handling completes the message + return; + } + } + + CleanupStack::PushL( stringholder ); + + centrep = NULL; + TRAPD( err, centrep = CRepository::NewL( KCRUidDeviceManagementInternalKeys) ); + if(err) + { + centrep = NULL; + } + + TInt keypress( 0 ); + TBool silent = EFalse; + TInt SanSupport( KErrNone ),Timeout( KErrNone),CustomNotes(KErrNone);; + if(centrep) + {centrep->Get( KDevManSANUIBitVariation, SanSupport ); + centrep->Get( KDevManServerAlertTimeout, Timeout ); + centrep->Get( KDevManUINotesCustomization, CustomNotes); + } + else + { + SanSupport = KErrNone; + Timeout = KDefaultTimeoutforNotes; + CustomNotes = KErrNone ; + } + Timeout = Timeout * 60 ;// converting to mins + delete centrep; + if(( SanSupport == EON )&& ( iSmlProtocol == ESyncMLMgmtSession)) + { + if( iUimode > ESANUserInteractive && iUimode < ESANNotSpecified ) + { + iUimode = ESANNotSpecified; + } + switch( iUimode ) + { + case ESANNotSpecified://not specified + case ESANUserInteractive://user interactive session + silent = EFalse; + break; + case ESANSilent://Background + case ESANUserInformative://Informative session + silent = ETrue;//IsSilent( uiAction ); + break; + } + } + else + { + silent = IsSilent( uiAction ); + } + if ( iAlwaysAsk && iSmlProtocol == ESyncMLMgmtSession ) //check with synergy + { + silent = EFalse; + } + if ( !silent || iAlwaysAsk ) + { + // Turn lights on and deactivate apps -key + TurnLightsOn(); + SuppressAppSwitching( ETrue ); + + CSyncMLTimedQueryDialog* dlg = + CSyncMLTimedQueryDialog::NewL( *stringholder, + Timeout ); + + // Pushed dialog is popped inside RunLD + dlg->PrepareLC( R_SML_CONFIRMATION_QUERY ); + + dlg->ButtonGroupContainer().SetCommandSetL( + R_AVKON_SOFTKEYS_YES_NO__YES ); + keypress = dlg->RunLD(); + dlg = NULL; + // Activate apps -key again + // + SuppressAppSwitching( EFalse ); + } + + CleanupStack::PopAndDestroy( stringholder ); + + ShowRoamingMessageL(keypress, param.iProfileId); + + if ( iNeedToCompleteMessage ) // Notifier is not cancelled + { + HandleCompleteMessageL(keypress, silent, SanSupport, Timeout, CustomNotes); + } + + iNeedToCompleteMessage = EFalse; + iReplySlot = NULL; + + iSmlProtocol = ESyncMLUnknownSession; + iJobId = 0; + + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL() completed")); + } + +// ---------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::RunError +// ---------------------------------------------------------------------------- +TInt CSyncMLAppLaunchNotifier::RunError ( TInt aError ) + { + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunError() The Error occurred is %d"), aError ) ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSyncMLNotifierBase::SyncServiceL +// ----------------------------------------------------------------------------- +// +CSyncService* CSyncMLAppLaunchNotifier::SyncServiceL( TUint aServiceId ) + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::SyncService")); + + if ( aServiceId == KDevManServiceStart ) + { + if ( !iDMSyncService ) + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::SyncServiceL() DM NewL")); + iDMSyncService = CSyncService::NewL( NULL, KDevManServiceStart ); + } + return iDMSyncService; + } + else + { + if ( !iDSSyncService ) + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::SyncServiceL() DS NewL")); + iDSSyncService = CSyncService::NewL( NULL, KDataSyncServiceStart ); + } + return iDSSyncService; + } + } +//------------------------------------------------------------------------------ +//CSyncMLAppLaunchNotifier::IsRoaming(TBool& ret) +//Returns true if roaming otherwise returns false + +//------------------------------------------------------------------------------ + +void CSyncMLAppLaunchNotifier::IsRoamingL(TBool &ret) + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::IsRoaming() Begin")); + RConnectionMonitor monitor; + TRequestStatus status; + // open RConnectionMonitor object + monitor.ConnectL(); + CleanupClosePushL( monitor ); + TInt netwStatus(0); + monitor.GetIntAttribute( EBearerIdGPRS, // See bearer ids from TConnMonBearerId + 0, + KNetworkRegistration, + netwStatus, + status ); + User::WaitForRequest( status ); + if ( status.Int() == KErrNone ) + { + switch(netwStatus) + { + case ENetworkRegistrationRoaming : + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::IsRoaming() ENetworkRegistrationRoaming")); + ret=true; + break; + } + default: + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::IsRoaming() Roaming status ")); + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::IsRoamingL() cell is not in roaming, network status is %d"), netwStatus ) ); + break; + } + } + CleanupStack::PopAndDestroy(); + } + else + { + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::IsRoamingL() RConnectinMonitor status.Int() returned error %d"), status.Int() ) ); + } + } +//------------------------------------------------------------------------------ +//CSyncMLAppLaunchNotifier::HandleDMSessionL() +//Handles the DM Session +//------------------------------------------------------------------------------ + +TBool CSyncMLAppLaunchNotifier::HandleDMSessionL() +{ + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::HandleDMSessionL begins")); + TBool ret(ETrue); + TInt dmroamingBlock = 0; + TBool roaming = EFalse; + TLanguage language = User::Language(); + FLOG( _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL() Management session") ); + CRepository* cRepository=NULL; + TRAPD ( error, cRepository = CRepository::NewL ( KCRUidNSmlNotifierDomainKeys ) ); + if ( error == KErrNone ) + { + CleanupStack::PushL( cRepository ); + cRepository->Get ( KNSmlDMBlockedInRoaming, dmroamingBlock ); + if(dmroamingBlock==1) + { + FLOG( _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL() roaming feature is enabled") ); + TRAPD(rError,IsRoamingL(roaming)); + if( (rError==KErrNone) && roaming ) + { + FLOG( _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL() phone is in roaming, DM session is blocked ") ); + CleanupStack::PopAndDestroy( cRepository );//cRepository + iNeedToCompleteMessage=EFalse; + iReplySlot = NULL; + ret = EFalse; + return ret; + } + else + { + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL() error in getting Network status %d"), rError ) ); + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL() error in getting Network status %d"),roaming ) ); + } + } + else + { + FLOG( _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL() DM blocking feature disabled ") ); + } + CleanupStack::PopAndDestroy( cRepository );//cRepository + } + else + { + FTRACE( FPrint( + _L("[SmlNotif]\t CSyncMLAppLaunchNotifier::RunL() cenrep creation error code %d"), + error ) ); + } + TBuf serverName; + RetrieveMgmtParamsL( param, DMSyncServerName, uiAction ); + TInt CustomNotes(KErrNone), SanSupport( KErrNone ); + CRepository* centrep = NULL; + TRAPD(err1, centrep = CRepository::NewL ( KCRUidDeviceManagementInternalKeys ) ); + if((centrep) && (err1 == KErrNone)) + { + centrep->Get( KDevManUINotesCustomization, CustomNotes); + centrep->Get( KDevManSANUIBitVariation, SanSupport ); + } + else + { + CustomNotes = 0; + SanSupport = 0; + } + delete centrep; + + if(CustomNotes && SanSupport && IsLanguageSupportedL()) + { + stringholder = StringLoader::LoadL( R_QTN_DM_QUERY_ACCEPT_POSTSALE); //This note will be shown in chinese variant itself + } + else + { + stringholder = StringLoader::LoadL( R_SML_INIT_DM_SERVER_PROMPT,DMSyncServerName ); + } + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::HandleDMSessionL ends")); + return ret; +} + +//------------------------------------------------------------------------------ +//CSyncMLAppLaunchNotifier::HandleCompleteMessageL(TInt &keypress, TBool &silent, TInt &SanSupport, TInt &Timeout, TInt &CustomNotes) +// Handle the complete message +//------------------------------------------------------------------------------ + +void CSyncMLAppLaunchNotifier::HandleCompleteMessageL(TInt &keypress, TBool &silent, TInt &SanSupport, TInt &Timeout, TInt &CustomNotes) +{ + TLanguage language = User::Language(); + TInt err = KErrNone; + _LIT_SECURITY_POLICY_S0(KWritePolicy,KUidSmlSyncApp.iUid); + _LIT_SECURITY_POLICY_C1( KReadPolicy, ECapabilityReadDeviceData ); + + if( keypress == EAknSoftkeyYes || keypress == EAknSoftkeyOk || silent ) // User has accepted the dialog + { + TInt retval = 1; // Default for ESyncMLSyncSession or silent + if( iSmlProtocol == ESyncMLMgmtSession && SanSupport == EON && silent && iUimode == ESANUserInformative ) + { + // Turn lights on and deactivate apps -key + TurnLightsOn(); + if(CustomNotes && IsLanguageSupportedL()) + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::informative session inside if ")); + stringholder = StringLoader::LoadLC(R_QTN_DM_INFO_NOTE_POSTSALE); //This note will be shown in chinese variant only + } + else + { + stringholder = StringLoader::LoadLC(R_QTN_DM_INFO_NOTE_UPDATING , DMSyncServerName ); + } + CAknInformationNote* informationNote = new (ELeave) CAknInformationNote (); + informationNote->ExecuteLD ( stringholder->Des() ); + informationNote = NULL; + CleanupStack::PopAndDestroy( stringholder ); + } + + if ( retval ) + { + const TUid KUidFakeUID = { 0 }; + TSyncMLAppLaunchNotifRetVal pckg; + pckg.iSecureId = KUidFakeUID; + + switch( iSmlProtocol ) + { + case ESyncMLSyncSession: + param.iServiceId = KDataSyncServiceStart; + break; + case ESyncMLMgmtSession: + + //Define a property for Native Disclaimer + + err = RProperty::Define(KDisclaimerProperty, KDisclaimerInteger, RProperty::EInt, KReadPolicy, KWritePolicy); + if (err != KErrAlreadyExists) + { + User::LeaveIfError(err); + } + param.iServiceId = KDevManServiceStart; + if( SanSupport == EON ) + { + param.iSilent = iUimode; + } + iObserver = new (ELeave) CDMDisclaimerObserver(); + pckg.iSecureId = SyncServiceL( param.iServiceId )->StartSyncL( param ); + FLOG(_L("[SmlNotif]\t WaitonDisclaimerL called")); + iObserver->WaitOnDisclaimerL(this); + break; + default: + // This branch should never be reached, since the option + // is handled in the previous switch statement. + User::Panic( KSmlNPanicCategory, KErrCorrupt ); + break; + } + iMessage.WriteL( iReplySlot, TPckgBuf(pckg) ); + if(iSmlProtocol == ESyncMLSyncSession) + { + iMessage.Complete(KErrNone); + + } + } + else + { + // Complete the message with result code indicating that + // the user cancelled the query. + iMessage.Complete( KErrCancel ); + } + } + else + { + // Complete the message with result code indicating that + // the user cancelled the query. + iMessage.Complete( KErrCancel ); + } +} + +// ----------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::IsLanguageSupportedL +// Returns True if the specified language is supported. +// ----------------------------------------------------------------------------- +// +TBool CSyncMLAppLaunchNotifier::IsLanguageSupportedL() +{ + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::IsLanguageSupportedL begins")); + TBool retVal(EFalse); + TLanguage language = User::Language(); + if(language == ELangEnglish || language == ELangInternationalEnglish || + language == ELangTaiwanChinese ||language == ELangHongKongChinese || language == ELangPrcChinese) + retVal = ETrue; + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::IsLanguageSupportedL ends")); + return retVal; +} +// ----------------------------------------------------------------------------- +// CSyncMLAppLaunchNotifier::CompleteMessageL +// Completes the message according to whether Privacy Policy disclaimer is accepted +// ----------------------------------------------------------------------------- +// +void CSyncMLAppLaunchNotifier::CompleteMessageL(TInt aDisclaimerAccepted) + { + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::CompleteMessageL begins")); + if(aDisclaimerAccepted == 1) + { + iMessage.Complete(KErrNone); + } + else + { + iMessage.Complete(KErrCancel); + } + FLOG(_L("[SmlNotif]\t CSyncMLAppLaunchNotifier::CompleteMessageL Ends")); + } + +//--------------------------------------------------------------------------------- +// CDMDisclaimerObserver::CDMDisclaimerObserver +// Constructor +//--------------------------------------------------------------------------------- +CDMDisclaimerObserver::CDMDisclaimerObserver() +: CActive(0) + { + CActiveScheduler::Add(this); + } + +//--------------------------------------------------------------------------------- +// CDMDisclaimerObserver::~CDMDisclaimerObserver +// Destructor +//--------------------------------------------------------------------------------- +CDMDisclaimerObserver::~CDMDisclaimerObserver() + { + Cancel(); + iDisclaimerProperty.Close(); + } + +//--------------------------------------------------------------------------------- +// CDMDisclaimerObserver::WaitOnDisclaimerL +// Subscribes to Property set when Privacy policy disclaimer is accepted +//--------------------------------------------------------------------------------- +void CDMDisclaimerObserver::WaitOnDisclaimerL( CSyncMLAppLaunchNotifier* aPtr) + { + FLOG(_L("[SmlNotif]\t CDMDisclaimerObserver::WaitOnDisclaimerL begins")); + iNot = aPtr; + // subscribe; + if(!IsActive()) + { + TInt err= iDisclaimerProperty.Attach(KDisclaimerProperty, KDisclaimerInteger, EOwnerThread); + //User::LeaveIfError(err); + iStatus=KRequestPending; + iDisclaimerProperty.Subscribe(iStatus); + SetActive(); + } + FLOG(_L("[SmlNotif]\t CDMDisclaimerObserver::WaitOnDisclaimerL ends")); + } + +// -------------------------------------------------------------------------- +// CDMDisclaimerObserver::DoCancel() +// From base class +// -------------------------------------------------------------------------- +// +void CDMDisclaimerObserver::DoCancel() + { + if( iStatus == KRequestPending ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrCancel ); + } + } +// -------------------------------------------------------------------------- +// CDMDisclaimerObserver::RunL() +// Calls CompleteMessageL +// -------------------------------------------------------------------------- +// +void CDMDisclaimerObserver::RunL() + { + FLOG(_L("[SmlNotif]\t CDMDisclaimerObserver::RunL begins")); + iDisclaimerProperty.Get(iPropertyVal); + + iNot->CompleteMessageL(iPropertyVal); + + FLOG(_L("[SmlNotif]\t CDMDisclaimerObserver::RunL End")); + } + +// -------------------------------------------------------------------------- +// CDMDisclaimerObserver::RunError() +// -------------------------------------------------------------------------- +// +TInt CDMDisclaimerObserver::RunError(TInt aError) + { + FTRACE( FPrint( _L("[SmlNotif]\t CDMDisclaimerObserver::RunError() Error = %d"), aError ) ); + return KErrNone; + } + +// End of File