diff -r 0efa10d348c0 -r a5a39a295112 idlefw/src/framework/aistatemanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlefw/src/framework/aistatemanager.cpp Wed Sep 01 12:22:09 2010 +0100 @@ -0,0 +1,577 @@ +/* +* 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 + +#include "caicpscommandbuffer.h" +#include "aipluginfactory.h" + +#include "aistatemanager.h" + +// ======== LOCAL FUNCTIONS ======== +// ---------------------------------------------------------------------------- +// StartReason +// +// ---------------------------------------------------------------------------- +// +static CHsContentPublisher::TStartReason StartReason( TInt 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( TInt 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() + { + iReloadPlugins.Reset(); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::CAiStateManager() +// C++ default constructor. +// ---------------------------------------------------------------------------- +// +CAiStateManager::CAiStateManager( CAiPluginFactory& aFactory ) + : iFactory( aFactory ) + { + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::ConstructL() +// 2nd phase constructor +// ---------------------------------------------------------------------------- +// +void CAiStateManager::ConstructL() + { + iFactory.SetStateManager( this ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::NotifyStateChange() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::NotifyStateChange( TAiFwState aState ) + { + if ( aState == EAiFwUiShutdown ) + { + __PRINTS( "CAiStateManager::NotifyStateChange, aState: EAiFwUiShutdown" ); + + iFlags.Set( EShutdown ); + + iFactory.DestroyAllPlugins(); + + 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() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::NotifyLoadPlugin( const TAiFwPublisherInfo& aInfo ) + { + __PRINT( __DBG_FORMAT( + "CAiStateManager::NotifyLoadPlugin: name: %S, reason: %d " ), + &aInfo.Info().Name(), aInfo.Reason() ); + + __TIME_MARK( time ); + + iFactory.LoadPlugin( aInfo ); + + __TIME_ENDMARK( "CAiStateManager::NotifyLoadPlugin - done", time ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::NotifyDestroyPlugin() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::NotifyDestroyPlugin( const TAiFwPublisherInfo& aInfo ) + { + __PRINT( __DBG_FORMAT( + "CAiStateManager::NotifyDestroyPlugin: name: %S, reason: %d " ), + &aInfo.Info().Name(), aInfo.Reason() ); + + __TIME_MARK( time ); + + iFactory.DestroyPlugin( aInfo ); + + __TIME_ENDMARK( "CAiStateManager::DestroyPlugin - done", time ); + } + +// ---------------------------------------------------------------------------- +// 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 ) ); + } + } + + iFactory.FlushCommandBuffer(); + } + 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 ); + } + } + + iFactory.FlushCommandBuffer(); + + __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 ); + } + } + } + + iFactory.FlushCommandBuffer(); + + __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(); + } + } + + iFactory.FlushCommandBuffer(); + + __PRINTS( "CAiStateManager::ProcessOnlineStateChange - done" ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::StartPlugin() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::StartPlugin( CHsContentPublisher& aPlugin, TInt aReason ) + { + const THsPublisherInfo& info( aPlugin.PublisherInfo() ); + + __PRINT( __DBG_FORMAT( + "CAiStateManager::StartPlugin: name: %S, reason: %d" ), &info.Name(), (TInt)aReason ); + + aPlugin.Start( StartReason( aReason ) ); + + if ( iCurrentState == EAlive ) + { + __TIME( "CAiStateManager::StartPlugin, enter EAlive", + + aPlugin.Resume( CHsContentPublisher::EForeground ) ); + } + else if ( iCurrentState == ESuspended ) + { + __TIME( "CAiStateManager::StartPlugin, enter ESuspended", + + aPlugin.Suspend( CHsContentPublisher::EBackground ) ); + } + + if ( iFlags.IsSet( EIsOnline ) ) + { + __TIME( "CAiStateManager::StartPlugin, Set Online", + + aPlugin.SetOnline() ); + } + else + { + __TIME( "CAiStateManager::StartPlugin, Set Offline", + + aPlugin.SetOffline() ); + } + + __PRINTS( "CAiStateManager::StartPlugin - done" ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::StopPlugin() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::StopPlugin( CHsContentPublisher& aPlugin, TInt aReason ) + { + const THsPublisherInfo& info( aPlugin.PublisherInfo() ); + + __PRINT( __DBG_FORMAT( + "CAiStateManager::StopPlugin: name: %S, reason: %d" ), &info.Name(), (TInt)aReason ); + + if ( iCurrentState == EAlive ) + { + __TIME( "CAiStateManager::StopPlugin, enter ESuspended", + + aPlugin.Suspend( CHsContentPublisher::EBackground ) ); + } + + aPlugin.Stop( StopReason( aReason ) ); + + __PRINTS( "CAiStateManager::StopPlugin - done" ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::NotifyReloadPlugins() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::NotifyReloadPlugins() + { + __PRINTS( "CAiStateManager::NotifyReloadPlugins" ); + + // Factory needs to update its ecom plugins list + TRAP_IGNORE( iFactory.ListImplementationsL() ); + + for ( TInt i = 0; i < iReloadPlugins.Count(); i++ ) + { + TAiFwPublisherInfo info( iReloadPlugins[i], + TAiFwCallback(), EAiFwSystemStartup ); + + // Reload plugin + NotifyLoadPlugin( info ); + } + + iReloadPlugins.Reset(); + + __PRINTS( "CAiStateManager::NotifyReloadPlugins - done" ); + } + +// ---------------------------------------------------------------------------- +// CAiStateManager::NotifyReleasePlugins() +// +// ---------------------------------------------------------------------------- +// +void CAiStateManager::NotifyReleasePlugins( const RArray& aUidList ) + { + __PRINTS( "CAiStateManager::NotifyReleasePlugins" ); + + iReloadPlugins.Reset(); + + TBool flush( EFalse ); + + for ( TInt i = 0; i < aUidList.Count(); i++ ) + { + const TUid& uid( aUidList[ i ] ); + + CHsContentPublisher* plugin( iFactory.PluginByUid( uid ) ); + + while ( plugin ) + { + StopPlugin( *plugin, CHsContentPublisher::ESystemShutdown ); + + const THsPublisherInfo& info( plugin->PublisherInfo() ); + iReloadPlugins.Append( info ); + + iFactory.DestroyPlugin( uid ); + + flush = ETrue; + + // Get next plugin with same uid + plugin = iFactory.PluginByUid( uid ); + } + } + + if ( flush ) + { + iFactory.FlushCommandBuffer(); + } + + __PRINTS( "CAiStateManager::NotifyReleasePlugins - done" ); + } + +// End of file