diff -r 4096754ee773 -r 52a167391590 localconnectivityservice/headset/hidremconbearer/src/hidremconbearerimplementation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localconnectivityservice/headset/hidremconbearer/src/hidremconbearerimplementation.cpp Wed Sep 01 12:20:40 2010 +0100 @@ -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 +#include +#include +#include +#include +#include +#include // Property values +#include +#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 ( + static_cast ( this ) ); + } + return ret; + }