syncmlfw/syncmlnotifier/src/SyncMLAppLaunchNotifier.cpp
changeset 0 b497e44ab2fc
child 9 57a65a3a658c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/syncmlnotifier/src/SyncMLAppLaunchNotifier.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,821 @@
+/*
+* 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 <eikenv.h>          // Eikon environment
+#include <AknQueryDialog.h>
+#include <StringLoader.h>    // Localisation stringloader
+#include <SyncMLClientDS.h>
+#include <SyncMLClientDM.h>
+#include <SyncMLClient.h>
+#include <rconnmon.h>
+#include <centralrepository.h>
+#include <SyncMLNotifierDomainCRKeys.h>
+#include <SyncMLNotifier.rsg>           // Own resources
+#include "SyncMLAppLaunchNotifier.h"    // Class declaration
+#include "SyncMLTimedMessageQuery.h"
+#include "SyncMLTimedQueryDialog.h"
+#include "SyncMLNotifDebug.h"
+#include <aknnotewrappers.h>
+#include <DevManInternalCRKeys.h>
+#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 };
+
+
+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 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();
+        
+        // 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;
+                }            
+            }
+
+        connection.Close();
+        CleanupStack::Pop( &connection );
+        
+        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<TSyncMLAppLaunchNotifParams> 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;
+		centrep = NULL;
+    TRAPD( err, centrep = CRepository::NewL( KCRUidDeviceManagementInternalKeys) );    
+    if(err)
+    {
+    	centrep = 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<KSyncMLMaxProfileNameLength> serverName;
+            RetrieveSyncParamsL( param, serverName, uiAction );
+            stringholder = StringLoader::LoadL( R_SML_INIT_DS_SERVER_PROMPT,
+                                                serverName );
+            }
+			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 );
+
+    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"));
+    }
+
+// -----------------------------------------------------------------------------
+// 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<KSyncMLMaxProfileNameLength> 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();
+	if( keypress == EAknSoftkeyYes || keypress == EAknSoftkeyOk || silent ) // User has accepted the dialog
+  {
+		TInt retval = 1; // Default for ESyncMLSyncSession or silent
+    if ( iSmlProtocol == ESyncMLMgmtSession && !silent )
+    {
+    	CRepository* cRepository=NULL;
+			TRAPD ( error, cRepository = CRepository::NewL ( KCRUidNSmlNotifierDomainKeys ) );
+		 	if ( error == KErrNone )
+			{
+				CleanupStack::PushL( cRepository );
+				TInt dmChargingNote(1);
+				cRepository->Get ( KNSmlDMChargingNote, dmChargingNote );
+				if(dmChargingNote==1)
+				{
+			    	stringholder = StringLoader::LoadLC( R_FOTA_CONF_QUERY_CONNECTION_IS_NEEDED );
+			    	CSyncMLTimedQueryDialog* dlg = CSyncMLTimedQueryDialog::NewL( *stringholder, Timeout );			    
+			    	dlg->PrepareLC( R_SML_CONFIRMATION_QUERY );
+        		dlg->ButtonGroupContainer().SetCommandSetL( R_AVKON_SOFTKEYS_YES_NO );
+       			keypress = dlg->RunLD();
+         		if( keypress == EAknSoftkeyYes ||	keypress == EAknSoftkeyOk ) 
+         			retval = 1;
+         		else retval = 0;   
+			    	dlg = NULL;
+			    	CleanupStack::PopAndDestroy( stringholder );
+        }
+        CleanupStack::PopAndDestroy( cRepository );//cRepository
+      }
+    }
+	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:
+	              param.iServiceId = KDevManServiceStart;
+								if( SanSupport == EON )
+								{													
+	              	param.iSilent = iUimode;	                    	                               
+								}
+			          pckg.iSecureId = SyncServiceL( param.iServiceId )->StartSyncL( param );
+	              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<TSyncMLAppLaunchNotifRetVal>(pckg) );
+	  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;
+}
+//  End of File