--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/IMPSConnectionUI/OperationStepSrc/CCnUiLogoutUiCntrlStep.cpp Wed Sep 01 12:31:13 2010 +0100
@@ -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 <E32std.h>
+#include <CIMPSSAPSettings.h>
+#include <CIMPSSAPSettingsStore.h>
+#include <CPEngNWSessionSlotID2.h>
+
+#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 <centralrepository.h>
+#include "CnUiErrors.h"
+#include <e32property.h>
+
+
+// ================= 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
+