diff -r 3b0cec605979 -r c5b848e6c7d1 bearermanagement/mpm/src/mpmserversession.cpp --- a/bearermanagement/mpm/src/mpmserversession.cpp Thu May 27 14:35:19 2010 +0300 +++ b/bearermanagement/mpm/src/mpmserversession.cpp Thu Jun 10 16:00:16 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2004-2010 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,7 +38,6 @@ #include "mpmcommsdataccess.h" #include "mpmserversession.h" #include "mpmconnmonevents.h" -#include "mpmdisconnectdlg.h" #include "mpmconfirmdlgstarting.h" #include "mpmconfirmdlgroaming.h" #include "mpmlogger.h" @@ -69,12 +68,10 @@ CMPMServerSession::CMPMServerSession(CMPMServer& aServer) : CSession2(), iMyServer( aServer ), - iDisconnectDlg( NULL ), iConfirmDlgRoaming( NULL ), iStoredIapInfo(), iIapSelection( NULL ), - iMigrateState( EMigrateNone ), - iDisconnectDialogShown( EFalse ) + iMigrateState( EMigrateNone ) { } @@ -89,7 +86,7 @@ if ( !iMyServer.Events() ) { iMyServer.SetEvents(CMPMConnMonEvents::NewL( - *const_cast( &iMyServer ), *this )); + *const_cast( &iMyServer ) ) ); } // Append session pointer to server @@ -104,7 +101,6 @@ // CMPMServerSession::~CMPMServerSession() { - delete iDisconnectDlg; delete iConfirmDlgRoaming; delete iIapSelection; @@ -420,8 +416,7 @@ } // Store the Uid of the application to the member variable so - // that it can be used to avoid DisconnectDialog popping up when - // AlwaysOnline connection is being established. + // that it can be used when AlwaysOnline connection is being established. // iAppUid = aMessage.Int2(); @@ -478,7 +473,7 @@ // Cancel WLAN scan request if one exists // - TRAP_IGNORE( iMyServer.Events()->CancelScanL( *this ) ) + TRAP_IGNORE( iMyServer.Events()->CancelScanL( this ) ) if ( iIapSelection ) { @@ -500,15 +495,8 @@ // Cancel WLAN scan request if one exists // - TRAP_IGNORE( iMyServer.Events()->CancelScanL( *this ) ) - - if ( iDisconnectDlg ) - { - MPMLOGSTRING( "CMPMServerSession::HandleServerCancelRequest: \ -removing dconn dlg" ) - delete iDisconnectDlg; - iDisconnectDlg = NULL; - } + TRAP_IGNORE( iMyServer.Events()->CancelScanL( this ) ) + return; } case EMPMWaitNotification: @@ -527,7 +515,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; @@ -809,21 +797,6 @@ { 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 for this IAP" ) - isConfirmFirst = EFalse; - iDisconnectDialogShown = EFalse; - } } else { @@ -1385,20 +1358,7 @@ ProcessErrorComplete( KErrNone, &error, &neededAction ); return; } - - // 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 ) ) - { - // 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 ); - } - + // Read the Connection Id of the application // TConnectionId connId = iProcessErrorMessage.Int1(); @@ -1414,6 +1374,25 @@ // 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 ); + } + TConnMonIapInfo availableIAPs; availableIAPs = GetAvailableIAPs(); @@ -1425,6 +1404,8 @@ // TConnectionState state; iMyServer.GetConnectionState( connId, state ); + MPMLOGSTRING2( + "CMPMServerSession::HandleServerProcessErrorL - state %d", state ) // We need to blacklist the presumed IAP too // @@ -1435,248 +1416,211 @@ // 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 ); - if ( ( state == EStarting ) || ( state == ERoaming ) ) + switch ( state ) { - // 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(this), - error, - *MyServer().DisconnectQueue() ); - iDisconnectDialogShown = ETrue; - return; - } - else - { - MPMLOGSTRING( "CMPMServerSession::HandleServerProcessErrorL - \ -Error not handled with disconnect dialog" ) - - if ( state == EStarting ) + case EStarting: + if ( ( snapId == 0 ) || ( error == KErrCancel ) ) { - 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 ); - } - } + neededAction = EPropagateError; + + MPMLOGSTRING( + "CMPMServerSession::HandleServerProcessErrorL - \ + Tell BM to end the client connection with appropriate error code" ) } - else if ( state == ERoaming ) + else { - // 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; + neededAction = EDoReselection; + + MPMLOGSTRING( + "CMPMServerSession::HandleServerProcessErrorL - \ + Tell BM to ignore error and do reselection" ) iMyServer.HandleServerBlackListIap( connId, currentIap, ETemporary ); if ( ( presumedIap != 0 ) && - ( presumedIap != currentIap ) ) + ( presumedIap != currentIap ) ) { iMyServer.HandleServerBlackListIap( connId, presumedIap, ETemporary ); } - TRAP( error, PrefIAPNotificationL( availableIAPs, + } + // 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, 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" ) - } - else - { - MPMLOGSTRING( - "CMPMServerSession::HandleServerProcessErrorL - \ -Tell BM to ignore error and let MPM notify application about preferred IAP" ) - } + 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 { - MPMLOGSTRING2( + MPMLOGSTRING( "CMPMServerSession::HandleServerProcessErrorL - \ -Unknown state %d", state ) + Tell BM to ignore error and let MPM notify application about preferred IAP" ) } - + // Error might be different from KErrNone if there // is no preferred IAP among the available IAPs. // ProcessErrorComplete( KErrNone, returnError, &neededAction ); - return; - } - } - else if ( state == EStarted ) - { - // Process error according to the fact that the connection - // has already been started. - // - if ( ( error == KErrCancel ) || ( error == KErrTimedOut ) ) - { - 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 ) + break; + + case EStarted: + // Process error according to the fact that the connection + // has already been started. + // + if ( ( error == KErrCancel ) || ( error == KErrTimedOut ) ) { neededAction = EPropagateError; - + MPMLOGSTRING( "CMPMServerSession::HandleServerProcessErrorL - \ -Tell BM to end the client connection with appropriate error code" ) - - TRAP_IGNORE( ErrorNotificationL( KErrNotFound, - EMPMMobilityErrorNotification ) ) + 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 ) ) } - // SNAP connection - // - else + else if ( iPreferredIAPRequested ) { - // 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 + // IAP connection // - RArray iapPath; - CleanupClosePushL( iapPath ); - - iMyServer.HandleServerBlackListIap( connId, - currentIap, - ETemporary ); - if ( ( presumedIap != 0 ) && - ( presumedIap != currentIap ) ) + if( snapId == 0 ) { - 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; + + 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 { - MPMLOGSTRING( - "CMPMServerSession::HandleServerProcessErrorL - \ -Tell BM to ignore error and let MPM notify application about preferred IAP" ) + // 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 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" ) + } } } - } - 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 ); + 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; } } @@ -3317,10 +3261,11 @@ // Otherwise the popup is not shown. iMyServer.ConnUiUtils()->ConnectionErrorDiscreetPopup( aError ); } - else + else if ( aError == KErrNone ) { if (!( iIapSelection->MpmConnPref().NoteBehaviour() & - TExtendedConnPref::ENoteBehaviourConnDisableNotes ) ) + TExtendedConnPref::ENoteBehaviourConnDisableNotes ) && + ( IsMMSIap( aPolicyPref->IapId() ) == EFalse ) ) { TBool connectionAlreadyActive = MyServer().CheckIfStarted( aPolicyPref->IapId(), iConnId ); @@ -3341,9 +3286,6 @@ TBMNeededAction* aNeededAction ) { MPMLOGSTRING2( "CMPMServerSession::ProcessErrorComplete aError = %d", aError ) - - delete iDisconnectDlg; - iDisconnectDlg = NULL; if ( !iProcessErrorMessage.IsNull() ) {