resourcemgmt/hwresourcesmgr/server/src/HWRMVibraCommonService.cpp
changeset 0 4e1aa6a622a0
--- /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, <data>, 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