bearermanagement/mpm/src/mpmserversession.cpp
branchRCL_3
changeset 58 83ca720e2b9a
parent 57 05bc53fe583b
child 65 14754bf06654
--- a/bearermanagement/mpm/src/mpmserversession.cpp	Tue Aug 31 15:35:44 2010 +0300
+++ b/bearermanagement/mpm/src/mpmserversession.cpp	Wed Sep 01 12:23:51 2010 +0100
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2004-2010 Nokia Corporation and/or its subsidiary(-ies). 
+* Copyright (c) 2004-2009 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"
@@ -38,10 +38,13 @@
 #include "mpmcommsdataccess.h"
 #include "mpmserversession.h"
 #include "mpmconnmonevents.h"
+#include "mpmdialog.h"
+#include "mpmdisconnectdlg.h"
 #include "mpmconfirmdlgstarting.h"
 #include "mpmconfirmdlgroaming.h"
 #include "mpmlogger.h"
 #include "mpmpropertydef.h"
+#include "mpmdefaultconnection.h"
 #include "mpmiapselection.h"
 #include "mpmcsidwatcher.h"
 
@@ -68,20 +71,12 @@
 CMPMServerSession::CMPMServerSession(CMPMServer& aServer)
     : CSession2(), 
       iMyServer( aServer ),
+      iDisconnectDlg( NULL ),
       iConfirmDlgRoaming( NULL ),
-      iConnId( 0 ),
-      iNotifRequested( EFalse ),
-      iPreferredIAPRequested( EFalse ),
-      iOfflineFeatureSupported( EFalse ),
-      iEasyWlanIap( 0 ),
-      iAppUid( 0 ),
       iStoredIapInfo(),
       iIapSelection( NULL ),
       iMigrateState( EMigrateNone ),
-      iLastNotifiedIap( 0 ),
-      iMigrateIap( 0 ),
-      iUserConnection( 0 ),
-      iVpnUserConnectionUsed( EFalse ),
+      iDisconnectDialogShown( EFalse ),
       iErrorDiscreetPopupShown( EFalse )
     {
     }
@@ -96,7 +91,7 @@
     MPMLOGSTRING( "CMPMServerSession::ConstructL" )
     if ( !iMyServer.Events() )
         {
-        iMyServer.SetEvents(CMPMConnMonEvents::NewL(
+        iMyServer.SetEvents( CMPMConnMonEvents::NewL(
             *const_cast<CMPMServer*>( &iMyServer ) ) );
         }
 
@@ -112,37 +107,40 @@
 //
 CMPMServerSession::~CMPMServerSession()
     {
-    delete iConfirmDlgRoaming;
-    delete iIapSelection;
+
 
     // Remove serverside objects for notification session.
     // 
     iMyServer.RemoveSession( this );
 
-    if (VpnUserConnectionUsed())
-        {
-        SetVpnUserConnectionUsed( EFalse );
-    
-    MPMLOGSTRING( "CMPMServerSession::~CMPMServerSession -\
- VPN user connection usage ended" )    
-        }
-    else if (UserConnection())
+    if (UserConnection())
         {
         iMyServer.ClearUserConnection();
         ClearUserConnection();
         
-        MPMLOGSTRING( "CMPMServerSession::~CMPMServerSession -\
+        // Set PS keys to zero
+        RProperty::Set( KMPMUserConnectionCategory,
+                        KMPMPSKeyUserConnectionSnap,
+                        0 );
+        
+        RProperty::Set( KMPMUserConnectionCategory,
+                        KMPMPSKeyUserConnectionIap,
+                        0 );
+        
+        MPMLOGSTRING( "CMPMServerSession::HandleServerApplicationConnectionEnds -\
 User connection deactivated" )
         }   
 
     // Clean up the blacklist table 
     iMyServer.HandleServerUnblackListIap( iConnId, 0 );
-
+    
     // Make sure the connection is removed from server's information array.
     iMyServer.RemoveBMConnection( iConnId, *this );
-    
-    // Cancel discreet popup
-    iMyServer.ConnUiUtils()->CancelConnectingViaDiscreetPopup();
+
+    delete iDisconnectDlg;
+    delete iConfirmDlgRoaming;
+    delete iIapSelection;
+
     }
 
 
@@ -424,7 +422,16 @@
         if ( ! ( mpmConnPref.NoteBehaviour() &
             TExtendedConnPref::ENoteBehaviourConnDisableNotes ) )
             {
-            iMyServer.ConnUiUtils()->ConnectionErrorDiscreetPopup( error );
+            CConnectionUiUtilities* connUiUtils = NULL;
+        
+            TRAP_IGNORE( connUiUtils = CConnectionUiUtilities::NewL() );
+            
+            if ( connUiUtils )
+                {
+                connUiUtils->ConnectionErrorDiscreetPopup( error );
+                delete connUiUtils;
+                connUiUtils = NULL;
+                }
             }    	
         	
         MPMLOGSTRING( "CMPMServerSession::HandleServerChooseIapL - Error \
@@ -434,34 +441,23 @@
         }
 
     // Store the Uid of the application to the member variable so 
-    // that it can be used when AlwaysOnline connection is being established.
+    // that it can be used to avoid DisconnectDialog popping up when 
+    // AlwaysOnline connection is being established.
     // 
     iAppUid = aMessage.Int2();
 
+    MPMLOGSTRING2( "CMPMServerSession::HandleServerChooseIapL: \
+Client UID = 0x%x", iAppUid )
+
     if ( !iIapSelection )
         {
         iIapSelection = CMPMIapSelection::NewL( iMyServer.CommsDatAccess(),
-                                                this,
-                                                iMyServer.ConnUiUtils() ); 
+                                                this ); 
         }
     
     MPMLOGSTRING3( "CMPMServerSession::HandleServerChooseIapL - iap %d \
 connType %d", mpmConnPref.IapId(), mpmConnPref.ConnType() )
 
-
-    if ( iMyServer.UseVpnUserConnection(mpmConnPref,
-                                        AppUid()) )
-        {
-        // VPN user connection needs to be used.
-        TBool prepareOk = iMyServer.PrepareVpnUserConnection( mpmConnPref );
-        if ( prepareOk )
-            {
-            SetVpnUserConnectionUsed( ETrue );
-            MPMLOGSTRING( "CMPMServerSession::HandleServerChooseIapL -\
- VPN user connection used" )                    
-            }
-        }
-            
     iIapSelection->ChooseIapL( mpmConnPref );
 
     if ( iAppUid == iMyServer.CsIdWatcher()->ConnectScreenId() )
@@ -473,6 +469,16 @@
         iMyServer.SetUserConnection();
         SetUserConnection();
         iMyServer.SetUserConnPref( mpmConnPref );
+        
+        // Set PS keys according to user connection
+        // Do not check return values. Can do nothing in case of failing.
+        RProperty::Set( KMPMUserConnectionCategory,
+                        KMPMPSKeyUserConnectionSnap,
+                        mpmConnPref.SnapId() );
+        
+        RProperty::Set( KMPMUserConnectionCategory,
+                        KMPMPSKeyUserConnectionIap,
+                        mpmConnPref.IapId() );
         }
     }
 
