localconnectivityservice/headset/hidremconbearer/src/hidremconbearerimplementation.cpp
branchRCL_3
changeset 19 0aa8cc770c8a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/localconnectivityservice/headset/hidremconbearer/src/hidremconbearerimplementation.cpp	Tue Aug 31 16:03:15 2010 +0300
@@ -0,0 +1,522 @@
+/*
+* Copyright (c) 2005-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:  Bearer plugin API Implementation file
+ *
+*/
+
+#include <e32def.h>
+#include <remcon/remconbearerobserver.h>
+#include <remcon/remconconverterplugin.h>
+#include <remconaddress.h>
+#include <remconcoreapi.h>
+#include <RemConExtensionApi.h>
+#include <PSVariables.h>   // Property values
+#include <coreapplicationuisdomainpskeys.h>
+#include "hidremconbearerinternalpskeys.h"
+#include "hidremconbearerscancodes.h"
+#include "hidremconbearerimplementation.h"
+#include "hidremconbearerobserver.h"
+#include "debug.h"
+                                  
+_LIT8(KFormatString,"%c");
+_LIT8(KVoiceFormatString,"%d");
+_LIT_SECURITY_POLICY_C1(KHidRemconBearerReadPolicy, ECapability_None);
+_LIT_SECURITY_POLICY_C1(KHidRemconBearerWritePolicy, ECapability_None);
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::NewL()
+// Description: Factory function.
+// return: Ownership of a new CHidRemconBearer.
+// ---------------------------------------------------------------------------
+//
+CHidRemconBearer* CHidRemconBearer::NewL( TBearerParams& aParams )
+    {
+    CHidRemconBearer* self = new ( ELeave ) CHidRemconBearer( aParams );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::~CHidRemconBearer()
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CHidRemconBearer::~CHidRemconBearer()
+    {
+    delete iMediaKeyObserver;
+    delete iAccessoryVolKeyObserver;
+    delete iMuteKeyObserver;
+    delete iHookKeyObserver;
+    }
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::CHidRemconBearer()
+// construction.
+// ---------------------------------------------------------------------------
+//
+CHidRemconBearer::CHidRemconBearer( TBearerParams& aParams ) :
+    CRemConBearerPlugin( aParams )
+    {
+    //Pass
+    }
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::ConstructL()
+// 2nd-phase construction.
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::ConstructL()
+    {
+        TRACE_FUNC_ENTRY
+    // throw an indication up to RemCon.
+    TRemConAddress addr;
+    addr.BearerUid() = Uid();
+    TInt err = Observer().ConnectIndicate( addr );
+
+    //Define the P&S for Volume keys and Media Keys    
+    RProperty::Define( KPSUidHidEventNotifier, KHidControlKeyEvent,
+            RProperty::EInt, KHidRemconBearerReadPolicy,
+            KHidRemconBearerWritePolicy );
+    // Define P&S Key for Volume keys from Accessory device
+    RProperty::Define( KPSUidHidEventNotifier, KHidAccessoryVolumeEvent,
+            RProperty::EInt, KHidRemconBearerReadPolicy,
+            KHidRemconBearerWritePolicy );
+    // Define P&S Key for Mute key from Accessory device
+    RProperty::Define( KPSUidHidEventNotifier, KHidMuteKeyEvent,
+            RProperty::EInt, KHidRemconBearerReadPolicy,
+            KHidRemconBearerWritePolicy );
+
+    // Define P&S Key for phone keys from Accessory device
+    RProperty::Define( KPSUidHidEventNotifier, KHidHookKeyEvent,
+            RProperty::EInt, KHidRemconBearerReadPolicy,
+            KHidRemconBearerWritePolicy );
+
+    // Start Active object for listening key events from P&S
+
+    iMediaKeyObserver = CHidRemconBearerObserver::NewL( *this, EMediaKeys );
+    iAccessoryVolKeyObserver = CHidRemconBearerObserver::NewL( *this,
+            EAccessoryVolumeKeys );
+
+    iMuteKeyObserver = CHidRemconBearerObserver::NewL( *this, EMuteKey );
+
+    iHookKeyObserver = CHidRemconBearerObserver::NewL( *this, EHookKeys );
+    }
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::ConnectRequest()
+// Rem Con server send connect request to Bearer Plugin
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::ConnectRequest( const TRemConAddress& /*aAddr*/)
+    {
+    TRACE_FUNC
+    // Pass
+    }
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::DisconnectRequest()
+// Rem Con server send disconnect request to Bearer Plugin
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::DisconnectRequest( const TRemConAddress& /*aAddr*/)
+    {
+    TRACE_FUNC
+    // Pass
+    }
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::SendResponse()
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CHidRemconBearer::SendResponse( TUid /* aInterfaceUid */,
+        TUint /*aOperationId*/, 
+        TUint /*aTransactionId*/, // we don't care about this transaction ID
+        RBuf8& aData, 
+        const TRemConAddress& /*aAddr*/)
+    {
+    TRACE_FUNC
+    aData.Close();
+    return KErrNone;
+    }
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::SendCommand()
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CHidRemconBearer::SendCommand( TUid /* aInterfaceUid */,
+        TUint /* aOperationId */, TUint /* aTransactionId */,
+        RBuf8& /* aData */, const TRemConAddress& /*aAddr*/)
+    {
+    TRACE_FUNC
+    return KErrNone;
+    }
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::GetResponse()
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CHidRemconBearer::GetResponse( TUid& /* aInterfaceUid */,
+        TUint& /* aTransactionId*/, TUint& /* aOperationId */,
+        RBuf8& /* aData */, TRemConAddress& /*aAddr */)
+    {
+    TRACE_FUNC
+    return KErrNone;
+    }
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::GetCommand()
+// 
+// ---------------------------------------------------------------------------
+//
+TInt CHidRemconBearer::GetCommand( TUid& aInterfaceUid,
+        TUint& aTransactionId, TUint& aOperationId, RBuf8& aData,
+        TRemConAddress& aAddr )
+    {
+        TRACE_FUNC
+    aInterfaceUid = iInterfaceUid;
+    aOperationId = iOperationId;
+    // Pass ownership of this to RemCon.
+    TRAPD(retTrap, aData.CreateL(iData));
+    if ( retTrap != KErrNone )
+        {
+        return retTrap;
+        }
+    aAddr.BearerUid() = Uid();
+    aAddr.Addr() = KNullDesC8();
+    aTransactionId = iTransactionId;
+    return KErrNone;
+    }
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::SetSVKOperationIdAndData()
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::SetSVKOperationIdAndData( TInt aEnumValue )
+    {
+        TRACE_FUNC
+    // 1. Interface ID is required when Getcommand is called
+    iInterfaceUid = TUid::Uid( KRemConCoreApiUid ); // from Remconcoreapi.h
+    switch ( aEnumValue )
+        {
+        case KPSVolumeUpPressed:
+            iOperationId = ERemConCoreApiVolumeUp;
+            iData.Format( KFormatString, ERemConCoreApiButtonPress );
+            break;
+        case KPSVolumeUpReleased:
+            iOperationId = ERemConCoreApiVolumeUp;
+            iData.Format( KFormatString, ERemConCoreApiButtonRelease );
+            break;
+        case KPSVolumeUpClicked:
+            iOperationId = ERemConCoreApiVolumeUp;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        case KPSVolumeDownPressed:
+            iOperationId = ERemConCoreApiVolumeDown;
+            iData.Format( KFormatString, ERemConCoreApiButtonPress );
+            break;
+        case KPSVolumeDownReleased:
+            iOperationId = ERemConCoreApiVolumeDown;
+            iData.Format( KFormatString, ERemConCoreApiButtonRelease );
+            break;
+        case KPSVolumeDownClicked:
+            iOperationId = ERemConCoreApiVolumeDown;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        case KPSVolumeNoKey: // This should never execute
+            break;
+        default:
+            iOperationId = aEnumValue;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::SetMuteKeyOperationIdAndData
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::SetMuteKeyOperationIdAndData( TInt aEnumValue )
+    {
+        TRACE_INFO((_L("[HID]\tCHidRemconBearer::SetMuteKeyOperation \
+                IdAndData( %d )"), aEnumValue));
+    // 1. Interface ID is required when Getcommand is called
+    iInterfaceUid = TUid::Uid( KRemConCoreApiUid ); // from Remconcoreapi.h
+    switch ( aEnumValue )
+        {
+        case KPSMutePressed:
+            iOperationId = ERemConCoreApiMute;
+            iData.Format( KFormatString, ERemConCoreApiButtonPress );
+            break;
+        case KPSMuteReleased:
+            iOperationId = ERemConCoreApiMute;
+            iData.Format( KFormatString, ERemConCoreApiButtonRelease );
+            break;
+        case KPSMuteClicked:
+            iOperationId = ERemConCoreApiMute;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        default:
+            TRACE_INFO(_L("CHidRemconBearer::SetMuteKeyOperationIdAndData : \
+                    Not supported"))
+            ;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::SetMediaKeyOperationIdAndData()
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::SetMediaKeyOperationIdAndData( TInt aEnumValue )
+    {
+        TRACE_FUNC
+    // 1. Interface ID is required when Getcommand is called
+    iInterfaceUid = TUid::Uid( KRemConCoreApiUid ); // from Remconcoreapi.h
+    switch ( aEnumValue )
+        {
+        case EPlayReleased:
+            iOperationId = ERemConCoreApiPausePlayFunction;
+            iData.Format( KFormatString, ERemConCoreApiButtonRelease );
+            break;
+        case EPlayPressed:
+            iOperationId = ERemConCoreApiPausePlayFunction;
+            iData.Format( KFormatString, ERemConCoreApiButtonPress );
+            break;
+        case EPlayClicked:
+            iOperationId = ERemConCoreApiPausePlayFunction;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        case EStopReleased:
+            iOperationId = ERemConCoreApiStop;
+            iData.Format( KFormatString, ERemConCoreApiButtonRelease );
+            break;
+        case EStopPressed:
+            iOperationId = ERemConCoreApiStop;
+            iData.Format( KFormatString, ERemConCoreApiButtonPress );
+            break;
+        case EStopClicked:
+            iOperationId = ERemConCoreApiStop;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        case EForwardReleased:
+            iOperationId = ERemConCoreApiForward;
+            iData.Format( KFormatString, ERemConCoreApiButtonRelease );
+            break;
+        case EForwardPressed:
+            iOperationId = ERemConCoreApiForward;
+            iData.Format( KFormatString, ERemConCoreApiButtonPress );
+            break;
+        case EForwardClicked:
+            iOperationId = ERemConCoreApiForward;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        case ERewindReleased:
+            iOperationId = ERemConCoreApiRewind;
+            iData.Format( KFormatString, ERemConCoreApiButtonRelease );
+            break;
+        case ERewindPressed:
+            iOperationId = ERemConCoreApiRewind;
+            iData.Format( KFormatString, ERemConCoreApiButtonPress );
+            break;
+        case ERewindClicked:
+            iOperationId = ERemConCoreApiRewind;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        case EFastForwardReleased:
+            iOperationId = ERemConCoreApiFastForward;
+            iData.Format( KFormatString, ERemConCoreApiButtonRelease );
+            break;
+        case EFastForwardPressed:
+            iOperationId = ERemConCoreApiFastForward;
+            iData.Format( KFormatString, ERemConCoreApiButtonPress );
+            break;
+        case EFastForwardClicked:
+            iOperationId = ERemConCoreApiFastForward;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        case EBackwardReleased:
+            iOperationId = ERemConCoreApiBackward;
+            iData.Format( KFormatString, ERemConCoreApiButtonRelease );
+            break;
+        case EBackwardPressed:
+            iOperationId = ERemConCoreApiBackward;
+            iData.Format( KFormatString, ERemConCoreApiButtonPress );
+            break;
+        case EBackwardClicked:
+            iOperationId = ERemConCoreApiBackward;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+            // This should never execute
+        default:
+            iOperationId = aEnumValue;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+
+        }
+    }
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::ReceivedKeyEvent()
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::SetPhoneKeyOperationIdAndData( TInt aEnumValue )
+    {
+    TRACE_FUNC_ENTRY
+    iInterfaceUid = TUid::Uid( KRemConExtCallHandlingApiUid );
+    switch ( aEnumValue )
+        {
+        case KPSAnsweClicked:
+            TRACE_INFO((_L("[HID]\tCHidRemconBearer::SetPhoneKey \
+                    OperationIdAndData Answer")));
+            iOperationId = ERemConExtAnswerCall;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        case KPSHangUpClicked:
+            iOperationId = ERemConExtEndCall;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        case KPSRedial:
+            iOperationId = ERemConExtLastNumberRedial;
+            iData.Format( KFormatString, ERemConCoreApiButtonClick );
+            break;
+        case KPSVoiceDial:
+            iOperationId = ERemConExtVoiceDial;
+            iData.Format( KVoiceFormatString, ERemConCoreApiButtonRelease );
+            break;
+        default:
+            TRACE_INFO(_L("CHidRemconBearer::SetPhoneKeyOperationIdAndData \
+                    : Not supported"));        }
+    TRACE_FUNC_EXIT
+    }
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::ReceivedKeyEvent()
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::ReceivedKeyEvent( TInt aEnumValue, TInt aKeyType )
+    {
+    TRACE_INFO((_L("[HID]\tCHidRemconBearer::ReceivedKeyEvent: value %d, \
+            type %d )"), aEnumValue, aKeyType));
+
+    /* To keep the background light on */
+    User::ResetInactivityTime();
+
+    // 2. Transaction ID
+    iTransactionId = Observer().NewTransactionId();
+
+    // 3. Addr 
+    TRemConAddress addr;
+    addr.BearerUid() = Uid();
+    addr.Addr() = KNullDesC8();
+
+    // 4 & 5. Operation ID and Data
+    HandleKeyOperation( aEnumValue, aKeyType );
+
+    // Msgtype  is ERemConCommand
+    TInt error = Observer().NewCommand( addr );
+    TRACE_INFO((_L("[HID]\tCHidRemconBearer::ReceivedKeyEvent: error %d )"), 
+            error));
+    //Start the listener once again     
+    RestartKeyObeserver( aKeyType );
+
+    }
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::RestartKeyObeserver
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::RestartKeyObeserver( TInt aKeyType )
+    {
+    TRACE_FUNC_ENTRY
+    switch ( aKeyType )
+        {
+        case EMediaKeys:
+            iMediaKeyObserver->Start();
+            break;
+        case EAccessoryVolumeKeys:
+            iAccessoryVolKeyObserver->Start();
+            break;
+        case EMuteKey:
+            iMuteKeyObserver->Start();
+            break;
+        case EHookKeys:
+            iHookKeyObserver->Start();
+            break;
+        default:
+            TRACE_INFO(_L("CHidRemconBearer::RestartKeyObeserver : Not supported"))
+            ;
+        }
+        TRACE_FUNC_EXIT
+    }
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::RestartObexserver
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::HandleKeyOperation( TInt aEnumValue, TInt aKeyType )
+    {
+    TRACE_FUNC_ENTRY
+    switch ( aKeyType )
+        {
+        case EAccessoryVolumeKeys:
+            SetSVKOperationIdAndData( aEnumValue );
+            break;
+        case EMuteKey:
+            SetMuteKeyOperationIdAndData( aEnumValue );
+            break;
+        case EMediaKeys:
+            SetMediaKeyOperationIdAndData( aEnumValue );
+            break;
+        case EHookKeys:
+            SetPhoneKeyOperationIdAndData( aEnumValue );
+            break;
+        default:
+            TRACE_INFO(_L("CHidRemconBearer::HandleKeyOperation : Not \
+                    supported"))
+            ;
+        }
+    TRACE_FUNC_EXIT
+    }
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::SecurityPolicy()
+// ---------------------------------------------------------------------------
+//
+TSecurityPolicy CHidRemconBearer::SecurityPolicy() const
+    {
+    return TSecurityPolicy( ECapabilityLocalServices );
+    }
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::ClientStatus()
+// ---------------------------------------------------------------------------
+//
+void CHidRemconBearer::ClientStatus( TBool /*aControllerPresent*/, TBool /*aTargetPresent*/)
+    {
+        //Pass
+    TRACE_FUNC
+    }
+
+// ---------------------------------------------------------------------------
+// CHidRemconBearer::GetInterface()
+// ---------------------------------------------------------------------------
+//
+TAny* CHidRemconBearer::GetInterface( TUid aUid )
+    {
+    TRACE_FUNC
+    TAny* ret = NULL;
+    if ( aUid == TUid::Uid( KRemConBearerInterface1 ) )
+        {
+        ret = reinterpret_cast<TAny*> ( 
+                        static_cast<MRemConBearerInterface*> ( this ) );
+        }
+    return ret;
+    }