diff -r b2bba7f74ac0 -r bcb8d447d716 idlefw/src/framework/aistatemanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlefw/src/framework/aistatemanager.cpp Sun Mar 14 13:11:02 2010 +0000 @@ -0,0 +1,581 @@ +/* +* Copyright (c) 2008 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: State Manager +* +*/ + +// System includes + +// User includes +#include +#include + +#include "aipluginfactory.h" + +#include "aistatemanager.h" + +#include "debug.h" + +// Constants +_LIT( KOnlineOffline, "online_offline" ); + +// ======== LOCAL FUNCTIONS ======== +// ---------------------------------------------------------------------------- +// StartReason +// +// ---------------------------------------------------------------------------- +// +static CHsContentPublisher::TStartReason StartReason( TAiFwLoadReason aReason ) + { + CHsContentPublisher::TStartReason reason; + + if ( aReason == EAiFwPageStartup ) + { + reason = CHsContentPublisher::EPageStartup; + } + else if ( aReason == EAiFwPluginStartup ) + { + reason = CHsContentPublisher::EPluginStartup; + } + else + { + reason = CHsContentPublisher::ESystemStartup; + } + + return reason; + } + +// ---------------------------------------------------------------------------- +// StopReason +// +// ---------------------------------------------------------------------------- +// +static CHsContentPublisher::TStopReason StopReason( TAiFwDestroyReason aReason ) + { + CHsContentPublisher::TStopReason reason; + + if ( aReason == EAiFwPageShutdown ) + { + reason = CHsContentPublisher::EPageShutdown; + } + else if ( aReason == EAiFwPluginShutdown ) + { + reason = CHsContentPublisher::EPluginShutdown; + } + else + { + reason = CHsContentPublisher::ESystemShutdown; + } + + return reason; + } + +// ======== MEMBER FUNCTIONS ======== +// ---------------------------------------------------------------------------- +// CAiStateManager::NewL() +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CAiStateManager* CAiStateManager::NewL( CAiPluginFactory& aFactory ) + { + CAiStateManager* self = CAiStateManager::NewLC( aFactory ); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::NewLC() +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CAiStateManager* CAiStateManager::NewLC( CAiPluginFactory& aFactory ) + { + CAiStateManager* self = new ( ELeave ) CAiStateManager( aFactory ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::~CAiStateManager() +// C++ default destructor. +// ---------------------------------------------------------------------------- +// +CAiStateManager::~CAiStateManager() + { + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::CAiStateManager() +// C++ default constructor. +// ---------------------------------------------------------------------------- +// +CAiStateManager::CAiStateManager( CAiPluginFactory& aFactory ) + : iFactory( aFactory ) + { + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::ConstructL() +// 2nd phase constructor +// ---------------------------------------------------------------------------- +// +void CAiStateManager::ConstructL() + { + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::NotifyStateChange() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::NotifyStateChange( TAiFwState aState ) + { + if ( aState == EAiFwUiShutdown ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwUiShutdown" ); + + iFlags.Set( EShutdown ); + + DestroyPlugins(); + + return; + } + else if ( aState == EAiFwUiStartup ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwUiStartup" ); + + iFlags.Clear( EShutdown ); + + return; + } + + TBitFlags32 flags( iFlags ); + + if ( aState == EAiFwForeground ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwForeground" ); + + iFlags.Set( EIsForeground ); + } + else if ( aState == EAiFwBackground ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwBackground" ); + + iFlags.Clear( EIsForeground ); + } + else if ( aState == EAiFwBacklightOn ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwBacklightOn" ); + + iFlags.Set( EIsLightsOn ); + } + else if ( aState == EAiFwBacklightOff ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwBacklightOff" ); + + iFlags.Clear( EIsLightsOn ); + } + else if ( aState == EAiFwOnline ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwOnline" ); + + iFlags.Set( EIsOnline ); + + ProcessOnlineStateChange(); + } + else if ( aState == EAiFwOffline ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwOffline" ); + + iFlags.Clear( EIsOnline ); + + ProcessOnlineStateChange(); + } + else if ( aState == EAiFwGeneralThemeChange ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwGeneralThemeChange" ); + + ProcessGeneralThemeChange(); + } + else if ( aState == EAiFwBackupRestoreStart || + aState == EAiFwBackupRestoreEnd ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwBackupRestoreStart/End" ); + + ProcessBackupRestore( aState == EAiFwBackupRestoreStart ); + } + else + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: Unknown" ); + } + + // State change evaluation and state change trial is done always here + __PRINTS( "CAiStateManager::NotifyStateChange, Run state change" ); + ProcessStateChange( EvaluateNextState() ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::NotifyLoadPlugin() +// +// ---------------------------------------------------------------------------- +// +TInt CAiStateManager::NotifyLoadPlugin( const THsPublisherInfo& aPublisherInfo, + TAiFwLoadReason aReason ) + { + __PRINT( __DBG_FORMAT( + "CAiStateManager::NotifyLoadPlugin: name: %S, reason: %d " ), + &aPublisherInfo.Name(), (TInt) aReason ); + + __TIME_MARK( time ); + + // Create plugin + TInt retval( iFactory.CreatePlugin( aPublisherInfo ) ); + + if ( retval == KErrNone ) + { + CHsContentPublisher* plugin( iFactory.PluginByInfo( aPublisherInfo ) ); + + // Do startup state transition + StartPlugin( *plugin, StartReason( aReason ) ); + } + + __TIME_ENDMARK( "CAiStateManager::NotifyLoadPlugin, construction", time ); + + return retval; + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::NotifyDestroyPlugin() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::NotifyDestroyPlugin( + const THsPublisherInfo& aPublisherInfo, TAiFwDestroyReason aReason ) + { + __PRINT( __DBG_FORMAT( + "CAiStateManager::NotifyDestroyPlugin: name: %S, reason: %d " ), + &aPublisherInfo.Name(), (TInt)aReason ); + + __TIME_MARK( time ); + + // Resolve plugin + CHsContentPublisher* plugin( iFactory.PluginByInfo( aPublisherInfo ) ); + + if ( plugin ) + { + // Do shutdown state transition + StopPlugin( *plugin, StopReason( aReason ) ); + + // Destroy plugin + iFactory.DestroyPlugin( aPublisherInfo ); + } + + __TIME_ENDMARK( "CAiStateManager::DestroyPlugin, done", time ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::NotifyUpdatePlugins() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::NotifyUpdatePlugins() + { + __PRINTS( "CAiStateManager::NotifyUpdatePlugins" ); + + RArray< THsPublisherInfo > publishers; + + // Get plugins which has upgrade available + TRAP_IGNORE( iFactory.ResolvePluginsToUpgradeL( publishers ) ); + + for ( TInt i = 0; i < publishers.Count(); i++ ) + { + THsPublisherInfo info( publishers[i] ); + + // Update by destroy - load sequence + NotifyDestroyPlugin( info, EAiFwSystemShutdown ); + NotifyLoadPlugin( info, EAiFwSystemStartup ); + } + + publishers.Reset(); + + __PRINTS( "CAiStateManager::NotifyUpdatePlugins, done" ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::OnlineStateInUse() +// +// ---------------------------------------------------------------------------- +// +TBool CAiStateManager::OnlineStateInUse() const + { + __PRINTS( "CAiStateManager::OnlineStateInUse" ); + + RPointerArray< CHsContentPublisher >& plugins( iFactory.Publishers() ); + + for( TInt i = 0; i < plugins.Count(); i++ ) + { + CHsContentPublisher* plugin( plugins[i] ); + + if ( plugin->HasMenuItem( KOnlineOffline() ) ) + { + return ETrue; + } + } + + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::EvaluateNextState() +// +// ---------------------------------------------------------------------------- +// +CAiStateManager::TState CAiStateManager::EvaluateNextState() const + { + TState nextState( iCurrentState ); + + if ( iFlags.IsSet( EIsForeground ) && iFlags.IsSet( EIsLightsOn ) ) + { + nextState = EAlive; + } + else + { + nextState = ESuspended; + } + + __PRINT( __DBG_FORMAT( + "CAiStateManager::EvaluateNextState: current state: %d, next state: %d" ), + (TInt)iCurrentState, (TInt)nextState ); + + return nextState; + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::ProcessStateChange() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::ProcessStateChange( TState aNextState ) + { + __PRINT( __DBG_FORMAT( + "CAiStateManager::ProcessStateChange: current state: %d, next state: %d, halt: &d" ), + (TInt)iCurrentState, (TInt)aNextState, iHalt ); + + __TIME_MARK( time ); + + if ( aNextState != iCurrentState ) + { + // Update state + iCurrentState = aNextState; + + RPointerArray< CHsContentPublisher >& plugins( iFactory.Publishers() ); + + // Process state for all + for( TInt i = 0; !iHalt && i < plugins.Count(); i++ ) + { + CHsContentPublisher* plugin( plugins[i] ); + + const THsPublisherInfo& info( plugin->PublisherInfo() ); + + __PRINT( __DBG_FORMAT( + "CAiStateManager::ProcessStateChange: name: %S" ), &info.Name() ); + + if ( iCurrentState == EAlive ) + { + __TIME( "CAiStateManager::ProcessStateChange, EAlive", + + plugin->Resume( CHsContentPublisher::EForeground ) ); + } + else if ( iCurrentState == ESuspended ) + { + __TIME( "CAiStateManager::ProcessStateChange, ESuspended", + + plugin->Suspend( CHsContentPublisher::EBackground ) ); + } + } + } + else + { + __PRINTS( "CAiStateManager::ProcessStateChange, no state change" ); + } + + __TIME_ENDMARK( "CAiStateManager::ProcessStateChange, done", time ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::ProcessGeneralThemeChange() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::ProcessGeneralThemeChange() + { + __PRINTS( "CAiStateManager::ProcessGeneralThemeChange" ); + __TIME_MARK( time ); + + RPointerArray< CHsContentPublisher >& plugins( iFactory.Publishers() ); + + for( TInt i = 0; i < plugins.Count(); i++ ) + { + CHsContentPublisher* plugin( plugins[i] ); + + plugin->Suspend( CHsContentPublisher::EGeneralThemeChange ); + + // Resume publisher immediately if in alive state + if( !iHalt && iCurrentState == EAlive ) + { + plugin->Resume( CHsContentPublisher::EForeground ); + } + } + + __TIME_ENDMARK( "CAiStateManager::ProcessGeneralThemeChange, done", time ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::ProcessBackupRestore() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::ProcessBackupRestore( TBool aStart ) + { + __PRINTS( "CAiStateManager::ProcessBackupRestore" ); + __TIME_MARK( time ); + + iHalt = aStart; + + RPointerArray< CHsContentPublisher >& plugins( iFactory.Publishers() ); + + for( TInt i = 0; i < plugins.Count(); i++ ) + { + CHsContentPublisher* plugin( plugins[i] ); + + if ( aStart ) + { + plugin->Suspend( CHsContentPublisher::EBackupRestore ); + } + else + { + // Resume publisher immediately if in alive state + if ( !iHalt && iCurrentState == EAlive ) + { + plugin->Resume( CHsContentPublisher::EForeground ); + } + } + } + + __TIME_ENDMARK( "CAiStateManager::ProcessBackupRestore, done", time ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::ProcessOnlineStateChange() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::ProcessOnlineStateChange() + { + __PRINTS( "CAiStateManager::ProcessOnlineStateChange" ); + + RPointerArray< CHsContentPublisher >& plugins( iFactory.Publishers() ); + + for( TInt i = 0; i < plugins.Count(); i++ ) + { + CHsContentPublisher* plugin( plugins[i] ); + + if ( iFlags.IsSet( EIsOnline ) ) + { + plugin->SetOnline(); + } + else + { + plugin->SetOffline(); + } + } + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::StartPlugin() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::StartPlugin( CHsContentPublisher& aPlugin, + CHsContentPublisher::TStartReason aReason ) + { + __PRINTS( "CAiStateManager::StartPlugin" ); + + aPlugin.Start( aReason ); + + if ( iCurrentState == EAlive ) + { + aPlugin.Resume( CHsContentPublisher::EForeground ); + } + else if ( iCurrentState == ESuspended ) + { + aPlugin.Suspend( CHsContentPublisher::EBackground ); + } + + if ( iFlags.IsSet( EIsOnline ) ) + { + aPlugin.SetOnline(); + } + else + { + aPlugin.SetOffline(); + } + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::StopPlugin() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::StopPlugin( CHsContentPublisher& aPlugin, + CHsContentPublisher::TStopReason aReason ) + { + __PRINTS( "CAiStateManager::StopPlugin" ); + + if ( iCurrentState == EAlive ) + { + aPlugin.Suspend( CHsContentPublisher::EBackground ); + } + + aPlugin.Stop( aReason ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::DestroyPlugins() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::DestroyPlugins() + { + __PRINTS( "CAiStateManager::DestroyPlugins, start" ); + __TIME_MARK( time ); + + RPointerArray< CHsContentPublisher >& plugins( iFactory.Publishers() ); + + for ( TInt i = 0; i < plugins.Count(); i++ ) + { + CHsContentPublisher* plugin( plugins[i] ); + + // Do shutdown state transition + StopPlugin( *plugin, CHsContentPublisher::ESystemShutdown ); + } + + // Finally get rid of all plugins + plugins.ResetAndDestroy(); + + __TIME_ENDMARK( "CAiStateManager::DestroyPlugins, done", time ); + } + +// End of file