@@ -529,6 +535,13 @@
             //
             TRAP_IGNORE( iMyServer.Events()->CancelScanL( this ) )
 
+            if ( iDisconnectDlg )
+                {
+                MPMLOGSTRING( "CMPMServerSession::HandleServerCancelRequest: \
+removing dconn dlg" )
+                delete iDisconnectDlg;
+                iDisconnectDlg = NULL;
+                }
             return;
             }
         case EMPMWaitNotification:
@@ -547,7 +560,7 @@
                 // TODO Change CancelScanL to non-leaving.
                 // Otherwise, nothing clever can be done here.
                 // And OOM may risk MPM stability.
-                TRAP_IGNORE( iMyServer.Events()->CancelScanL( this ))
+                TRAP_IGNORE( iMyServer.Events()->CancelScanL( this ) )
                 iServerSortSNAPMessage.Complete( KErrCancel );
                 }
             break;
@@ -697,11 +710,8 @@
     // Complete the message as soon as possible to avoid latency in BM
     // 
     aMessage.Complete( KErrNone );
-    
-    iMyServer.ConnUiUtils()->CancelConnectingViaDiscreetPopup();
     }
 
-
 // -----------------------------------------------------------------------------
 // CMPMServerSession::HandleServerIapConnectionStopped
 // -----------------------------------------------------------------------------
@@ -740,18 +750,20 @@
     //
     TConnectionId endId = aMessage.Int0();
 
-    if (VpnUserConnectionUsed())
-        {
-        SetVpnUserConnectionUsed( EFalse );
-
-        MPMLOGSTRING( "CMPMServerSession::HandleServerApplicationConnectionEnds -\
- VPN user connection usage ended" )    
-        }
-    else if (UserConnection())
+    if (UserConnection())
         {
         iMyServer.ClearUserConnection();
         ClearUserConnection();
         
+        // Set PS keys to zero
+        RProperty::Set( KMPMUserConnectionCategory,
+                        KMPMPSKeyUserConnectionSnap,
+                        0 );
+        
+        RProperty::Set( KMPMUserConnectionCategory,
+                        KMPMPSKeyUserConnectionIap,
+                        0 );
+        
         MPMLOGSTRING( "CMPMServerSession::HandleServerApplicationConnectionEnds -\
 User connection deactivated" )
         }   
@@ -805,8 +817,8 @@
 
     // check whether a started connection exists which already 
     // uses this IAP. If so, it won't need to be confirmed again
