--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/resourcemgmt/hwresourcesmgr/server/src/HWRMVibraCommonData.cpp Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,532 @@
+// 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 <centralrepository.h>
+#include "HWRMtrace.h"
+#include "HWRMVibraSDKCRKeys.h"
+#include "HWRMVibraCommonData.h"
+#include "HWRMClientServer.h"
+#include "HWRMPrivatePSKeys.h"
+#include "HWRMPrivateCRKeys.h"
+#include "HWRMConfiguration.h"
+#include "HWRMVibraService.h"
+#include "HWRMDomainPSKeys.h"
+
+
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::CHWRMVibraCommonData
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CHWRMVibraCommonData::CHWRMVibraCommonData(CHWRMVibraCommonService& aCommonService)
+ : iPulseSupported(EFalse),
+ iLastPublishedStatus(CHWRMVibra::EVibraStatusNotAllowed),
+ iCommonService(aCommonService)
+ {
+ COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonData::CHWRMVibraCommonData()" ) );
+ COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonData::CHWRMVibraCommonData - return" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CHWRMVibraCommonData::ConstructL(CHWRMPluginHandler* aPluginHandler,
+ CHWRMReservationHandler* aReservationHandler)
+ {
+ COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonData::ConstructL()" ) );
+
+ // Get read only values from cenrep
+ CRepository* repository = CRepository::NewLC(KCRUidVibraCtrl);
+
+ TInt value(0);
+ User::LeaveIfError(repository->Get(KVibraMinOffTime, value));
+ iMinimumOffTime = value * 1000; // milliseconds -> microseconds
+ if ( iMinimumOffTime.Int() < 0 )
+ {
+ iMinimumOffTime = 0; // do not allow negative value
+ }
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::ConstructL - iMinimumOffTime: %d" ), iMinimumOffTime.Int() );
+
+ User::LeaveIfError(repository->Get(KVibraCtrlMaxTime, value));
+ iMaximumOnTime = value * 1000; // milliseconds -> microseconds
+ if ( iMaximumOnTime.Int() < 0 )
+ {
+ iMaximumOnTime = 0; // do not allow negative value
+ }
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::ConstructL - iMaximumOnTime: %d" ), iMaximumOnTime.Int() );
+
+ User::LeaveIfError(repository->Get(KVibraCtrlProfileVibraEnabled, value));
+ iVibraSetting = (value == 0 ) ? CHWRMVibra::EVibraModeOFF : CHWRMVibra::EVibraModeON;
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::ConstructL - iVibraSetting: %d" ), iVibraSetting );
+
+ User::LeaveIfError(repository->Get(KVibraCtrlProfileFeedbackEnabled, value));
+ iVibraFeedbackSetting = (value == 0 ) ? CHWRMVibra::EVibraFeedbackModeOFF : CHWRMVibra::EVibraFeedbackModeON;
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::ConstructL - iVibraFeedbackSetting: %d" ), iVibraFeedbackSetting );
+
+ User::LeaveIfError(repository->Get(KVibraCtrlFeedbackIntensity, iFeedbackIntensity));
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::ConstructL - iFeedbackIntensity: %d" ), iFeedbackIntensity );
+
+ User::LeaveIfError(repository->Get(KVibraCtrlFeedbackDuration, iFeedbackDuration));
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::ConstructL - iFeedbackDuration: %d" ), iFeedbackDuration );
+
+
+
+ CleanupStack::PopAndDestroy(repository);
+
+ // Get privileged SID
+ CRepository* hwrmRep = CRepository::NewLC(KCRUidHWRMSettings);
+ TInt sidValue(0);
+ User::LeaveIfError(hwrmRep->Get(KHWRMAudioVibraSID, sidValue));
+ iPrivilegedSid = new (ELeave) TSecureId(sidValue);
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::ConstructL - iPrivilegedSid: 0x%x" ), iPrivilegedSid->iId );
+
+ // Initiate and get vibra blocking mask
+ iConfVibraBlockMask =
+ KHWRMInternalSettingsChargerBlockVibra |
+ KHWRMInternalSettingsChargerBlockFeedback |
+ KHWRMInternalSettingsAccessoryBlockFeedback |
+ KHWRMInternalSettingsCoolOffBlockFeedback;
+
+ TInt err = hwrmRep->Get(KHWRMInternalSettings, value);
+ if ( err == KErrNone )
+ {
+ iConfVibraBlockMask = value;
+ // clear bits, which do not mean block-mask
+ iConfVibraBlockMask &= ~KHWRMInternalSettingsDeviceSupportsPulse;
+ // set pulse support value
+ iPulseSupported = value & KHWRMInternalSettingsDeviceSupportsPulse;
+ }
+
+ CleanupStack::PopAndDestroy(hwrmRep);
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::ConstructL - iPrivilegedSid: 0x%x" ), iPrivilegedSid->iId );
+
+ // Set up status P&S value
+ User::LeaveIfError(RProperty::Define(KPSUidHWResourceNotification, KHWRMVibraStatus, RProperty::EInt, KNoCapability, KHWRMSidOnlyPolicy));
+ User::LeaveIfError(iProperty.Attach(KPSUidHWResourceNotification, KHWRMVibraStatus));
+
+ // Set up profile observer (Will also initialize the P&S value indirectly on callback)
+ iProfileObserver = CHWRMVibraProfileObserver::NewL(this);
+
+ // Construct vibra service last so that the common data is in order to be used
+ // in service construction.
+ iVibraService = CHWRMVibraService::NewL(aPluginHandler, aReservationHandler, iCommonService, *this, EFalse);
+
+ // Set up P&S observers for vibra blocking
+ iAccessoryBlockObserver = CHWRMPSChangeObserver::NewL(*this, KPSUidHWRM, KHWRMAccessoryVibraBlocked);
+ iInternalBlockObserver = CHWRMPSChangeObserver::NewL(*this, KPSUidHWRMPrivate, KHWRMInternalVibraBlocked);
+
+ COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonData::ConstructL - return" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CHWRMVibraCommonData* CHWRMVibraCommonData::NewL(CHWRMPluginHandler* aPluginHandler,
+ CHWRMReservationHandler* aReservationHandler,
+ CHWRMVibraCommonService& aCommonService)
+ {
+ COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonData::NewL()" ) );
+
+
+ CHWRMVibraCommonData* self = new( ELeave ) CHWRMVibraCommonData(aCommonService);
+
+
+ CleanupStack::PushL( self );
+ self->ConstructL(aPluginHandler, aReservationHandler);
+ CleanupStack::Pop();
+
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::NewL - return 0x%x" ), self );
+
+ return self;
+ }
+
+// ---------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------
+//
+CHWRMVibraCommonData::~CHWRMVibraCommonData()
+ {
+ COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonData::~CHWRMVibraCommonData()" ) );
+
+ delete iProfileObserver;
+
+ iProperty.Close();
+
+ delete iAccessoryBlockObserver;
+ delete iInternalBlockObserver;
+
+ delete iVibraService;
+
+ delete iPrivilegedSid;
+
+ COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonData::~CHWRMVibraCommonData - return" ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::VibraState
+// -----------------------------------------------------------------------------
+//
+CHWRMVibra::TVibraModeState CHWRMVibraCommonData::VibraState()
+ {
+ COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonData::TVibraModeState()" ) );
+
+ // If there has been a problem in the profile observer, try recreating it.
+ if ( iVibraSetting == CHWRMVibra::EVibraModeUnknown )
+ {
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibra::VibraState - Restarting profile observer") );
+ delete iProfileObserver;
+ iProfileObserver = NULL;
+
+ TRAP_IGNORE(iProfileObserver = CHWRMVibraProfileObserver::NewL(this));
+ }
+
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::TVibraModeState - return 0x%x" ), iVibraSetting );
+
+ return iVibraSetting;
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::VibraModeChange
+// -----------------------------------------------------------------------------
+//
+void CHWRMVibraCommonData::VibraModeChange(CHWRMVibra::TVibraModeState aNewState)
+ {
+ COMPONENT_TRACE2(_L("HWRM Server - CHWRMVibraCommonData::VibraModeChange(0x%x)"), aNewState);
+
+ iVibraSetting = aNewState;
+
+ if ( iVibraSetting == CHWRMVibra::EVibraModeON )
+ {
+ // if just coming out of mode change, vibra can be assumed to be stopped
+ // except if vibra is set on by privileged client.
+ if ( !iPrivilegedVibraOn )
+ {
+ PublishVibraStatus( CHWRMVibra::EVibraStatusStopped );
+ }
+ }
+ else if ( !iPrivilegedVibraOn )
+ {
+ PublishVibraStatus( CHWRMVibra::EVibraStatusNotAllowed );
+
+ // If vibra service is initialized, stop vibra.
+ // Service will be uninitialized on first startup mode change, but
+ // vibra will not be on at that point anyway, as nobody could have
+ // started it yet.
+ if ( iVibraService )
+ {
+ iVibraService->ForceVibraStop();
+ }
+ }
+ else
+ {
+ // nothing
+ }
+
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibraCommonData::VibraModeChange - return") );
+ }
+
+ // -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::VibraFeedbackState
+// -----------------------------------------------------------------------------
+//
+CHWRMVibra::TVibraFeedbackModeState CHWRMVibraCommonData::VibraFeedbackState()
+ {
+ COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonData::VibraFeedbackState()" ) );
+
+ // If there has been a problem in the profile observer, try recreating it.
+ if ( iVibraFeedbackSetting == CHWRMVibra::EVibraFeedbackModeUnknown )
+ {
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibra::VibraState - Restarting profile observer") );
+ delete iProfileObserver;
+ iProfileObserver = NULL;
+
+ TRAPD( err, iProfileObserver = CHWRMVibraProfileObserver::NewL(this) );
+
+ if ( err != KErrNone )
+ {
+ // Unable to recreate profile observer. Memory probably low. Must recreate observer next time some
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibra::VibraFeedbackState - Unable to restart profile observer") );
+ }
+ }
+
+ COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonData::VibraFeedbackState - return 0x%x" ), iVibraFeedbackSetting );
+
+ return iVibraFeedbackSetting;
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::VibraFeedbackModeChange
+// -----------------------------------------------------------------------------
+//
+void CHWRMVibraCommonData::VibraFeedbackModeChange(CHWRMVibra::TVibraFeedbackModeState aNewState)
+ {
+ COMPONENT_TRACE2(_L("HWRM Server - CHWRMVibraCommonData::VibraFeedbackModeChange(0x%x)"), aNewState);
+
+ iVibraFeedbackSetting = aNewState;
+
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibraCommonData::VibraFeedbackModeChange - return") );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::PSValueChanged
+// Act on observed PS value changes
+// -----------------------------------------------------------------------------
+//
+void CHWRMVibraCommonData::PSValueChanged(const TUid& aUid, TUint32 aKey, TInt aValue)
+ {
+ COMPONENT_TRACE4(_L("HWRM Server - CHWRMVibraCommonData::PSValueChanged(0x%x, 0x%x, 0x%x)"), aUid, aKey, aValue);
+
+ //We are currently listening to is the Accessory server and charger statuses
+ if ( ( aUid == KPSUidHWRM && aKey == KHWRMAccessoryVibraBlocked ) ||
+ ( aUid == KPSUidHWRMPrivate && aKey == KHWRMInternalVibraBlocked ) )
+ {
+ if ( aValue )
+ {
+ // Set bit in blockmask
+ iVibraBlockMask |= aKey;
+
+ COMPONENT_TRACE2(_L("HWRM Server - CHWRMVibraCommonData::PSValueChanged - Vibra block set, mask: 0x%x"), iVibraBlockMask );
+
+ // Explicitly shut down the vibra
+ if ( iVibraService )
+ {
+ iVibraService->ForceVibraStop();
+ PublishVibraStatus( CHWRMVibra::EVibraStatusNotAllowed );
+ }
+ else
+ {
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibraCommonData::PSValueChanged - Error: Service not initialized, cannot stop vibra!") );
+ }
+ }
+ else
+ {
+ // Clear bit in blockmask
+ iVibraBlockMask &= ~aKey;
+ COMPONENT_TRACE2(_L("HWRM Server - CHWRMVibraCommonData::PSValueChanged - Vibra block cleared, mask: 0x%x"), iVibraBlockMask );
+
+ // Status must be stopped if vibra block was just cleared
+ if ( !iVibraBlockMask )
+ {
+ PublishVibraStatus( CHWRMVibra::EVibraStatusStopped );
+ }
+ }
+ }
+
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibraCommonData::PSValueChanged - return") );
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::VibraLocked
+// -----------------------------------------------------------------------------
+//
+TBool CHWRMVibraCommonData::VibraLocked() const
+ {
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibraCommonData::VibraLocked()"));
+
+ TBool retval(EFalse);
+
+ // Vibra is considered also locked if it is blocked
+ if ( iVibraBlockMask )
+ {
+ retval = ETrue;
+ }
+ else
+ {
+ TTime currentTime;
+ currentTime.UniversalTime();
+
+ if ( currentTime < iVibraLockedUntil )
+ {
+ retval = ETrue;
+ }
+ }
+
+ COMPONENT_TRACE2(_L("HWRM Server - CHWRMVibraCommonData::VibraLocked - return 0x%x"), retval );
+
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::VibraBlocked
+// -----------------------------------------------------------------------------
+//
+TInt CHWRMVibraCommonData::VibraBlocked() const
+ {
+ COMPONENT_TRACE1( (_L("HWRM Server - CHWRMVibraCommonData::VibraBlocked()")) );
+
+ TInt retval(EFalse);
+
+ if ( iVibraBlockMask )
+ {
+ retval = iVibraBlockMask;
+ }
+
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::VibraBlocked
+// -----------------------------------------------------------------------------
+//
+TBool CHWRMVibraCommonData::VibraBlocked( TInt aMask ) const
+ {
+ TBool retval(EFalse);
+
+ if ( iConfVibraBlockMask & aMask )
+ {
+ retval = ETrue;
+ }
+
+ return retval;
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::LockVibra
+// -----------------------------------------------------------------------------
+//
+void CHWRMVibraCommonData::LockVibra()
+ {
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibraCommonData::LockVibra()"));
+
+ iVibraLockedUntil.UniversalTime();
+ iVibraLockedUntil += iMinimumOffTime;
+
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibraCommonData::LockVibra - return") );
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::PublishVibraStatus
+// -----------------------------------------------------------------------------
+//
+void CHWRMVibraCommonData::PublishVibraStatus(CHWRMVibra::TVibraStatus aStatus,
+ TBool aPrivilegedClient)
+ {
+ COMPONENT_TRACE3(_L("HWRM Server - CHWRMVibraCommonData::PublishVibraStatus(0x%x, 0x%x)"), aStatus, aPrivilegedClient );
+
+ CHWRMVibra::TVibraStatus publishStatus(aStatus);
+
+ // If vibra is on by a priviledged client, or privileged client is publishing status,
+ // deciding published status requires some extra manouvering.
+ // -> Check if actual status should be whatever is being set or not allowed
+ if ( ( (iPrivilegedVibraOn || aPrivilegedClient)
+ && aStatus != CHWRMVibra::EVibraStatusOn
+ && (VibraLocked() || iVibraSetting == CHWRMVibra::EVibraModeOFF) )
+ || VibraBlocked() ) // Blocked vibra will always set EVibraStatusNotAllowed
+ {
+ publishStatus = CHWRMVibra::EVibraStatusNotAllowed;
+ }
+
+ if ( aStatus == CHWRMVibra::EVibraStatusOn )
+ {
+ if ( aPrivilegedClient )
+ {
+ iPrivilegedVibraOn = ETrue;
+ }
+ // Note: Vibra on-call from non-privileged client will not change iPrivilegedVibraOn state.
+ }
+ else
+ {
+ iPrivilegedVibraOn = EFalse;
+ }
+
+ // Publish vibra 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);
+ err = iProperty.Set(publishStatus);
+
+ if ( err != KErrNone )
+ {
+ COMPONENT_TRACE2(_L("HWRM Server - CHWRMVibraCommonData::PublishVibraStatus - Set failed: %d"), err );
+ }
+ else
+ {
+ // In order to avoid publishing status for every short pulses, store last
+ // published status.
+ iLastPublishedStatus = publishStatus;
+ COMPONENT_TRACE2(_L("HWRM Server - CHWRMVibraCommonData::PublishVibraStatus - Set ok: %d"), publishStatus );
+ }
+
+
+ COMPONENT_TRACE1(_L("HWRM Server - CHWRMVibraCommonData::PublishVibraStatus - return") );
+ }
+
+// -----------------------------------------------------------------------------
+// CHWRMVibraCommonData::IsPrivilegedSid
+// -----------------------------------------------------------------------------
+//
+TBool CHWRMVibraCommonData::IsPrivilegedSid(const TSecureId& aClientSid)
+ {
+ COMPONENT_TRACE2(_L("HWRM Server - CHWRMVibraCommonData::IsPrivilegedSid(0x%x)"), aClientSid.iId );
+
+ TBool retval(EFalse);
+
+ if ( iPrivilegedSid )
+ {
+ if ( *iPrivilegedSid == aClientSid )
+ {
+ retval = ETrue;
+ }
+ }
+
+ COMPONENT_TRACE2(_L("HWRM Server - CHWRMVibraCommonData::IsPrivileged - return 0x%x"), retval );
+
+ return retval;
+ }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+
+
+// End of File