diff -r 000000000000 -r 4e1aa6a622a0 resourcemgmt/hwresourcesmgr/server/src/HWRMVibraCommonService.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resourcemgmt/hwresourcesmgr/server/src/HWRMVibraCommonService.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,381 @@ +// 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 "HWRMServer.h" +#include "HWRMVibraClientServer.h" +#include "HWRMService.h" +#include "HWRMVibraCommonService.h" +#include "HWRMVibraCommands.h" +#include "HWRMPluginHandler.h" +#include "HWRMtrace.h" +#include "HWRMVibraCommonData.h" +#include "HWRMVibra.h" +#include "HWRMReservationHandler.h" +#include "HWRMPrivateCRKeys.h" +#include "HWRMDomainPSKeys.h" +#include "HWRMPrivatePSKeys.h" + +// LOCAL CONSTANTS AND MACROS +_LIT( KPanicCategory, "HWRMVibraCommonService" ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::CHWRMVibraCommonService +// C++ constructor +// ----------------------------------------------------------------------------- +// +CHWRMVibraCommonService::CHWRMVibraCommonService() + { + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CHWRMVibraCommonService::ConstructL(CHWRMPluginHandler* aPluginHandler, + CHWRMReservationHandler* aReservationHandler) + { + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonService::ConstructL(0x%x)" ), aPluginHandler); + + BaseConstructL(aPluginHandler, aReservationHandler); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::ConstructL - return " )); + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CHWRMVibraCommonService* CHWRMVibraCommonService::NewL(CHWRMPluginHandler* aPluginHandler, + CHWRMReservationHandler* aReservationHandler) + { + COMPONENT_TRACE3(_L( "HWRM Server - CHWRMVibraCommonService::NewL(0x%x, 0x%x)" ), aPluginHandler, aReservationHandler ); + + CHWRMVibraCommonService* self = new( ELeave ) CHWRMVibraCommonService(); + + CleanupStack::PushL( self ); + self->ConstructL(aPluginHandler, aReservationHandler); + CleanupStack::Pop(); + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonService::NewL - return 0x%x" ), self); + + return self; + } + +// --------------------------------------------------------- +// Destructor +// --------------------------------------------------------- +// +CHWRMVibraCommonService::~CHWRMVibraCommonService() + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::~CHWRMVibraCommonService()" )); + + // Base class cleanup + BaseDestruct(); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::~CHWRMVibraCommonService - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::ExecuteMessageL +// ----------------------------------------------------------------------------- +// +#if defined(COMPONENT_TRACE_FLAG) && defined(_DEBUG) +TBool CHWRMVibraCommonService::ExecuteMessageL( const RMessage2& aMessage ) +#else +TBool CHWRMVibraCommonService::ExecuteMessageL( const RMessage2& /* aMessage */ ) +#endif + { + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonService::ExecuteMessageL(0x%x)" ), aMessage.Function() ); + + // This common service is never supposed to get messages for execution + __ASSERT_ALWAYS(EFalse, User::Panic(KPanicCategory, EPanicBadHandle)); + + return EFalse; + } + + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::ProcessResponseL +// Handles Vibra requests responses. +// ----------------------------------------------------------------------------- +// +#if defined(COMPONENT_TRACE_FLAG) && defined(_DEBUG) +void CHWRMVibraCommonService::ProcessResponseL( TInt aCommandId, TUint8 aTransId, TDesC8& aData, TBool aTimeout) +#else +void CHWRMVibraCommonService::ProcessResponseL( TInt /* aCommandId */, TUint8 aTransId, TDesC8& aData, TBool aTimeout) +#endif + { + COMPONENT_TRACE4(_L( "HWRM Server - CHWRMVibraCommonService::ProcessResponseL(0x%x, 0x%x, , 0x%x)" ), aCommandId, aTransId, aTimeout ); + + TInt pluginErr(KErrNone); // Error came from plugin as data (or timeout). Used to complete RMessage. + TInt contextErr(KErrNone); // Error in context, i.e. bad handle or descriptor. Used to leave. + + // Unpack the package. All vibra messages contain only possible error code + // in return package. + if ( !aTimeout && aData.Size() != sizeof(TInt) ) + { + COMPONENT_TRACE3(_L( "HWRM Server - CHWRMVibraCommonService::ProcessResponseL - Data size mismatch, expected: 0x%x, got 0x%x" ), sizeof(TInt), aData.Size() ); + contextErr = KErrBadDescriptor; + pluginErr = KErrBadDescriptor; + } + else + { + // If response was caused by timeout, set that as the error. + // Timeout handled this way instead of just returning KErrTimeout in aData because + // aData format is not known in plugin handler and in theoretically some new commands + // may also return different response than just error code in future. + if ( aTimeout ) + { + pluginErr = KErrTimedOut; + } + else + { + HWRMVibraCommand::TErrorCodeResponsePackage errPckg; + errPckg.Copy(aData); + pluginErr = errPckg(); + } + + if ( pluginErr != KErrNone ) + { + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonService::ProcessResponseL - Error: %d" ), pluginErr ); + } + + // It is on each service's responsibility to update vibra status p&s keys + } + + // Complete request and remove delete transaction + contextErr = CompleteRequest(aTransId, pluginErr); + + // Leave if there is error in context + User::LeaveIfError(contextErr); + + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::ProcessResponseL - return" ) ); + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::SuspendSubResource +// ----------------------------------------------------------------------------- +// +void CHWRMVibraCommonService::SuspendSubResource(TInt /*aSubResource*/) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::SuspendSubResource" ) ); + + // This common service is never supposed to get messages for execution + __ASSERT_ALWAYS(EFalse, User::Panic(KPanicCategory, EPanicBadHandle)); + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::ResumeSubResource +// ----------------------------------------------------------------------------- +// +void CHWRMVibraCommonService::ResumeSubResource(TInt /*aSubResource*/) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::ResumeSubResource" ) ); + + // This common service is never supposed to get messages for execution + __ASSERT_ALWAYS(EFalse, User::Panic(KPanicCategory, EPanicBadHandle)); + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::ActivateSubResource +// ----------------------------------------------------------------------------- +// +void CHWRMVibraCommonService::ActivateSubResource(TInt /*aSubResource*/, TBool /*aActivate*/) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::ActivateSubResource" ) ); + + // This common service is never supposed to get messages for execution + __ASSERT_ALWAYS(EFalse, User::Panic(KPanicCategory, EPanicBadHandle)); + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::SetClientData +// Sets client's parameters. +// ----------------------------------------------------------------------------- +// +void CHWRMVibraCommonService::SetClientData( TVibraClientData aData ) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::SetClientData" ) ); + + // We cannot do anything if insertion of data fails. That is not dealt as ciritical + // problem anyway, because this request just won't get continued. + TInt err = iVibraClients.Insert( aData, 0 ); + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonService::SetClientData err %d" ), err ); + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::HasData +// ----------------------------------------------------------------------------- +// +TBool CHWRMVibraCommonService::HasData( CHWRMService* aClient ) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::HasData" ) ); + + TBool hasData( EFalse ); + TInt count( iVibraClients.Count() ); + + for ( TInt i = 0; i < count; i++ ) + { + if( iVibraClients[i].iClient == aClient ) + { + hasData = ETrue; + break; + } + } + + return hasData; + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::ResetClientData +// Resets client's data. +// If one service has finished with (all) vibrations, it calls this method. +// At this point all entries of service are removed and other service's +// vibration is continued if any available. +// ----------------------------------------------------------------------------- +// +void CHWRMVibraCommonService::ResetClientData( CHWRMService* aClient ) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::ResetClientData" ) ); + + // Remove service's items from list + TInt count( iVibraClients.Count() ); + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonService::ResetClientData - count %d" ), count ); + + for ( TInt i=count-1; count > 0 && i >= 0; i-- ) + { + if( iVibraClients[i].iClient == aClient ) + { + iVibraClients.Remove( i ); + } + } + + // Restart next available "suspended" request. It is ok if original request's + // timer fires just after vibration has been restarted, because we are + // still running start/stop requests in context of same thread. + count = iVibraClients.Count(); + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonService::ResetClientData - count %d" ), count ); + + if( count > 0 ) + { + // Start vibration with last suspended intensity. If restart fails, we + // cannot do anything about that and should not leave calling service. + TRAPD( err, RestartVibraL() ); + if( err != KErrNone ) + { + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonService::ResetClientData - err %d" ), err ); + } + } + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::RestartVibraL +// Restarts vibration with last suspended intensity +// ----------------------------------------------------------------------------- +// +void CHWRMVibraCommonService::RestartVibraL() + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::RestartVibraL" ) ); + + // Ignore Coverity false positive as uninitialized variable. + // Since no response is sent back to the client, only a empty message is created here. + // Message handle of this will be initialized to NULL in the default constructor. + // coverity[var_decl] + RMessage2 dummy; + + THWRMPluginRequestData* data = new (ELeave) THWRMPluginRequestData(dummy, 0, 0, EFalse); + CleanupStack::PushL( data ); + + if( iVibraClients[0].iIntensity == KMaxTInt ) + { + TBuf8<1> emptyDes; + data->iTransId = iPluginHandler->ProcessCommandL( + HWRMVibraCommand::EStartVibraWithDefaultSettingsCmdId, emptyDes, this ); + } + else + { + HWRMVibraCommand::TStartVibraCmdDataPackage dataPckg(iVibraClients[0].iIntensity); + data->iTransId = iPluginHandler->ProcessCommandL( + HWRMVibraCommand::EStartVibraCmdId, dataPckg, this ); + } + + // data still needed, do not destroy, just pop + CleanupStack::Pop( data ); + + // Add data to list + iTransactionList->AddTransaction( data ); + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::ExecutingPriorityHigher +// Checks whether vibrating client's priority higher than new request making +// client's priority +// ----------------------------------------------------------------------------- +// +TBool CHWRMVibraCommonService::ExecutingPriorityHigher(TSecureId aSid) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::ExecutingPriorityHigher" ) ); + + TBool ret( EFalse ); + + TInt count = iVibraClients.Count(); + + if( count > 0 ) + { + TBool trusted( EFalse ); + // Last client requested vibration always the first one in list + TInt activePriority = iReservationHandler->GetPolicy()->GetPriority( iVibraClients[0].iSid, trusted ); + TInt reqPriority = iReservationHandler->GetPolicy()->GetPriority( aSid, trusted ); + + if( activePriority < reqPriority ) + { + ret = ETrue; + } + } + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonService::ExecutingPriorityHigher - ret %d" ), ret); + + return ret; + } + +// ----------------------------------------------------------------------------- +// CHWRMVibraCommonService::VibraPulseAllowed +// ----------------------------------------------------------------------------- +// +TBool CHWRMVibraCommonService::VibraPulseAllowed(TSecureId aSid) + { + COMPONENT_TRACE1(_L( "HWRM Server - CHWRMVibraCommonService::VibraPulseAllowed" ) ); + + TBool ret = iReservationHandler->GetPolicy()->FeedbackClient( aSid ); + + COMPONENT_TRACE2(_L( "HWRM Server - CHWRMVibraCommonService::VibraPulseAllowed - ret %d" ), ret ); + + return ret; + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File