diff -r 000000000000 -r 4e1aa6a622a0 psmservices/psmserver/src/engine/psmmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/psmservices/psmserver/src/engine/psmmanager.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,329 @@ +/* +* Copyright (c) 2007 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: Power save mode manager class +* +*/ + + +#include +#include +#include +#include "psmmodechangeobserver.h" +#include "psmmanager.h" +#include "psmpluginloader.h" +#include "psmsettingshandler.h" +#include "psmtrace.h" +#include "psmdefines.h" +#include "psmtypes.h" + +// ----------------------------------------------------------------------------- +// CPsmManager::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPsmManager* CPsmManager::NewL() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::NewL()" ) ) ); + + CPsmManager* self = CPsmManager::NewLC(); + CleanupStack::Pop( self ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::NewL - return 0x%x" ), self ) ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPsmManager::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPsmManager* CPsmManager::NewLC() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::NewLC()" ) ) ); + + CPsmManager* self = new( ELeave ) CPsmManager(); + + CleanupStack::PushL( self ); + self->ConstructL(); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::NewLC - return 0x%x" ), self ) ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CPsmManager::CPsmManager +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPsmManager::CPsmManager() : CActive( EPriorityStandard ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CPsmManager::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPsmManager::ConstructL() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::ConstructL()" ) ) ); + + // Get current mode from CenRep + TInt mode = 0; + CRepository* cenrep = CRepository::NewLC( KCRUidPowerSaveMode ); + cenrep->Get( KPsmCurrentMode, mode ); + CleanupStack::PopAndDestroy( cenrep ); + + // Create an instance of the settings handler. Manager has only one instance + iSettingsHandler = CPsmSettingsHandler::NewL( (TPsmsrvMode)mode ); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::ConstructL - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CPsmManager::~CPsmManager() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::~CPsmManager()" ) ) ); + + Cancel(); + + if ( iSettingsHandler ) + { + delete iSettingsHandler; + } + + if ( iPluginLoader ) + { + delete iPluginLoader; + } + + // Close mode observers array + iModeObservers.Close(); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::~CPsmManager - return") ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmManager::NotifyPowerSaveModeChangeL +// Starts mode change actions +// ----------------------------------------------------------------------------- +// +void CPsmManager::NotifyPowerSaveModeChangeL( TInt aPsmMode ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::NotifyPowerSaveModeChangeL()" ) ) ); + + iPowerSaveModeChangeActive = ETrue; + iModeChangeCancel = EFalse; + + if ( !iPluginLoader ) + { + // Create plugin loader + iPluginLoader = CPsmPluginLoader::NewL( *this ); + } + else + { + // Check are there any pending plugins + if ( iPluginLoader->PluginCount() ) + { + // There are pending plugins, delete those + delete iPluginLoader; + iPluginLoader = NULL; + iPluginLoader = CPsmPluginLoader::NewL( *this ); + } + } + + // Settings handler already exists, update mode + iSettingsHandler->SetMode( ( TPsmsrvMode ) aPsmMode ); + + // Start loading plugins + iPluginLoader->InitializePluginsL(); + + // Notify plugins to change mode + iPluginLoader->NotifyPlugins(); + + // continue process asynchronously + IssueRequest(); + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::NotifyPowerSaveModeChangeL - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmManager::CancelPowerSaveModeChangeL +// Starts mode change actions +// ----------------------------------------------------------------------------- +// +void CPsmManager::CancelPowerSaveModeChangeL() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::CancelPowerSaveModeChangeL()" ) ) ); + + if ( iPowerSaveModeChangeActive ) + { + // Change mode normally to previous mode + NotifyPowerSaveModeChangeL( iSettingsHandler->PreviousMode() ); + + // Indicates that no need to notify observers + iModeChangeCancel = ETrue; + } + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::CancelPowerSaveModeChangeL - return" ) ) ); + } + +// --------------------------------------------------------------------------- +// CPsmManager::IssueRequest +// --------------------------------------------------------------------------- +// +void CPsmManager::IssueRequest() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::IssueRequest()" ) ) ); + // Provides synchronous function calls to be handled as asynchronous + if ( !IsActive() ) + { + SetActive(); + TRequestStatus *s = &iStatus; + User::RequestComplete( s, KErrNone ); + } + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::IssueRequest() - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmManager::RunL +// ----------------------------------------------------------------------------- +// +void CPsmManager::RunL() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::RunL()" ) ) ); + + // Change cenrep values + TRAPD( cenrepErr, iSettingsHandler->ChangeCenRepSettingsL() ); + + ERROR_TRACE( ( _L( "PSM Server - CPsmManager::RunL: CenRep change error: %i" ), cenrepErr ) ); + + TInt completeCode( KErrNone ); + + if ( KErrNone != cenrepErr ) + { + // Indicate to mode change originator that mode is changed but with some failures + // i.e. mode successfully changed only partially + completeCode = KErrCompletion; + } + + // Update mode to CenRep + CRepository* cenrep = CRepository::NewLC( KCRUidPowerSaveMode ); + cenrep->Set( KPsmCurrentMode, iSettingsHandler->Mode() ); + CleanupStack::PopAndDestroy( cenrep ); + + // If mode change was cancelled, no need to notify observers + if ( !iModeChangeCancel ) + { + // Notify observers + NotifyObservers( completeCode ); + } + + // PSM change no longer active + iPowerSaveModeChangeActive = EFalse; + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::RunL - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmManager::NotifyObservers +// ----------------------------------------------------------------------------- +// +void CPsmManager::NotifyObservers( const TInt aError ) const + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::NotifyObservers()" ) ) ); + + // Notify mode observers + for ( TInt i = 0; i < iModeObservers.Count(); i++ ) + { + iModeObservers[i]->NotifyPsmModeChangeComplete( aError ); + } + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::NotifyObservers - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmManager::DoCancel +// ----------------------------------------------------------------------------- +// +void CPsmManager::DoCancel() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::DoCancel()" ) ) ); + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::DoCancel - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmManager::RunError +// ----------------------------------------------------------------------------- +// +TInt CPsmManager::RunError( TInt aError ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::RunError()" ) ) ); + + // RunError should never occur as there are no leaving possibilities in RunL. + // Keeping RunError for possible future use + + NotifyObservers( aError ); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CPsmManager::RegisterObserver +// ----------------------------------------------------------------------------- +// +void CPsmManager::RegisterObserver( MPsmModeChangeObserver* aObserver ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::RegisterObserver()" ) ) ); + iModeObservers.Append( aObserver ); + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::RegisterObserver - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmManager::UnregisterObserver +// ----------------------------------------------------------------------------- +// +void CPsmManager::UnregisterObserver( MPsmModeChangeObserver* aObserver ) + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::UnregisterObserver()" ) ) ); + + // Loop observers and remove if found + for ( TInt i = 0; i < iModeObservers.Count(); i++ ) + { + if ( aObserver == iModeObservers[ i ] ) + { + iModeObservers.Remove( i ); + } + } + + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::UnregisterObserver - return" ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPsmManager::SettingsProvider +// ----------------------------------------------------------------------------- +// +MPsmSettingsProvider& CPsmManager::SettingsProvider() + { + COMPONENT_TRACE( ( _L( "PSM Server - CPsmManager::SettingsProvider()" ) ) ); + return *iSettingsHandler; + } + +// End of file