diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/ServerCore/Src/alfsrvresourcemanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/ServerCore/Src/alfsrvresourcemanager.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,252 @@ +/* +* 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: Manager for cross-session resources. +* +*/ + + + + +#include "alfsrvresourcemanager.h" +#include "alflogger.h" +#include "alf/alfappsrvsessionbase.h" +#include + +// Internal flags +enum TAlfSchedulerFlags + { + EAlfSchedulerFlagPrimaryDisplayLightsOn = 0x01, + EAlfSchedulerFlagSecondaryDisplayLightsOn = 0x02, + EAlfSchedulerFlagApplicationForeground = 0x04 + }; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CAlfSrvResourceManager::CAlfSrvResourceManager( CHuiEnv& aEnv ) + : iEnv( aEnv ) + { + } + + +// --------------------------------------------------------------------------- +// ConstructL +// Checks the initial flag states. +// --------------------------------------------------------------------------- +// +void CAlfSrvResourceManager::ConstructL() + { + // TODO: Causes random crash during boot, revise + // iLight = CHWRMLight::NewL(this); // Calls LightStatusChanged() + + iFlags |= EAlfSchedulerFlagApplicationForeground; + + // Workaround for non-working light status reports + iFlags |= EAlfSchedulerFlagPrimaryDisplayLightsOn; + } + + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CAlfSrvResourceManager* CAlfSrvResourceManager::NewL( CHuiEnv& aEnv ) + { + CAlfSrvResourceManager* self = new( ELeave ) CAlfSrvResourceManager( aEnv ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CAlfSrvResourceManager::~CAlfSrvResourceManager() + { + // delete iLight; + iActiveSession = NULL; + } + + +// --------------------------------------------------------------------------- +// Called when the application server's window visibility changes. +// --------------------------------------------------------------------------- +// +void CAlfSrvResourceManager::SetServerWindowPartiallyVisible( TBool aVisible ) + { + __ALFLOGSTRING1( "CAlfSrvResourceManager::SetServerWindowPartiallyVisible %d", aVisible ) + if ( aVisible ) + { + iFlags |= EAlfSchedulerFlagApplicationForeground; + } + else + { + iFlags &= ~EAlfSchedulerFlagApplicationForeground; + } + + UpdateSchedulerState(); + } + +// --------------------------------------------------------------------------- +// Called when active session changes. +// --------------------------------------------------------------------------- +// +void CAlfSrvResourceManager::SetActiveSession( CAlfAppSrvSessionBase* aSession ) + { + __ALFLOGSTRING1( "CAlfSrvResourceManager::SetActiveSession 0x%x", aSession ) + iActiveSession = aSession; + } + +// --------------------------------------------------------------------------- +// Checks the flags and restarts/pauses the scheduler accordingly. +// --------------------------------------------------------------------------- +// +void CAlfSrvResourceManager::UpdateSchedulerState() + { + if ( LightsOn() && + iFlags&EAlfSchedulerFlagApplicationForeground ) + { + // Run the scheduler + Run(); + } + // Run the scheduler if there is observer to Screen Buffer. + // refer CAlfScreenBuffer and CAlfScreenBufferEventFetcher classes + else if(LightsOn() && iEnv.DisplayCount() > 0 && iEnv.PrimaryDisplay().ScreenBufferObserver() ) + { + Run(); + } + else + { + // Pause schduler + Pause(); + } + } + +// --------------------------------------------------------------------------- +// Restarts the scheduler. +// --------------------------------------------------------------------------- +// +void CAlfSrvResourceManager::Run() + { + __ALFLOGSTRING( "CAlfSrvResourceManager::Run") + if ( iActiveSession ) + { + if ( iEnv.RefreshMode() != iActiveSession->PreferredRefreshMode() ) + { + iEnv.SetRefreshMode( iActiveSession->PreferredRefreshMode() ); + } + } + else + { + iEnv.SetRefreshMode( EHuiRefreshModeAutomatic ); + } + } + +// --------------------------------------------------------------------------- +// Pauses the scheduler. +// Current implementation set the refresh mode to manual. +// --------------------------------------------------------------------------- +// +void CAlfSrvResourceManager::Pause() + { + if ( iEnv.RefreshMode() == EHuiRefreshModeManual ) + { + return; // Already paused + } + + __ALFLOGSTRING( "CAlfSrvResourceManager::Pause") +#ifndef SYMBIAN_BUILD_GCE + iEnv.SetRefreshMode( EHuiRefreshModeManual ); +#endif + } + +// --------------------------------------------------------------------------- +// Checks if either of the display lights are on. +// --------------------------------------------------------------------------- +// +TBool CAlfSrvResourceManager::LightsOn() const + { + if ( iFlags&EAlfSchedulerFlagPrimaryDisplayLightsOn || + iFlags&EAlfSchedulerFlagSecondaryDisplayLightsOn ) + { + return ETrue; + } + return EFalse; + } + +// --------------------------------------------------------------------------- +// From class MHWRMLightObserver. +// Called when the lights change. +// --------------------------------------------------------------------------- +// +void CAlfSrvResourceManager::LightStatusChanged(TInt aTarget, CHWRMLight::TLightStatus aStatus) + { + // If set at the end of the function, the UpdateSchedulerState() is called. + TBool updateScheduler = EFalse; + + // Check the primary display + if( aTarget&CHWRMLight::EPrimaryDisplay ) + { + if( aStatus == CHWRMLight::ELightOn || + aStatus == CHWRMLight::ELightStatusUnknown ) + { + iFlags |= EAlfSchedulerFlagPrimaryDisplayLightsOn; + __ALFLOGSTRING( "CAlfSrvResourceManager::LightStatusChanged Primary ON") + } + else if( aStatus == CHWRMLight::ELightOff ) + { + iFlags &= ~EAlfSchedulerFlagPrimaryDisplayLightsOn; + __ALFLOGSTRING( "CAlfSrvResourceManager::LightStatusChanged Primary OFF") + } + else + { + // for PC lint + } + updateScheduler = ETrue; + } + + // Check the secondary display + if ( aTarget&CHWRMLight::ESecondaryDisplay ) + { + if( aStatus == CHWRMLight::ELightOn || + aStatus == CHWRMLight::ELightStatusUnknown ) + { + iFlags |= EAlfSchedulerFlagSecondaryDisplayLightsOn; + __ALFLOGSTRING( "CAlfSrvResourceManager::LightStatusChanged Secondary ON") + } + else if( aStatus == CHWRMLight::ELightOff ) + { + iFlags &= ~EAlfSchedulerFlagSecondaryDisplayLightsOn; + __ALFLOGSTRING( "CAlfSrvResourceManager::LightStatusChanged Secondary OFF") + } + else + { + // for PC lint + } + updateScheduler = ETrue; + } + + // update the scheduler state if the light status has been changed. + if ( updateScheduler ) + { + UpdateSchedulerState(); + } + } +