-    // 
-    if( iMyServer.CheckIfStarted( aIapId, iConnId ) )
+    //
+    if ( iMyServer.CheckUsageOfIap( aIapId, iConnId ) == EStarted )
         {
         MPMLOGSTRING(
         "CMPMServerSession::IsConfirmFirstL - IAP already started, \
@@ -836,6 +848,21 @@
         {
         MPMLOGSTRING( "CMPMServerSession::IsConfirmFirstL - True" )
         isConfirmFirst = ETrue;
+
+        // iDisconnectDialogShown is set when disconnect dialog is shown.
+        // Before the disconnect dialog is shown, data usage confirmation
+        // dialog is already shown for the new PDP context. If you choose
+        // to disconnect the active PDP context then data usage dialog is
+        // shown again for the new context. So, set isConfirmFirst to
+        // False to avoid duplicate cellular confirm dialog
+        //
+        if ( iDisconnectDialogShown )
+            {
+            MPMLOGSTRING( "CMPMServerSession::IsConfirmFirstL  - False; Data \
+confirmation dialog already shown this IAP" )
+            isConfirmFirst = EFalse;
+            iDisconnectDialogShown = EFalse;
+            }
         }
     else 
         {
@@ -916,7 +943,7 @@
             // Check that connection preferences don't deny queries, and
             // enough time has elapsed from the last query cancelled by the user.
             if ( !( iIapSelection->MpmConnPref().NoteBehaviour() & TExtendedConnPref::ENoteBehaviourConnDisableQueries ) &&
-                 !MyServer().IsConnPermQueryTimerOn() )
+                    !MyServer().IsConnPermQueryTimerOn() )
                 {
                 if ( MyServer().RoamingWatcher()->RoamingStatus() == EMPMInternationalRoaming )
                     {
@@ -977,6 +1004,10 @@
 	    if( aError == KErrNone )
 	        {
 	        iMigrateState = EMigrateOfflineConfirmation;
+    	    if( IapSelectionL()->StartWlanQueryIfNeededL( iMigrateIap, ETrue ) )
+	            {
+	            return;
+                }
 	        }
 	    }
 	else if( iMigrateState == EMigrateOfflineConfirmation )
@@ -1396,21 +1427,56 @@
         return;
         }
 
+    // Read the Connection Id of the application
+    // 
+    TConnectionId connId = iProcessErrorMessage.Int1();
+    
+    MPMLOGSTRING3( "CMPMServerSession::HandleServerProcessErrorL \
+- error code = %i, Connection Id = 0x%x", error, connId )
+
     if ( !ChooseBestIapCalled() )
         {
         MPMLOGSTRING( "CMPMServerSession::HandleServerProcessErrorL - \
-Warning: ChooseBestIap has not been called yet" )
-        TBMNeededAction neededAction( EPropagateError );
-        ProcessErrorComplete( KErrNone, &error, &neededAction );
+ChooseBestIap has not been called yet" )
+
+        // If it is not disconnect dialog error then complete message. 
+        // If it is then leave message pending and it will be completed when 
+        // disconnect dialog completes in other session.
+        if ( !DisconnectDlgErrorCode( error ) )
+            {
+            TBMNeededAction neededAction( EPropagateError );
+            ProcessErrorComplete( KErrNone, &error, &neededAction );
+            }
+        else
+            {
+            MPMLOGSTRING( "Disconnect dlg error - leave msg pending" );
+            }
         return;
         }
-    
-    // Read the Connection Id of the application
-    // 
-    TConnectionId connId = iProcessErrorMessage.Int1();
-
-    MPMLOGSTRING3( "CMPMServerSession::HandleServerProcessErrorL\
- - error code = %i, Connection Id = 0x%x", error, connId )
+
+    // Show error popup if it's allowed per client request
+    // Don't show the pop up if error code is for disconnect dialog
+    //
+    if ( !( iIapSelection->MpmConnPref().NoteBehaviour() &
+            TExtendedConnPref::ENoteBehaviourConnDisableNotes ) &&
+         !DisconnectDlgErrorCode( error ) )
+        {
+        CConnectionUiUtilities* connUiUtils = NULL;
+        TRAPD( popupCreateError, connUiUtils = CConnectionUiUtilities::NewL() );
+        if ( popupCreateError == KErrNone && connUiUtils )
+            {
+            // Note: Below function shows the discreet popup only if the error code
+            // belongs to the set of errors that are shown to the user.
+            // Otherwise the popup is not shown.
+            connUiUtils->ConnectionErrorDiscreetPopup( error );
+            delete connUiUtils;
+            connUiUtils = NULL;
+            
+            // Error discreet popup has been shown. This is needed so that we
+            // dont show it again for SNAP.
+            iErrorDiscreetPopupShown = ETrue;
+            }
+        }
 
     // Get the current connection IapId for this connId 
     //
@@ -1420,29 +1486,6 @@
     //
     TUint32 snapId = iMyServer.GetBMSnap( connId );
 
-    // The popup is shown if the connection is not silent and the
-    // error is something else than a disconnect dialog error code.
-    // The popup is also shown if the connection is silent and the
-    // error is a disconnect dlg error, a background application 
-    // is not in question, a MMS IAP is not
-    // in question, and a started connection does not exist.
-    TBool silent = iIapSelection->MpmConnPref().NoteBehaviour() &
-                TExtendedConnPref::ENoteBehaviourConnDisableNotes;
-    if ( !silent && ( !DisconnectDlgErrorCode( error ) ||
-            ( !IsBackgroundApplication( iAppUid ) &&
-            !IsMMSIap( currentIap ) && 
-            iMyServer.StartedConnectionExists() != KErrNotFound ) ) )
-        {
-        // Note: Below function shows the discreet popup only if the error code
-        // belongs to the set of errors that are shown to the user.
-        // Otherwise the popup is not shown.
-        iMyServer.ConnUiUtils()->ConnectionErrorDiscreetPopup( error );
-        
-        // Error discreet popup has been shown. This is needed so that we
-        // dont show it again for SNAP.
-        iErrorDiscreetPopupShown = ETrue;
-        }  
-
     TConnMonIapInfo availableIAPs;
     availableIAPs = GetAvailableIAPs();
 
@@ -1454,8 +1497,6 @@
     // 
     TConnectionState state;
     iMyServer.GetConnectionState( connId, state );
-    MPMLOGSTRING2(
-        "CMPMServerSession::HandleServerProcessErrorL - state %d", state )
 
     // We need to blacklist the presumed IAP too
     // 
@@ -1466,213 +1507,256 @@
     // 
     iMyServer.Events()->ResetIapConnInfo( currentIap );
 
+    // Check if IAP is reported by MMS
+    //
+    TBool isMMSIap = IsMMSIap( currentIap );
+    if ( isMMSIap )
+        {
+        MPMLOGSTRING( "CMPMServerSession::HandleServerProcessErrorL\
+        - DisconnectDialog is not started because of MMS reported IAP" )
+        }
+
     TInt* returnError( NULL );
-    switch ( state )
+    if ( ( state == EStarting ) || ( state == ERoaming ) )
         {
-        case EStarting: 
-            if ( ( snapId == 0 ) || ( error == KErrCancel ) )
+        // Process error according to the fact that the connection 
+        // has not yet been started.
+        // 
+        if ( DisconnectDlgErrorCode( error ) &&
+             !IsBackgroundApplication( iAppUid ) &&
+             !isMMSIap && 
+             iIapSelection->MpmConnPref().DisconnectDialog() &&
+             iMyServer.StartedConnectionExists() != KErrNotFound )
+            {
+            // Start the Disconnect dialog
+            // 
+            MPMLOGSTRING( "CMPMServerSession::HandleServerProcessErrorL\
+ - Start Disconnect dialog" )
+            iDisconnectDlg = CMPMDisconnectDlg::NewL( *const_cast<CMPMServerSession*>(this),
+                                                      error,
+                                                      *MyServer().DisconnectQueue() );
+            iDisconnectDialogShown = ETrue;
+            return;
+            }
+        else
+            {
+            MPMLOGSTRING( "CMPMServerSession::HandleServerProcessErrorL - \
+Error not handled with disconnect dialog" )
+
+            if ( state == EStarting ) 
                 {
-                neededAction = EPropagateError;
-
-                MPMLOGSTRING(
-                    "CMPMServerSession::HandleServerProcessErrorL - \
-                Tell BM to end the client connection with appropriate error code" )
+                if ( ( snapId == 0 ) || ( error == KErrCancel ) )
+                    {
+                    neededAction = EPropagateError;
+
+                    MPMLOGSTRING(
+                        "CMPMServerSession::HandleServerProcessErrorL - \
+Tell BM to end the client connection with appropriate error code" )
+                    }
+                else
+                    {
+                    neededAction = EDoReselection;
+
+                    MPMLOGSTRING(
+                        "CMPMServerSession::HandleServerProcessErrorL - \
+Tell BM to ignore error and do reselection" )
+
+                    iMyServer.HandleServerBlackListIap( connId, 
+                                                        currentIap, 
+                                                        ETemporary );
+                    if ( ( presumedIap != 0 ) && 
+                         ( presumedIap != currentIap ) )
+                        {
+                        iMyServer.HandleServerBlackListIap( connId, 
+                                                            presumedIap, 
+                                                            ETemporary );
+                        }
+                    }
                 }
-            else
+            else if ( state == ERoaming ) 
                 {
-                neededAction = EDoReselection;
-
-                MPMLOGSTRING(
-                    "CMPMServerSession::HandleServerProcessErrorL - \
-                Tell BM to ignore error and do reselection" )
+                // ERoaming means commsfw stack is moving to new IAP and failed.
+                // Hence, MPM should mark to current iap as zero. 
+                //
+                iMyServer.ResetBMConnection( iConnId, currentIap, *this );
+                
+                // Notification will be sent with latest 
+                // availability info
+                //
+                iStoredIapInfo.ResetStoredIapInfo();
+
+                neededAction = EIgnoreError;
 
                 iMyServer.HandleServerBlackListIap( connId, 
                                                     currentIap, 
                                                     ETemporary );
                 if ( ( presumedIap != 0 ) && 
-                    ( presumedIap != currentIap ) )
+                     ( presumedIap != currentIap ) )
                     {
                     iMyServer.HandleServerBlackListIap( connId, 
                                                         presumedIap, 
                                                         ETemporary );
                     }
-                }
-            // Error might be different from KErrNone if there 
-            // is no preferred IAP among the available IAPs.
-            // 
-            ProcessErrorComplete( KErrNone,
-                                  returnError,
-                                  &neededAction );
-            break;
-            
-        case ERoaming: 
-            // ERoaming means commsfw stack is moving to new IAP and failed.
-            // Hence, MPM should mark to current iap as zero. 
-            //
-            iMyServer.ResetBMConnection( iConnId, currentIap, *this );
-                
-            // Notification will be sent with latest 
-            // availability info
-            //
-            iStoredIapInfo.ResetStoredIapInfo();
-            
-            neededAction = EIgnoreError;
-
-            iMyServer.HandleServerBlackListIap( connId, 
-                                                currentIap, 
-                                                ETemporary );
-            if ( ( presumedIap != 0 ) && 
-                ( presumedIap != currentIap ) )
-                {
-                iMyServer.HandleServerBlackListIap( connId, 
-                                                    presumedIap, 
-                                                    ETemporary );
-                }
-            TRAP( error, PrefIAPNotificationL( availableIAPs, 
+                TRAP( error, PrefIAPNotificationL( availableIAPs, 
                                                    EBearerMan ) );
-            if ( error == KErrNotFound )
-                {
-                neededAction = EPropagateError;
-
-                returnError = &error;
-
-                TRAP_IGNORE( ErrorNotificationL( KErrNotFound, 
-                                                EMPMMobilityErrorNotification ) );
-                MPMLOGSTRING(
-                    "CMPMServerSession::HandleServerProcessErrorL - \
-                Tell BM to end the client connection with appropriate error code" )
+                if ( error == KErrNotFound )
+                    {
+                    neededAction = EPropagateError;
+
+                    returnError = &error;
+
+                    TRAP_IGNORE( ErrorNotificationL( KErrNotFound, 
+                                                     EMPMMobilityErrorNotification ) );
+                    MPMLOGSTRING(
+                        "CMPMServerSession::HandleServerProcessErrorL - \
+Tell BM to end the client connection with appropriate error code" )
+                    }
+                else
+                    {
+                    MPMLOGSTRING(
+                        "CMPMServerSession::HandleServerProcessErrorL - \
+Tell BM to ignore error and let MPM notify application about preferred IAP" )
+                    }
                 }
             else
                 {
-                MPMLOGSTRING(
+                MPMLOGSTRING2(
                     "CMPMServerSession::HandleServerProcessErrorL - \
-                Tell BM to ignore error and let MPM notify application about preferred IAP" )
+Unknown state %d", state )
                 }
-            
+
             // Error might be different from KErrNone if there 
             // is no preferred IAP among the available IAPs.
             // 
             ProcessErrorComplete( KErrNone,
                                   returnError,
                                   &neededAction );
-            break;
-      
-        case EStarted:
-            // Process error according to the fact that the connection 
-            // has already been started.
-            // KErrConnectionTerminated is received when user disconnects
-            // connection from Settings/Connection mgr.
-            //         
-            if ( ( error == KErrCancel ) || ( error == KErrTimedOut ) || ( error == KErrConnectionTerminated ) )
+            
+            iMyServer.HandlePendingMsgs( currentIap,
+                                         KErrNone,
+                                         returnError,
+                                         &neededAction );
+            return;
+            }
+        }
+    else if ( state == EStarted )
+        {
+        // Process error according to the fact that the connection 
+        // has already been started.
+        // KErrConnectionTerminated is received when user disconnects
+        // connection from Settings/Connection mgr.
+        //       
+        if ( ( error == KErrCancel ) || ( error == KErrTimedOut ) || ( error == KErrConnectionTerminated )
+                || ( error == KErrDisconnected && iMyServer.IsPhoneOffline() ) )
+            {
+            neededAction = EPropagateError;
+
+            MPMLOGSTRING(
+                "CMPMServerSession::HandleServerProcessErrorL - \
+Tell BM to end the client connection with appropriate error code" )
+
+            // Send error notification. 
+            // Not sent if connection not registered
+            // 
+            TRAP_IGNORE( ErrorNotificationL( error,
+                                             EMPMMobilityErrorNotification ) )
+            }
+        else if ( iPreferredIAPRequested )
+            {
+            // IAP connection
+            //
+            if( snapId == 0 )
                 {
                 neededAction = EPropagateError;
-
+    
                 MPMLOGSTRING(
                     "CMPMServerSession::HandleServerProcessErrorL - \
-                    Tell BM to end the client connection with appropriate error code" )
-
-                // Send error notification. 
-                // Not sent if connection not registered
-                // 
-                TRAP_IGNORE( ErrorNotificationL( error,
-                                             EMPMMobilityErrorNotification ) )
+Tell BM to end the client connection with appropriate error code" )
+
+                TRAP_IGNORE( ErrorNotificationL( KErrNotFound,
+                                                 EMPMMobilityErrorNotification ) )
                 }
-            else if ( iPreferredIAPRequested )
+            // SNAP connection
+            //
+            else
                 {
-                // IAP connection
+                // If this has been WLAN IAP and the SNAP contains 
+                // other WLAN IAPs, we need to perform WLAN scan before
+                // knowing the availability of those
                 //
-                if( snapId == 0 )
+                RArray<TUint> iapPath;
+                CleanupClosePushL( iapPath );
+
+                iMyServer.HandleServerBlackListIap( connId, 
+                                                    currentIap, 
+                                                    ETemporary );
+                if ( ( presumedIap != 0 ) && 
+                     ( presumedIap != currentIap ) )
+                    {
+                    iMyServer.HandleServerBlackListIap( connId, 
+                                                        presumedIap, 
+                                                        ETemporary );
+                    }
+
+                // current iap is either WLAN or EasyWlan
+                // 
+                if( ( iMyServer.CommsDatAccess()->CheckWlanL( currentIap ) != ENotWlanIap ) && 
+                      iMyServer.CommsDatAccess()->SnapContainsWlanL( snapId, iapPath, KMPMNrWlansTwo ) )
                     {
+                    // perform WLAN scan 
+                    // message is completed in callback function 
+                    // ProcessErrorWlanScanCompletedL
+                    // 
+                    iMyServer.Events()->ScanWLANNetworksL( this, 
+                                                           ConnectionId(), 
+                                                           EWlanScanCallbackProcessErr );
+                    CleanupStack::PopAndDestroy( &iapPath );
+                    return;
+                    }
+
+                CleanupStack::PopAndDestroy( &iapPath );
+                neededAction = EIgnoreError;
+
+                TRAPD( err2, PrefIAPNotificationL( availableIAPs, EBearerMan ) );
+                if ( err2 == KErrNotFound )
+                    {
+                    error = err2;
                     neededAction = EPropagateError;
-    
-                    MPMLOGSTRING(
-                        "CMPMServerSession::HandleServerProcessErrorL - \
-                        Tell BM to end the client connection with appropriate error code" )
 
                     TRAP_IGNORE( ErrorNotificationL( KErrNotFound,
                                                      EMPMMobilityErrorNotification ) )
+                    MPMLOGSTRING(
+                        "CMPMServerSession::HandleServerProcessErrorL - \
+Tell BM to end the client connection with appropriate error code" )   
                     }
-                // SNAP connection
-                //
                 else
                     {
-                    // If this has been WLAN IAP and the SNAP contains 
-                    // other WLAN IAPs, we need to perform WLAN scan before
-                    // knowing the availability of those
-                    //
-                    RArray<TUint> iapPath;
-                    CleanupClosePushL( iapPath );
-
-                    iMyServer.HandleServerBlackListIap( connId, 
-                                                    currentIap, 
-                                                    ETemporary );
-                    if ( ( presumedIap != 0 ) && 
-                        ( presumedIap != currentIap ) )
-                        {
-                        iMyServer.HandleServerBlackListIap( connId, 
-                                                        presumedIap, 
-                                                        ETemporary );
-                        }
-
-                    // current iap is WLAN
-                    // 
-                    if( ( iMyServer.CommsDatAccess()->CheckWlanL( currentIap ) != ENotWlanIap ) && 
-                        iMyServer.CommsDatAccess()->SnapContainsWlanL( snapId, iapPath, KMPMNrWlansTwo ) )
-                        {
-                        // perform WLAN scan 
-                        // message is completed in callback function 
-                        // ProcessErrorWlanScanCompletedL
-                        // 
-                        iMyServer.Events()->ScanWLANNetworksL( this, 
-                                                           ConnectionId(), 
-                                                           EWlanScanCallbackProcessErr );
-                        CleanupStack::PopAndDestroy( &iapPath );
-                        return;
-                        }
-
-                    CleanupStack::PopAndDestroy( &iapPath );
-                    neededAction = EIgnoreError;
-
-                    TRAPD( err2, PrefIAPNotificationL( availableIAPs, EBearerMan ) );
-                    if ( err2 == KErrNotFound )
-                        {
-                        error = err2;
-                        neededAction = EPropagateError;
-
-                        TRAP_IGNORE( ErrorNotificationL( KErrNotFound,
-                                                         EMPMMobilityErrorNotification ) )
-                        MPMLOGSTRING(
-                            "CMPMServerSession::HandleServerProcessErrorL - \
-                            Tell BM to end the client connection with appropriate error code" )   
-                        }
-                    else
-                        {
-                        MPMLOGSTRING(
-                            "CMPMServerSession::HandleServerProcessErrorL - \
-                            Tell BM to ignore error and let MPM notify application about preferred IAP" )
-                        }
+                    MPMLOGSTRING(
+                        "CMPMServerSession::HandleServerProcessErrorL - \
+Tell BM to ignore error and let MPM notify application about preferred IAP" )
                     }
                 }
-            else
-                {
-                neededAction = EPropagateError;
-
-                MPMLOGSTRING(
-                    "CMPMServerSession::HandleServerProcessErrorL - \
-                    Tell BM to end the client connection with appropriate error code" )
-
-                }
-            ProcessErrorComplete( KErrNone, &error, &neededAction );
-            break;
-            
-        default:
-            MPMLOGSTRING2(
-                "CMPMServerSession::HandleServerProcessErrorL Unknown state %d",
-                state )
-            ProcessErrorComplete( KErrCorrupt,
-                                  NULL,
-                                  NULL );
-            break;
+            }
+        else
+            {
+            neededAction = EPropagateError;
+
+            MPMLOGSTRING(
+                "CMPMServerSession::HandleServerProcessErrorL - \
+Tell BM to end the client connection with appropriate error code" )
+
+            }
+        ProcessErrorComplete( KErrNone, &error, &neededAction );
+        
+        }
+    else
+        {
+        MPMLOGSTRING2(
+            "CMPMServerSession::HandleServerProcessErrorL Unknown state %d",
+            state )
+        ProcessErrorComplete( KErrCorrupt,
+                              NULL,
+                              NULL );
         }
     }
 
@@ -2189,6 +2273,18 @@
     }
 
 // -----------------------------------------------------------------------------
+// CMPMServerSession::UpdateConnectionDialog
+// -----------------------------------------------------------------------------
+//
+void CMPMServerSession::UpdateConnectionDialogL()
+    {
+    if( iIapSelection )
+        {
+        iIapSelection->UpdateConnectionDialogL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
 // CMPMServerSession::CompleteCarrierRejected
 // -----------------------------------------------------------------------------
 //
@@ -2810,10 +2906,21 @@
     if ( !( iIapSelection->MpmConnPref().NoteBehaviour() &
             TExtendedConnPref::ENoteBehaviourConnDisableNotes) )
         {
-        TBool connectionAlreadyActive = iMyServer.CheckIfStarted( aIapId, iConnId );
-        
-        iMyServer.ConnUiUtils()->ConnectingViaDiscreetPopup( aIapId,
-                                                  connectionAlreadyActive );
+        TConnectionState state = iMyServer.CheckUsageOfIap( aIapId, iConnId );
+        TBool connectionAlreadyActive = (state == EStarted || state == EStarting || state == ERoaming);
+        CConnectionUiUtilities* connUiUtils = NULL;
+        if (!connectionAlreadyActive )
+            {
+            TRAPD( popupError,
+                   connUiUtils = CConnectionUiUtilities::NewL();
+                   connUiUtils->ConnectingViaDiscreetPopup(
+                   			        aIapId );
+                   delete connUiUtils; );
+            if ( popupError && connUiUtils )
+                {
+                delete connUiUtils;
+                }
+            }
         }
 
     TMpmNotificationStartIAP notifInfo;
@@ -3015,20 +3122,23 @@
                 //
                 TBool usesSame( EFalse ); 
 
-                TRAP_IGNORE( iMyServer.CommsDatAccess()->MatchSSIDL( ssid, 
-                                                                     unavailableIAPs[i], 
-                                                                     usesSame,
-                                                                     *this ) )
-                                                              
-                if ( usesSame )
+                if ( !iMyServer.CommsDatAccess()->CheckEasyWLanL( unavailableIAPs[i] ) )
                     {
-                    // Append unavailable IAP to list of available IAPs
-                    // if it uses same SSID as active WLAN connection.
-                    // 
-                    MPMLOGSTRING2(
-                        "CMPMServerSession::AvailableUnblacklistedIapsL:\
+                    TRAP_IGNORE( iMyServer.CommsDatAccess()->MatchSSIDL( ssid, 
+                                                              unavailableIAPs[i], 
+                                                              usesSame,
+                                                              *this ) )
+                                                              
+                    if ( usesSame )
+                        {
+                        // Append unavailable IAP to list of available IAPs
+                        // if it uses same SSID as active WLAN connection.
+                        // 
+                        MPMLOGSTRING2(
+                            "CMPMServerSession::AvailableUnblacklistedIapsL:\
  Append unavailable IapId = %i", unavailableIAPs[i] )
-                    aAvailableIAPs.AppendL( unavailableIAPs[i] );
+                        aAvailableIAPs.AppendL( unavailableIAPs[i] );
+                        }
                     }
                 }
             }
@@ -3246,6 +3356,25 @@
     {
     MPMLOGSTRING2( "CMPMServerSession::ChooseIapComplete aError = %d", aError )
 
+    // Show error popup if it's allowed per client request.
+	// Error popup shown to SNAP only if error discreet has not been shown for IAP.
+    if ( ChooseBestIapCalled() && (!( iIapSelection->MpmConnPref().NoteBehaviour() &
+            TExtendedConnPref::ENoteBehaviourConnDisableNotes ))
+              && ( aError != KErrNone )
+              && ( iErrorDiscreetPopupShown == EFalse ) )
+        {
+        CConnectionUiUtilities* connUiUtils = NULL;
+        TRAPD( error, connUiUtils = CConnectionUiUtilities::NewL() );
+        if ( error == KErrNone && connUiUtils )
+            {
+            // Note: Below function shows the discreet popup only if the error code
+            // belongs to the set of errors that are shown to the user.
+            // Otherwise the popup is not shown.
+            connUiUtils->ConnectionErrorDiscreetPopup( aError );
+            delete connUiUtils;
+            connUiUtils = NULL;
+            }
+        }
     
     // Try to write back arguments and complete message.
     // 
@@ -3301,32 +3430,6 @@
         MPMLOGSTRING( "CMPMServerSession::ChooseIapComplete Message completed" )
         iChooseIapMessage.Complete( aError );
         }
-
-    // Show error popup if it's allowed per client request
-    // Error popup shown to SNAP only if error discreet has not been shown for IAP.
-    if ( ChooseBestIapCalled() && (!( iIapSelection->MpmConnPref().NoteBehaviour() &
-            TExtendedConnPref::ENoteBehaviourConnDisableNotes ))
-            && ( aError != KErrNone ) 
-            && ( iErrorDiscreetPopupShown == EFalse ) )
-        {
-        // Note: Below function shows the discreet popup only if the error code
-        // belongs to the set of errors that are shown to the user.
-        // Otherwise the popup is not shown.
-        iMyServer.ConnUiUtils()->ConnectionErrorDiscreetPopup( aError );
-        }
-    else if ( aError == KErrNone )
-        {
-        if (!( iIapSelection->MpmConnPref().NoteBehaviour() &
-            TExtendedConnPref::ENoteBehaviourConnDisableNotes ) &&
-            ( IsMMSIap( aPolicyPref->IapId() ) == EFalse ) )
-            {
-            TBool connectionAlreadyActive =
-                MyServer().CheckIfStarted( aPolicyPref->IapId(), iConnId );
-
-            iMyServer.ConnUiUtils()->ConnectingViaDiscreetPopup( aPolicyPref->IapId(),
-                                                      connectionAlreadyActive );
-            }            
-        }
     
     // Enable showing error discreet popup for SNAP again
     iErrorDiscreetPopupShown = EFalse;
@@ -3342,6 +3445,9 @@
                                               TBMNeededAction* aNeededAction )
     {
     MPMLOGSTRING2( "CMPMServerSession::ProcessErrorComplete aError = %d", aError )
+
+    delete iDisconnectDlg;
+    iDisconnectDlg = NULL;
     
     if ( !iProcessErrorMessage.IsNull() )
         {
@@ -3481,24 +3587,6 @@
     }
 
 // -----------------------------------------------------------------------------
-// CMPMServerSession::SetVpnUserConnectionUsed
-// -----------------------------------------------------------------------------
-//
-void CMPMServerSession::SetVpnUserConnectionUsed( const TBool aUseVpnUserConnection )
-    {
-    if ( aUseVpnUserConnection )
-        {
-        iVpnUserConnectionUsed = ETrue;
-        iMyServer.AddVpnUserConnectionSession();        
-        }
-    else 
-        {
-        iVpnUserConnectionUsed = EFalse;
-        iMyServer.RemoveVpnUserConnectionSession();        
-        }
-    }
-
-// -----------------------------------------------------------------------------
 // CMPMServerSession::IsWlanOnlyL
 // -----------------------------------------------------------------------------
 //