diff -r 000000000000 -r 094583676ce7 wvuing/IMPSConnectionUI/OperationStepSrc/CCnUiConnModeRewaker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/IMPSConnectionUI/OperationStepSrc/CCnUiConnModeRewaker.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,259 @@ +/* +* 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: Connection mode rewaker. +* +*/ + +// INCLUDE FILES +#include +#include + +#include "CCnUiConnModeRewaker.h" +#include "MCnUiClientPlugin.h" +#include "CnUiErrors.h" + +#include "IMPSCommonUiDebugPrint.h" + + +//CONSTANTS +const TInt KReWakeUserActivityTimeout = 30000000; //30 seconds, defined in UI specification + + + +// ================= LOCAL FUNCTIONS ======================= +// ----------------------------------------------------------------------------- +// ResumeRewakeStatic() +// ----------------------------------------------------------------------------- +// +void ResumeRewakeStatic( TAny* aRewaker ) + { + CCnUiConnModeRewaker* p = static_cast< CCnUiConnModeRewaker* >( aRewaker ); + p->ResumeRewake(); + } + + + +// ================= MEMBER FUNCTIONS ======================= +// Two-phased constructor. +CCnUiConnModeRewaker* CCnUiConnModeRewaker::NewL() + { + CCnUiConnModeRewaker* self = new ( ELeave ) CCnUiConnModeRewaker(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); //self + return self; + } + + +// Destructor +CCnUiConnModeRewaker::~CCnUiConnModeRewaker() + { + Cancel(); + + //Rewaker is closing down. Issue possibly pending rewakes now. + //Raising errors can be only ignored.. + TInt ignore; + TRAP( ignore, RewakeRegisteredClientsL() ); + + iAAClntsToRewake.ResetAndDestroy(); + } + + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CCnUiConnModeRewaker::CCnUiConnModeRewaker() + : CTimer( CActive::EPriorityStandard ) + { + } + + +// Symbian OS default constructor can leave. +void CCnUiConnModeRewaker::ConstructL() + { + CTimer::ConstructL(); + CActiveScheduler::Add( this ); + } + + +// ----------------------------------------------------------------------------- +// CCnUiConnModeRewaker::AddToAAModeRewakeListL() +// ----------------------------------------------------------------------------- +// +void CCnUiConnModeRewaker::AddToAAModeRewakeListL( MCnUiClientPlugin& aClientPlugin, + CPEngNWSessionSlotID2& aNWSessionSlotID ) + { + if ( aClientPlugin.CurrentConnectionModeSettingL() == ECnUiCMAutomatic ) + { + const TIMPSConnectionClient client = aClientPlugin.ClientID(); + if ( !ClientAlreadyReqistered( client ) ) + { + //Make a own copy of plug-in object + MCnUiClientPlugin* cPlugin = CreateClientPluginL( client, aNWSessionSlotID ); + TInt err = iAAClntsToRewake.Append( cPlugin ); + if ( err != KErrNone ) + { + delete cPlugin; + User::Leave( err ); + } + + IMPSCUI_DP( D_IMPSCUI_LIT( "CCnUiConnModeRewaker::AddToAAModeRewakeListL( added client[%d] )" ), client ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CCnUiConnModeRewaker::GetAARewakeListL() +// ----------------------------------------------------------------------------- +// +void CCnUiConnModeRewaker::GetAARewakeListL( RArray< TIMPSConnectionClient >& aAARewakedClients ) + { + IMPSCUI_DP( D_IMPSCUI_LIT( "CCnUiConnModeRewaker::GetAARewakeListL( %d clients on the list)" ), iAAClntsToRewake.Count() ); + + aAARewakedClients.Reset(); + + const TInt AARewakeCount = iAAClntsToRewake.Count(); + for ( TInt ii = 0; ii < AARewakeCount; ii++ ) + { + MCnUiClientPlugin* cPlugin = iAAClntsToRewake[ ii ]; + const TIMPSConnectionClient client = cPlugin->ClientID(); + User::LeaveIfError( aAARewakedClients.Append( client ) ); + } + } + + +// ----------------------------------------------------------------------------- +// CCnUiConnModeRewaker::ClearAARewakeList() +// ----------------------------------------------------------------------------- +// +void CCnUiConnModeRewaker::ClearAARewakeList() + { + IMPSCUI_DP( D_IMPSCUI_LIT( "CCnUiConnModeRewaker::ClearAARewakeList()" ) ); + iAAClntsToRewake.ResetAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CCnUiConnModeRewaker::RemoveFromAARewakeList() +// ----------------------------------------------------------------------------- +// +void CCnUiConnModeRewaker::RemoveFromAARewakeList( TIMPSConnectionClient aClient ) + { + TInt ii = ( iAAClntsToRewake.Count() - 1 ); //last index is 1 smaller than total count + for ( ; ii >= 0; ii-- ) + { + MCnUiClientPlugin* cPlugin = iAAClntsToRewake[ ii ]; + if ( cPlugin->ClientID() == aClient ) + { + IMPSCUI_DP( D_IMPSCUI_LIT( "CCnUiConnModeRewaker::RemoveFromAARewakeList( removed client [%d] )" ), aClient ); + iAAClntsToRewake.Remove( ii ); + delete cPlugin; + } + } + } + + +// ----------------------------------------------------------------------------- +// CCnUiConnModeRewaker::SuspendLC() +// ----------------------------------------------------------------------------- +// +void CCnUiConnModeRewaker::SuspendLC() + { + //Cancel the possibly running timer + Cancel(); + + //And push Resume operation to cleanup stack + CleanupStack::PushL( TCleanupItem( ResumeRewakeStatic, this ) ); + } + + +// ----------------------------------------------------------------------------- +// CCnUiConnModeRewaker::ResumeRewake() +// ----------------------------------------------------------------------------- +// +void CCnUiConnModeRewaker::ResumeRewake() + { + //Cancel the possibly running timer + Cancel(); + + //And issue new timer event + if ( iAAClntsToRewake.Count() > 0 ) + { + IMPSCUI_DP( D_IMPSCUI_LIT( "CCnUiConnModeRewaker::ResumeRewake() - starting timeout timer for %d clients" ), iAAClntsToRewake.Count() ); + After( KReWakeUserActivityTimeout ); + } + } + + +// ----------------------------------------------------------------------------- +// CCnUiConnModeRewaker::RunL() +// ----------------------------------------------------------------------------- +// +void CCnUiConnModeRewaker::RunL() + { + RewakeRegisteredClientsL(); + } + + +// ----------------------------------------------------------------------------- +// CCnUiConnModeRewaker::RunError() +// ----------------------------------------------------------------------------- +// +TInt CCnUiConnModeRewaker::RunError( TInt aError ) + { + iAAClntsToRewake.ResetAndDestroy(); + return aError; + } + + +// ----------------------------------------------------------------------------- +// CCnUiConnModeRewaker::RewakeRegisteredClientsL() +// ----------------------------------------------------------------------------- +// +void CCnUiConnModeRewaker::RewakeRegisteredClientsL() + { + const TInt clientsToReWakeCount = iAAClntsToRewake.Count(); + for ( TInt ii = 0; ii < clientsToReWakeCount; ii++ ) + { + MCnUiClientPlugin* cPlugin = iAAClntsToRewake[ ii ]; + IMPSCUI_DP( D_IMPSCUI_LIT( "CCnUiConnModeRewaker::RewakeRegisteredClientsL( waking client [%d] )" ), cPlugin->ClientID() ); + cPlugin->ReWakeAutomaticConnectionModeL(); + } + + iAAClntsToRewake.ResetAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CCnUiConnModeRewaker::ClientAlreadyReqistered() +// ----------------------------------------------------------------------------- +// +TBool CCnUiConnModeRewaker::ClientAlreadyReqistered( TIMPSConnectionClient aClient ) + { + const TInt reqisteredClientsCount = iAAClntsToRewake.Count(); + for ( TInt ii = 0; ii < reqisteredClientsCount; ii++ ) + { + MCnUiClientPlugin* cPlugin = iAAClntsToRewake[ ii ]; + if ( cPlugin->ClientID() == aClient ) + { + return ETrue; + } + } + + return EFalse; + } + + +// End of File