diff -r 000000000000 -r 094583676ce7 wvuing/IMPSConnectionUI/OperationStepSrc/CCnUiLogoutUiCntrlStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/IMPSConnectionUI/OperationStepSrc/CCnUiLogoutUiCntrlStep.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,384 @@ +/* +* Copyright (c) 2004 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: Logout UI control. +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include + +#include "CCnUiLogoutUiCntrlStep.h" +#include "CCnUiConnCloser.h" +#include "CnUiSapDataPacker.h" + +#include "MCnUiUiControlContext.h" +#include "MCnUiUiFacade.h" +#include "MCnUiSignaller.h" +#include "MCnUiConnectionHandler.h" +#include "MCnUiConnModeHandler.h" +#include "MCnUiClientPlugin.h" +#include "MCnUiConnModeRewaker.h" + +#include +#include "CnUiErrors.h" +#include + + +// ================= MEMBER FUNCTIONS ======================= +// Two-phased constructor. +CCnUiLogoutUiCntrlStep* CCnUiLogoutUiCntrlStep::NewLC( + MCnUiUiControlContext& aCCntxt, + CIMPSSAPSettings& aLogoutSap, + const CPEngNWSessionSlotID2& aNWSessionSlotID ) + { + CCnUiLogoutUiCntrlStep* self = new ( ELeave ) CCnUiLogoutUiCntrlStep( aCCntxt, aLogoutSap ); + CleanupStack::PushL( self ); + self->ConstructL( aNWSessionSlotID ); + return self; + } + + +// Destructor +CCnUiLogoutUiCntrlStep::~CCnUiLogoutUiCntrlStep() + { + delete iConnCloser; + delete iWaitNote; + delete iNWSessionSlotID; + } + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CCnUiLogoutUiCntrlStep::CCnUiLogoutUiCntrlStep( MCnUiUiControlContext& aCCntxt, + CIMPSSAPSettings& aLogoutSap ) + : iCCntxt( aCCntxt ), + iLogoutSap( aLogoutSap ) + { + } + + +// Symbian OS default constructor can leave. +void CCnUiLogoutUiCntrlStep::ConstructL( const CPEngNWSessionSlotID2& aNWSessionSlotID ) + { + iConnCloser = CCnUiConnCloser::NewL(); + iNWSessionSlotID = aNWSessionSlotID.CloneL(); + } + + +// ----------------------------------------------------------------------------- +// CCnUiLogoutUiCntrlStep::RunStepL() +// ----------------------------------------------------------------------------- +// +TInt CCnUiLogoutUiCntrlStep::RunStepL() + { + TIMPSConnectionClient clientToLogout; + TInt initErr = DoInitLogoutStepL( clientToLogout ); + if ( initErr != ECnUiLogoutInitContinue ) + { + return initErr; + } + + //Logout is desired for the client + //==> no automatic rewake for client allowed + iCCntxt.ConnModeRewaker().RemoveFromAARewakeList( clientToLogout ); + + //proceed with logout, notify first observers + iCCntxt.ProcessObserverProxy().NotifyAccessingSapL( iLogoutSap ); + + //close the client connection using the connection closer + //This control follows closer progress events + //and sets up proper wait notes according the closer states + TInt logoutStatus; + logoutStatus = + iConnCloser->MakeLogoutForClient( + clientToLogout, + iLogoutSap, + iCCntxt.ClientPluginL( clientToLogout, *iNWSessionSlotID ), + iCCntxt.ConnHandler(), + this, + *iNWSessionSlotID ); + + //connection closer finished its processing + //clear any existing wait note set by the progress step. + delete iWaitNote; + iWaitNote = NULL; + + //and flush the possible buffered UI commands + iCCntxt.Ui().FlushCommandBuffer(); + + //show proper note for status code + if ( logoutStatus == KErrNone ) + { + //show a note about succesful logout + DoShowLogoutOkNoteL( clientToLogout ); + /* + * + * Check if the connection mode is Automatic (always online), in which case + * we need to login again. + */ + MCnUiClientPlugin& cPlugin = iCCntxt.ClientPluginL( clientToLogout, *iNWSessionSlotID ); + if ( cPlugin.CurrentConnectionModeSettingL() == ECnUiCMAutomatic ) + { + _LIT_SECURITY_POLICY_PASS( KIMPSSharedReadPolicy ); + _LIT_SECURITY_POLICY_PASS( KIMPSSharedWritePolicy ); + // The uid of shared data to notify the Always online plugin. + const TUid KIMPSServSettNotifyUid = {0x101f75b6}; + // 154 is EIMPSSharedKeysServSettScheduleChangedIM. + TUint32 aKey = 154; + RProperty::Define( KIMPSServSettNotifyUid, aKey, RProperty::EInt, + KIMPSSharedReadPolicy, KIMPSSharedWritePolicy ); + TInt err = RProperty::Set( KIMPSServSettNotifyUid, aKey, 0 ); + } + + //and notify about manual logout + iCCntxt.ConnModeHandler().SendUserSelectionL( EUserLevelLogout, clientToLogout ); + } + + else + { + //logout failed + iCCntxt.Ui().ShowLogoutErrorNoteL( logoutStatus ); + } + + return logoutStatus; + } + + +// ----------------------------------------------------------------------------- +// CCnUiLogoutUiCntrlStep::HandleCompleteL() +// ----------------------------------------------------------------------------- +// +TCnUiHandleCompleteStatus CCnUiLogoutUiCntrlStep::HandleCompleteL() + { + if ( !iCCntxt.ConnHandler().NwConnectionActiveL( *iNWSessionSlotID ) && + iConnCloser->ConnectionReallyClosed() ) + { + //there isn't no more active NW connections + //and the connection was closed by this control. + + //let see is there clients to reconnect + RArray< TIMPSConnectionClient > aaClientsToReconnect; + CleanupClosePushL( aaClientsToReconnect ); + TBool gotAAClients = CnUiSapDataPacker::ExtractAAClientsL( iLogoutSap, + aaClientsToReconnect ); + CleanupStack::PopAndDestroy(); //aaClientsToReconnect + + if ( gotAAClients ) + { + //There is some AA clients to reconnect. + + CIMPSSAPSettings* defaultSAPToReconnect = CIMPSSAPSettings::NewLC(); + CIMPSSAPSettingsStore& sapStore = iCCntxt.SapStoreL(); + + TIMPSConnectionClient client( ConnectionClient() ); + TIMPSAccessGroup accessGroup; + if ( client == EIMPSConnClientIM ) + { + accessGroup = EIMPSIMAccessGroup; + } + else + { + accessGroup = EIMPSPECAccessGroup; + } + + TRAPD( err, sapStore.GetDefaultL( defaultSAPToReconnect, accessGroup ) ); + + if ( err == KErrNotFound ) + { + //Ignore not found error. + //If there isn't the default SAP to reconnect + //nothing can't be done. + err = KErrNone; + } + + else if ( err == KErrNone ) + { + //remove first any packed SAP from default SAP + //to avoid restore nesting... + CnUiSapDataPacker::RemovePackedSapL( *defaultSAPToReconnect ); + iCCntxt.SubOpReconnectAllL( *defaultSAPToReconnect, *iNWSessionSlotID ); + } + + //Handle other default SAP load errors with leaving + User::LeaveIfError( err ); + CleanupStack::PopAndDestroy( defaultSAPToReconnect ); //defaultSAPToReconnect + } + } + + return ECnUiStepContinueTeardown; + } + +// ----------------------------------------------------------------------------- +// CCnUiLogoutUiCntrlStep::UndoStepL() +// ----------------------------------------------------------------------------- +// +void CCnUiLogoutUiCntrlStep::UndoStepL() + { + //nothing to undo + } + + +// ----------------------------------------------------------------------------- +// CCnUiLogoutUiCntrlStep::HandleProgressStateEnterL() +// ----------------------------------------------------------------------------- +// +void CCnUiLogoutUiCntrlStep::HandleProgressStateEnter( TInt aStateId, + TIMPSConnectionClient aClient ) + { + TRAPD( leaveErr, DoShowLogoutStateSpecificWaitnoteL( aStateId, aClient ) ); + iCCntxt.Ui().HandleIfError( leaveErr ); + } + + +// ----------------------------------------------------------------------------- +// CCnUiLogoutUiCntrlStep::ShowSimultaneousLoginOperationNoteL() +// ----------------------------------------------------------------------------- +// +void CCnUiLogoutUiCntrlStep::ShowSimultaneousLoginOperationNoteL() + { + HBufC* serverName = NULL; + iCCntxt.Signaller().OperationDetailsL( serverName ); + + //OperationDetailsL() returns the HBufC ownership + CleanupStack::PushL( serverName ); + iCCntxt.Ui().ShowNoteL( ECnUiConnOperationAllreadyRunning, *serverName ); + CleanupStack::PopAndDestroy( serverName ); //serverName + } + + +// ----------------------------------------------------------------------------- +// CCnUiLogoutUiCntrlStep::DoInitLogoutStepL() +// Template method +// ----------------------------------------------------------------------------- +// +TInt CCnUiLogoutUiCntrlStep::DoInitLogoutStepL( TIMPSConnectionClient& aClient ) + { + const TIMPSConnectionClient clientId = iCCntxt.ControlledClient(); + + //is this client logged in? + //if not, then no need to proceed + if ( !iCCntxt.ConnHandler().TheClientLoggedInL( clientId ) ) + { + return KErrNone; //breaks the RunStepL() with KErrNone + } + + + //Is this operation free to proceed? + //If not, show a note, else proceed. + //However no signalling about logout is used... + if ( iCCntxt.Signaller().OperationRunning() ) + { + ShowSimultaneousLoginOperationNoteL(); + return KCnUiErrorLoginOperationAlreadyInUse; + } + + + //get SAP from where logging out.. + iCCntxt.ConnHandler().GetLoggedInSapL( iLogoutSap, clientId ); + aClient = clientId; + + return ECnUiLogoutInitContinue; + } + + +// ----------------------------------------------------------------------------- +// CCnUiLogoutUiCntrlStep::DoShowLogoutStateSpecificWaitnoteL() +// ----------------------------------------------------------------------------- +// +void CCnUiLogoutUiCntrlStep::DoShowLogoutStateSpecificWaitnoteL( TInt aStateId, + TIMPSConnectionClient /*aClient*/ ) + { + switch ( aStateId ) + { + case ECnCloser_ProcessingPlugin: + case ECnCloser_ClosingSAPConnection: + { + if ( !iWaitNote ) + { + //the same wait note is used + //both when closing SAP connection & + //processing plug-in stuff + iWaitNote = iCCntxt.Ui().WaitNoteL( ECnUiWaitNoteDisconnecting ); + } + + break; + } + + case ECnCloser_Idle: + default: + { + //clear any existing wait note set by the previous + //progress steps. No wait note used during these steps. + delete iWaitNote; + iWaitNote = NULL; + + break; + } + } + } + + + +// ----------------------------------------------------------------------------- +// CCnUiLogoutUiCntrlStep::DoShowLogoutOkNoteL() +// ----------------------------------------------------------------------------- +// +void CCnUiLogoutUiCntrlStep::DoShowLogoutOkNoteL( TIMPSConnectionClient aClient ) + { + MCnUiClientPlugin& cPlugin = iCCntxt.ClientPluginL( aClient, *iNWSessionSlotID ); + if ( cPlugin.CurrentConnectionModeSettingL() == ECnUiCMAutomatic ) + { + iCCntxt.Ui().ShowNoteL( ECnUiDisconnectedAutomaticConnection ); + } + + else + { + switch ( aClient ) + { + case EIMPSConnClientPEC: + { + iCCntxt.Ui().ShowNoteL( ECnUiDisconnectedPEC ); + break; + } + + case EIMPSConnClientIM: + { + iCCntxt.Ui().ShowNoteL( ECnUiDisconnectedIM ); + break; + } + + default: + { + break; + } + } + } + } + +// ----------------------------------------------------------------------------- +// CCnUiLogoutUiCntrlStep::DoShowLogoutOkNoteL() +// ----------------------------------------------------------------------------- +// +TIMPSConnectionClient CCnUiLogoutUiCntrlStep::ConnectionClient() + { + // rvct does not support casting from TAny* to enumeration value + TInt returnValue = ( TInt )Dll::Tls(); + return ( TIMPSConnectionClient )returnValue; + } + +// End of File +