diff -r 000000000000 -r 4e1aa6a622a0 resourcemgmt/hwresourcesmgr/server/src/HWRMLightCommonData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resourcemgmt/hwresourcesmgr/server/src/HWRMLightCommonData.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,674 @@ +// Copyright (c) 2006-2009 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: +// + + + + +// INCLUDE FILES +#include "HWRMtrace.h" +#include "HWRMLightDomainCRKeys.h" +#include "HWRMLightCommonData.h" +#include "HWRMClientServer.h" +#include "HWRMPrivatePSKeys.h" +#include "HWRMConfiguration.h" +#include "HWRMLightClientServer.h" +#include "HWRMLightService.h" +#include "HWRMLightCommands.h" +#include "HWRMFeatureMgr.h" +#include + + +#include "HWRMTargetModifierPlugin.h" + +// EXTERNAL DATA STRUCTURES +// None + +// EXTERNAL FUNCTION PROTOTYPES +// None + +// CONSTANTS +/** +* Minimum allowed sensor sensitivity setting for Light +*/ +const TInt KHWRMLightMinSensitivity(1); + +/** +* Maximum allowed sensor sensitivity setting for Light +*/ +const TInt KHWRMLightMaxSensitivity(100); + +/** +* Maximum inactivity time for lights on in seconds +*/ +const TInt KHWRMLightMaxInactivity(60); + +/** +* Minimum inactivity time for lights on in seconds +*/ +const TInt KHWRMLightMinInactivity(5); + +/** +* Default inactivity time for lights on in seconds. +* Used if observer cannot be set up. +*/ +const TInt KHWRMLightDefaultInactivity(15); + +// MACROS +// None + +// LOCAL CONSTANTS AND MACROS +// None + +// MODULE DATA STRUCTURES +// None + +// LOCAL FUNCTION PROTOTYPES +// None + +// FORWARD DECLARATIONS +// None + +// ============================= LOCAL FUNCTIONS =============================== + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::CHWRMLightCommonData +// C++ constructor +// ----------------------------------------------------------------------------- +// +CHWRMLightCommonData::CHWRMLightCommonData() + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMLightCommonData::CHWRMLightCommonData()" ) ); + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMLightCommonData::CHWRMLightCommonData - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CHWRMLightCommonData::ConstructL(CHWRMPluginHandler* aPluginHandler, + CHWRMReservationHandler* aReservationHandler) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMLightCommonData::ConstructL()" ) ); + + //The feature UID NFeature::KAmbientLightSensor is defined in featureuids.h + iSensorSupported = HWRMFeatureMgr::IsFeatureSupported( NFeature::KAmbientLightSensor ); + // Load target modifier plugin, if such a thing exists. + // Plugin is not mandatory for HWRM functionality, + // but the light control logic will be broken if the plugin is dropped from the image. + TRAPD( err, iTargetModifier = CHWRMTargetModifierPlugin::NewL( KHWRMLightApiEComMatch ) ); + if ( err != KErrNone ) + { + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::ConstructL - Target modifier plugin not loaded; cause: %d" ), err ); + } + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::ConstructL - Sensor support: 0x%x" ), iSensorSupported ); + + ResetCenrepL(); + + // Initialize full system target. Ensure that only supported targets are included. + if ( iTargetModifier ) + { + iFullSystemTarget = iTargetModifier->GetFullSystemTarget() & iSupportedTargets; + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::ConstructL - Full System Target: 0x%x" ), iFullSystemTarget ); + } + + // Set up status P&S values + User::LeaveIfError(RProperty::Define(KPSUidHWResourceNotification, KHWRMLightStatus, RProperty::EByteArray, KNoCapability, KHWRMSidOnlyPolicy)); + User::LeaveIfError(iLightStatusProperty.Attach(KPSUidHWResourceNotification, KHWRMLightStatus)); + + TInt currentTarget( KHWRMLightFirstTarget ); + + for( TInt i = 0; i < KHWRMLightMaxTargets; i++ ) + { + THWRMStatusInfo info; + info.iTarget = currentTarget; + info.iStatus = CHWRMExtendedLight::ELightStatusUnknown; + iStatusList.AppendL( info ); + // shift the mask and target ready for next loop + currentTarget <<= 1; + } + + TInt arraySize = ( sizeof( THWRMStatusInfo ) ) * KHWRMLightMaxTargets; + TPtr8 arrayPtr( ( TUint8* )&iStatusList[0], arraySize, arraySize ); + + User::LeaveIfError( iLightStatusProperty.Set( arrayPtr ) ); + + // Construct light service last so that the common data is in order to be used + // in service construction. + iLightService = CHWRMLightService::NewL(aPluginHandler, aReservationHandler, *this); + + // Reset intensity and sensitivity to update values to plugin, + // as lightservice is not yet available when ResetCenrepL was called earlier. + SetDefaultIntensity(iDefaultIntensity, ETrue); + + if ( iSensorSupported ) + { + SetDefaultSensitivity(iDefaultSensitivity, ETrue); + } + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMLightCommonData::ConstructL - return " ) ); + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CHWRMLightCommonData* CHWRMLightCommonData::NewL(CHWRMPluginHandler* aPluginHandler, + CHWRMReservationHandler* aReservationHandler) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMLightCommonData::NewL()" ) ); + + CHWRMLightCommonData* self = new( ELeave ) CHWRMLightCommonData(); + + CleanupStack::PushL( self ); + self->ConstructL(aPluginHandler, aReservationHandler); + CleanupStack::Pop(); + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::NewL - return 0x%x" ), self ); + + return self; + } + +// --------------------------------------------------------- +// Destructor +// --------------------------------------------------------- +// +CHWRMLightCommonData::~CHWRMLightCommonData() + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMLightCommonData::~CHWRMLightCommonData()" ) ); + + delete iLightService; + iLightService = NULL; + + // Destroy target modifier plugin + delete iTargetModifier; + iTargetModifier = NULL; + + // Clean up central repository related data + CleanCenrep(); + + iLightStatusProperty.Close(); + + // NULL these references so that pc-lint will not complain. + // They are cleaned in CleanCenrep(); + iIntensityNotifyHandler = NULL; + iSensitivityNotifyHandler = NULL; + iSensorNotifyHandler = NULL; + iRepository = NULL; + iLightsTimeoutObserver = NULL; + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMLightCommonData::~CHWRMLightCommonData - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::PublishLightStatus +// ----------------------------------------------------------------------------- +// +void CHWRMLightCommonData::PublishLightStatus(TInt aTarget, CHWRMLight::TLightStatus aStatus) + { + COMPONENT_TRACE3(_L("HWRM Server - CHWRMLightCommonData::PublishLightStatus(0x%x, 0x%x)"), aTarget, aStatus); + + // Publish Light status to P&S. If publishing fails, something is very wrong + // with P&S, so ignore it. If it is memory issue, hopefully it will work + // next time. If it is not, we can't do anything about it anyway. + + TInt err(KErrNone); + + // Loop through target and update correct indexes of iStatusList + TInt currentTarget(KHWRMLightFirstTarget); + TInt currentStatus = aStatus; + + for ( int i = 0; i < KHWRMLightMaxTargets; i++ ) + { + if ( aTarget & currentTarget ) + { + THWRMStatusInfo info; + info.iTarget = currentTarget; + info.iStatus = currentStatus; + const TInt& target( info.iTarget ); + TInt j = iStatusList.FindInOrder( target, FindByTarget ); + + if ( j >= 0 && j < KHWRMLightMaxTargets ) + { + iStatusList[j].iStatus = currentStatus; + } + } + // shift the mask and target ready for next loop + currentTarget <<= 1; + } + + COMPONENT_TRACE1( (_L("HWRM Server - CHWRMLightCommonData::PublishLightStatus - Setting light status property.") ) ); + + TInt arraySize = ( sizeof( THWRMStatusInfo ) ) * KHWRMLightMaxTargets; + TPtr8 arrayPtr( ( TUint8* )&iStatusList[0], arraySize, arraySize ); + + err = iLightStatusProperty.Set( arrayPtr ); + + if ( err != KErrNone ) + { + COMPONENT_TRACE2(_L("HWRM Server - CHWRMLightCommonData::PublishLightStatus - Property set failed: %d"), err ); + } + COMPONENT_TRACE1(_L("HWRM Server - CHWRMLightCommonData::PublishLightStatus - return")); + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::DefaultSensitivity +// ----------------------------------------------------------------------------- +// +TInt CHWRMLightCommonData::DefaultSensitivity() + { + if ( !iRepository ) + { + TRAP_IGNORE(ResetCenrepL()); + } + + return iDefaultSensitivity; + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::SensorEnabled +// ----------------------------------------------------------------------------- +// +TBool CHWRMLightCommonData::SensorEnabled() + { + TBool retval(EFalse); + + if ( iSensorSupported ) + { + if ( !iRepository ) + { + TRAP_IGNORE(ResetCenrepL()); + } + + retval = iSensorOn; + } + + return retval; + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::DefaultState +// ----------------------------------------------------------------------------- +// +CHWRMLight::TLightStatus CHWRMLightCommonData::DefaultState() const + { + CHWRMLight::TLightStatus retval(CHWRMLight::ELightOn); + + if ( (User::InactivityTime()).Int() >= iInactivityLimit ) + { + retval = CHWRMLight::ELightOff; + } + + COMPONENT_TRACE4(_L("HWRM Server - CHWRMLightCommonData::DefaultState - Inactivitity time: %d, Limit: %d, State: %d"), (User::InactivityTime()).Int(), iInactivityLimit, retval); + + return retval; + } + + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::HandleNotifyInt +// ----------------------------------------------------------------------------- +// +void CHWRMLightCommonData::HandleNotifyInt(TUint32 aId, TInt aNewValue) + { + COMPONENT_TRACE3(_L("HWRM Server - CHWRMLightCommonData::HandleNotifyInt(0x%x, 0x%x)"), aId, aNewValue) ; + + switch(aId) + { + case KLightIntensity: + { + SetDefaultIntensity(aNewValue); + break; + } + case KLightSensorSensitivity: + { + SetDefaultSensitivity(aNewValue); + break; + } + case KLightSensorInUse: + { + iSensorOn = (aNewValue != 0); + COMPONENT_TRACE2(_L("HWRM Server - CHWRMLightCommonData::HandleNotifyInt - Sensor set: %d"), iSensorOn); + + // Set lights on unless sensor is not supported or inactivity time passed + if ( iLightService && + iSensorSupported && + DefaultState() == CHWRMLight::ELightOn ) + { + iLightService->SystemLightsOn(); + } + + break; + } + default: + { + // Do nothing, as key does not concern us. + COMPONENT_TRACE2(_L("HWRM Server - CHWRMLightCommonData::HandleNotifyInt - Invalid key notified: 0x%x"), aId ); + break; + } + } + + COMPONENT_TRACE1(_L("HWRM Server - CHWRMLightCommonData::HandleNotifyInt - return") ); + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::HandleNotifyError +// ----------------------------------------------------------------------------- +// +#if defined(COMPONENT_TRACE_FLAG) && defined(_DEBUG) +void CHWRMLightCommonData::HandleNotifyError(TUint32 aId, TInt error, CCenRepListener* aHandler) +#else +void CHWRMLightCommonData::HandleNotifyError(TUint32 /*aId*/, TInt /*error*/, CCenRepListener* /*aHandler*/) +#endif + { + COMPONENT_TRACE4(_L("HWRM Server - CHWRMLightCommonData::HandleNotifyError(0x%x, 0x%x, 0x%x)"), aId, error, aHandler); + + // Try to restart cenrep related functionality. If it fails, clean up and try to restart when values are asked next. + TRAPD(err, ResetCenrepL()); + + if (err != KErrNone) + { + CleanCenrep(); + COMPONENT_TRACE2(_L("HWRM Server - CHWRMLightCommonData::HandleNotifyError - Cenrep reset failed: %d"), err ); + } + + COMPONENT_TRACE1(_L("HWRM Server - CHWRMLightCommonData::HandleNotifyError - return") ); + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::SetDefaultIntensity +// ----------------------------------------------------------------------------- +// +void CHWRMLightCommonData::SetDefaultIntensity(TInt aValue, TBool aConstructCall) + { + iDefaultIntensity = aValue; + + if ( iDefaultIntensity < KHWRMLightMinIntensity ) + { + iDefaultIntensity = KHWRMLightMinIntensity; + } + else if ( iDefaultIntensity > KHWRMLightMaxIntensity) + { + iDefaultIntensity = KHWRMLightMaxIntensity; + } + else + { + // no else + } + + // Update value to plugin, if iLightService is initialized + if ( iLightService ) + { + TInt target(iSupportedTargets); + + if(aConstructCall) + { + target = iFullSystemTarget; //During bootup, intensity of system targets supported in the platform are changed. + } + + TRAPD( err, iLightService->UpdateDefaultIntensityL(target, iDefaultIntensity) ); + + if ( err != KErrNone ) + { + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::SetDefaultIntensity - Error updating plugin: %d" ), err ); + } + else + { + // Intensity change successful. + // Set lights on unless sensor control is enabled or inactivity time passed or this is called from constructor + if ( !aConstructCall && + !(iSensorSupported && iSensorOn) && + DefaultState() == CHWRMLight::ELightOn ) + { + iLightService->SystemLightsOn(); + } + } + } + + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::SetDefaultIntensity: %d" ), iDefaultIntensity ); + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::SetDefaultSensitivity +// ----------------------------------------------------------------------------- +// +void CHWRMLightCommonData::SetDefaultSensitivity(TInt aValue, TBool aConstructCall) + { + iDefaultSensitivity = aValue; + + if ( iDefaultSensitivity < KHWRMLightMinSensitivity ) + { + iDefaultSensitivity = KHWRMLightMinSensitivity; + } + else if ( iDefaultSensitivity > KHWRMLightMaxSensitivity) + { + iDefaultSensitivity = KHWRMLightMaxSensitivity; + } + else + { + // no else + } + + // Update value to plugin, if iLightService is initialized + if ( iLightService && iSensorSupported) + { + TRAPD( err, iLightService->UpdateDefaultSensitivityL(iDefaultSensitivity) ); + + if ( err != KErrNone ) + { + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::SetDefaultSensitivity - Error updating plugin: %d" ), err ); + } + else + { + // Sensitivity change successful. + // Set lights on unless sensor control is not enabled or inactivity time passed or this is called from constructor + if ( !aConstructCall && + iSensorOn && + DefaultState() == CHWRMLight::ELightOn ) + { + iLightService->SystemLightsOn(); + } + } + } + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::SetDefaultSensitivity: %d" ), iDefaultSensitivity ); + } + + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::LightsTimeoutChange +// ----------------------------------------------------------------------------- +// +void CHWRMLightCommonData::LightsTimeoutChange(TInt aTimeout) + { + if ( aTimeout < KHWRMLightMinInactivity ) + { + iInactivityLimit = KHWRMLightMinInactivity; + } + else if ( aTimeout > KHWRMLightMaxInactivity ) + { + iInactivityLimit = KHWRMLightMaxInactivity; + } + else + { + iInactivityLimit = aTimeout; + } + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::LightsTimeoutChange: %d" ), iInactivityLimit ); + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::CleanCenrep +// Cleans the central repository related functionality. +// ----------------------------------------------------------------------------- +// +void CHWRMLightCommonData::CleanCenrep() + { + COMPONENT_TRACE1(_L("HWRM Server - CHWRMLightCommonData::CleanCenrep()") ); + + if ( iIntensityNotifyHandler ) + { + iIntensityNotifyHandler->StopListening(); + } + if ( iSensitivityNotifyHandler ) + { + iSensitivityNotifyHandler->StopListening(); + } + if ( iSensorNotifyHandler ) + { + iSensorNotifyHandler->StopListening(); + } + + delete iIntensityNotifyHandler; + delete iSensitivityNotifyHandler; + delete iSensorNotifyHandler; + delete iRepository; + delete iLightsTimeoutObserver; + + iIntensityNotifyHandler = NULL; + iSensitivityNotifyHandler = NULL; + iSensorNotifyHandler = NULL; + iRepository = NULL; + iLightsTimeoutObserver = NULL; + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMLightCommonData::CleanCenrep - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::ResetCenrepL +// (Re)starts the central repository related functionality. +// ----------------------------------------------------------------------------- +// +void CHWRMLightCommonData::ResetCenrepL() + { + COMPONENT_TRACE1(_L("HWRM Server - CHWRMLightCommonData::ResetCenrep()") ); + + CleanCenrep(); + + // Get read only values from cenrep + iRepository = CRepository::NewL(KCRUidLightSettings); + + TInt value(0); + User::LeaveIfError(iRepository->Get(KLightIntensity, value)); + SetDefaultIntensity(value); + + User::LeaveIfError(iRepository->Get(KLightTargetMask, iSupportedTargets)); + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::ConstructL - iSupportedTargets: 0x%x" ), iSupportedTargets ); + + // All target combinations up to all targets defined are legal, so snip the rest off + iSupportedTargets &= KHWRMAllTargets; + + if ( iSensorSupported ) + { + User::LeaveIfError(iRepository->Get(KLightSensorSensitivity, value)); + SetDefaultSensitivity(value); + + User::LeaveIfError(iRepository->Get(KLightSensorInUse, value)); + iSensorOn = (value != 0); + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::ConstructL - iSensorOn: %d" ), iSensorOn ); + + TInt err = iRepository->Get(KLightSensorMask, iSensorTargets); + + if ( err == KErrNone ) + { + // Sensor targets can only contain supported targets. + iSensorTargets &= iSupportedTargets; + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::ConstructL - iSensorTargets: 0x%x" ), iSensorTargets ); + } + else + { + iSensorTargets = iSupportedTargets; + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMLightCommonData::ConstructL - Error getting sensor targets: %d, assuming all targets are sensor targets" ), err ); + } + } + + // Set up cenrep notify handlers for each key + // (separate handlers to ensure that notifications correctly also in repository resets) + iIntensityNotifyHandler = CCenRepListener::NewL(*this, + *iRepository, + KLightIntensity); + iIntensityNotifyHandler->StartListeningL(); + + if ( iSensorSupported ) + { + iSensitivityNotifyHandler = CCenRepListener::NewL(*this, + *iRepository, + KLightSensorSensitivity); + iSensorNotifyHandler = CCenRepListener::NewL(*this, + *iRepository, + KLightSensorInUse); + iSensitivityNotifyHandler->StartListeningL(); + iSensorNotifyHandler->StartListeningL(); + } + + + TRAPD( err, iLightsTimeoutObserver = CHWRMLightsTimeoutObserver::NewL(this)); + + if ( err != KErrNone ) + { + // Use default value if timeout observer cannot be created + iInactivityLimit = KHWRMLightDefaultInactivity; + COMPONENT_TRACE2(_L("HWRM Server - CHWRMLightCommonData::ResetCenrep - Using default lights timeout value: %d "),iInactivityLimit ); + } + + COMPONENT_TRACE1(_L("HWRM Server - CHWRMLightCommonData::ResetCenrep - return") ); + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::ModifyTargetL +// Passes the call to target modifier plugin +// ----------------------------------------------------------------------------- +// +TInt CHWRMLightCommonData::ModifyTargetL(TInt aTarget) + { + // If target modifier plugin doesn't exist, just return the target + if ( iTargetModifier ) + { + return iTargetModifier->ModifyTargetL( aTarget); + } + else + { + COMPONENT_TRACE1(_L("HWRM Server - CHWRMLightCommonData::ModifyTargetL - Target modifier plugin NULL, no modification") ); + return aTarget; + } + } + +// ----------------------------------------------------------------------------- +// CHWRMLightCommonData::FindByTarget +// Finds item from iStatusList by target. +// ----------------------------------------------------------------------------- +// +TInt CHWRMLightCommonData::FindByTarget( const TInt* aTarget, + const THWRMStatusInfo& aItem ) + { + if ( *aTarget < aItem.iTarget ) + { + return -1; + } + else if ( *aTarget > aItem.iTarget ) + { + return 1; + } + + return 0; + } +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File