localconnectivityservice/headset/hidremconbearer/src/hidremconbearerimplementation.cpp
branchRCL_3
changeset 20 4a793f564d72
parent 19 0aa8cc770c8a
child 21 74aa6861c87d
equal deleted inserted replaced
19:0aa8cc770c8a 20:4a793f564d72
     1 /*
       
     2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Bearer plugin API Implementation file
       
    15  *
       
    16 */
       
    17 
       
    18 #include <e32def.h>
       
    19 #include <remcon/remconbearerobserver.h>
       
    20 #include <remcon/remconconverterplugin.h>
       
    21 #include <remconaddress.h>
       
    22 #include <remconcoreapi.h>
       
    23 #include <RemConExtensionApi.h>
       
    24 #include <PSVariables.h>   // Property values
       
    25 #include <coreapplicationuisdomainpskeys.h>
       
    26 #include "hidremconbearerinternalpskeys.h"
       
    27 #include "hidremconbearerscancodes.h"
       
    28 #include "hidremconbearerimplementation.h"
       
    29 #include "hidremconbearerobserver.h"
       
    30 #include "debug.h"
       
    31                                   
       
    32 _LIT8(KFormatString,"%c");
       
    33 _LIT8(KVoiceFormatString,"%d");
       
    34 _LIT_SECURITY_POLICY_C1(KHidRemconBearerReadPolicy, ECapability_None);
       
    35 _LIT_SECURITY_POLICY_C1(KHidRemconBearerWritePolicy, ECapability_None);
       
    36 
       
    37 // ======== MEMBER FUNCTIONS ========
       
    38 
       
    39 // ---------------------------------------------------------------------------
       
    40 // CHidRemconBearer::NewL()
       
    41 // Description: Factory function.
       
    42 // return: Ownership of a new CHidRemconBearer.
       
    43 // ---------------------------------------------------------------------------
       
    44 //
       
    45 CHidRemconBearer* CHidRemconBearer::NewL( TBearerParams& aParams )
       
    46     {
       
    47     CHidRemconBearer* self = new ( ELeave ) CHidRemconBearer( aParams );
       
    48     CleanupStack::PushL( self );
       
    49     self->ConstructL();
       
    50     CleanupStack::Pop( self );
       
    51     return self;
       
    52     }
       
    53 
       
    54 // ---------------------------------------------------------------------------
       
    55 // CHidRemconBearer::~CHidRemconBearer()
       
    56 // Destructor.
       
    57 // ---------------------------------------------------------------------------
       
    58 //
       
    59 CHidRemconBearer::~CHidRemconBearer()
       
    60     {
       
    61     delete iMediaKeyObserver;
       
    62     delete iAccessoryVolKeyObserver;
       
    63     delete iMuteKeyObserver;
       
    64     delete iHookKeyObserver;
       
    65     }
       
    66 
       
    67 // ---------------------------------------------------------------------------
       
    68 // CHidRemconBearer::CHidRemconBearer()
       
    69 // construction.
       
    70 // ---------------------------------------------------------------------------
       
    71 //
       
    72 CHidRemconBearer::CHidRemconBearer( TBearerParams& aParams ) :
       
    73     CRemConBearerPlugin( aParams )
       
    74     {
       
    75     //Pass
       
    76     }
       
    77 
       
    78 // ---------------------------------------------------------------------------
       
    79 // CHidRemconBearer::ConstructL()
       
    80 // 2nd-phase construction.
       
    81 // ---------------------------------------------------------------------------
       
    82 //
       
    83 void CHidRemconBearer::ConstructL()
       
    84     {
       
    85         TRACE_FUNC_ENTRY
       
    86     // throw an indication up to RemCon.
       
    87     TRemConAddress addr;
       
    88     addr.BearerUid() = Uid();
       
    89     TInt err = Observer().ConnectIndicate( addr );
       
    90 
       
    91     //Define the P&S for Volume keys and Media Keys    
       
    92     RProperty::Define( KPSUidHidEventNotifier, KHidControlKeyEvent,
       
    93             RProperty::EInt, KHidRemconBearerReadPolicy,
       
    94             KHidRemconBearerWritePolicy );
       
    95     // Define P&S Key for Volume keys from Accessory device
       
    96     RProperty::Define( KPSUidHidEventNotifier, KHidAccessoryVolumeEvent,
       
    97             RProperty::EInt, KHidRemconBearerReadPolicy,
       
    98             KHidRemconBearerWritePolicy );
       
    99     // Define P&S Key for Mute key from Accessory device
       
   100     RProperty::Define( KPSUidHidEventNotifier, KHidMuteKeyEvent,
       
   101             RProperty::EInt, KHidRemconBearerReadPolicy,
       
   102             KHidRemconBearerWritePolicy );
       
   103 
       
   104     // Define P&S Key for phone keys from Accessory device
       
   105     RProperty::Define( KPSUidHidEventNotifier, KHidHookKeyEvent,
       
   106             RProperty::EInt, KHidRemconBearerReadPolicy,
       
   107             KHidRemconBearerWritePolicy );
       
   108 
       
   109     // Start Active object for listening key events from P&S
       
   110 
       
   111     iMediaKeyObserver = CHidRemconBearerObserver::NewL( *this, EMediaKeys );
       
   112     iAccessoryVolKeyObserver = CHidRemconBearerObserver::NewL( *this,
       
   113             EAccessoryVolumeKeys );
       
   114 
       
   115     iMuteKeyObserver = CHidRemconBearerObserver::NewL( *this, EMuteKey );
       
   116 
       
   117     iHookKeyObserver = CHidRemconBearerObserver::NewL( *this, EHookKeys );
       
   118     }
       
   119 // ---------------------------------------------------------------------------
       
   120 // CHidRemconBearer::ConnectRequest()
       
   121 // Rem Con server send connect request to Bearer Plugin
       
   122 // ---------------------------------------------------------------------------
       
   123 //
       
   124 void CHidRemconBearer::ConnectRequest( const TRemConAddress& /*aAddr*/)
       
   125     {
       
   126     TRACE_FUNC
       
   127     // Pass
       
   128     }
       
   129 // ---------------------------------------------------------------------------
       
   130 // CHidRemconBearer::DisconnectRequest()
       
   131 // Rem Con server send disconnect request to Bearer Plugin
       
   132 // ---------------------------------------------------------------------------
       
   133 //
       
   134 void CHidRemconBearer::DisconnectRequest( const TRemConAddress& /*aAddr*/)
       
   135     {
       
   136     TRACE_FUNC
       
   137     // Pass
       
   138     }
       
   139 
       
   140 // ---------------------------------------------------------------------------
       
   141 // CHidRemconBearer::SendResponse()
       
   142 // 
       
   143 // ---------------------------------------------------------------------------
       
   144 //
       
   145 TInt CHidRemconBearer::SendResponse( TUid /* aInterfaceUid */,
       
   146         TUint /*aOperationId*/, 
       
   147         TUint /*aTransactionId*/, // we don't care about this transaction ID
       
   148         RBuf8& aData, 
       
   149         const TRemConAddress& /*aAddr*/)
       
   150     {
       
   151     TRACE_FUNC
       
   152     aData.Close();
       
   153     return KErrNone;
       
   154     }
       
   155 // ---------------------------------------------------------------------------
       
   156 // CHidRemconBearer::SendCommand()
       
   157 // 
       
   158 // ---------------------------------------------------------------------------
       
   159 //
       
   160 TInt CHidRemconBearer::SendCommand( TUid /* aInterfaceUid */,
       
   161         TUint /* aOperationId */, TUint /* aTransactionId */,
       
   162         RBuf8& /* aData */, const TRemConAddress& /*aAddr*/)
       
   163     {
       
   164     TRACE_FUNC
       
   165     return KErrNone;
       
   166     }
       
   167 // ---------------------------------------------------------------------------
       
   168 // CHidRemconBearer::GetResponse()
       
   169 // 
       
   170 // ---------------------------------------------------------------------------
       
   171 //
       
   172 TInt CHidRemconBearer::GetResponse( TUid& /* aInterfaceUid */,
       
   173         TUint& /* aTransactionId*/, TUint& /* aOperationId */,
       
   174         RBuf8& /* aData */, TRemConAddress& /*aAddr */)
       
   175     {
       
   176     TRACE_FUNC
       
   177     return KErrNone;
       
   178     }
       
   179 // ---------------------------------------------------------------------------
       
   180 // CHidRemconBearer::GetCommand()
       
   181 // 
       
   182 // ---------------------------------------------------------------------------
       
   183 //
       
   184 TInt CHidRemconBearer::GetCommand( TUid& aInterfaceUid,
       
   185         TUint& aTransactionId, TUint& aOperationId, RBuf8& aData,
       
   186         TRemConAddress& aAddr )
       
   187     {
       
   188         TRACE_FUNC
       
   189     aInterfaceUid = iInterfaceUid;
       
   190     aOperationId = iOperationId;
       
   191     // Pass ownership of this to RemCon.
       
   192     TRAPD(retTrap, aData.CreateL(iData));
       
   193     if ( retTrap != KErrNone )
       
   194         {
       
   195         return retTrap;
       
   196         }
       
   197     aAddr.BearerUid() = Uid();
       
   198     aAddr.Addr() = KNullDesC8();
       
   199     aTransactionId = iTransactionId;
       
   200     return KErrNone;
       
   201     }
       
   202 // ---------------------------------------------------------------------------
       
   203 // CHidRemconBearer::SetSVKOperationIdAndData()
       
   204 // ---------------------------------------------------------------------------
       
   205 //
       
   206 void CHidRemconBearer::SetSVKOperationIdAndData( TInt aEnumValue )
       
   207     {
       
   208         TRACE_FUNC
       
   209     // 1. Interface ID is required when Getcommand is called
       
   210     iInterfaceUid = TUid::Uid( KRemConCoreApiUid ); // from Remconcoreapi.h
       
   211     switch ( aEnumValue )
       
   212         {
       
   213         case KPSVolumeUpPressed:
       
   214             iOperationId = ERemConCoreApiVolumeUp;
       
   215             iData.Format( KFormatString, ERemConCoreApiButtonPress );
       
   216             break;
       
   217         case KPSVolumeUpReleased:
       
   218             iOperationId = ERemConCoreApiVolumeUp;
       
   219             iData.Format( KFormatString, ERemConCoreApiButtonRelease );
       
   220             break;
       
   221         case KPSVolumeUpClicked:
       
   222             iOperationId = ERemConCoreApiVolumeUp;
       
   223             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   224             break;
       
   225         case KPSVolumeDownPressed:
       
   226             iOperationId = ERemConCoreApiVolumeDown;
       
   227             iData.Format( KFormatString, ERemConCoreApiButtonPress );
       
   228             break;
       
   229         case KPSVolumeDownReleased:
       
   230             iOperationId = ERemConCoreApiVolumeDown;
       
   231             iData.Format( KFormatString, ERemConCoreApiButtonRelease );
       
   232             break;
       
   233         case KPSVolumeDownClicked:
       
   234             iOperationId = ERemConCoreApiVolumeDown;
       
   235             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   236             break;
       
   237         case KPSVolumeNoKey: // This should never execute
       
   238             break;
       
   239         default:
       
   240             iOperationId = aEnumValue;
       
   241             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   242             break;
       
   243         }
       
   244     }
       
   245 
       
   246 // ---------------------------------------------------------------------------
       
   247 // CHidRemconBearer::SetMuteKeyOperationIdAndData
       
   248 // ---------------------------------------------------------------------------
       
   249 //
       
   250 void CHidRemconBearer::SetMuteKeyOperationIdAndData( TInt aEnumValue )
       
   251     {
       
   252         TRACE_INFO((_L("[HID]\tCHidRemconBearer::SetMuteKeyOperation \
       
   253                 IdAndData( %d )"), aEnumValue));
       
   254     // 1. Interface ID is required when Getcommand is called
       
   255     iInterfaceUid = TUid::Uid( KRemConCoreApiUid ); // from Remconcoreapi.h
       
   256     switch ( aEnumValue )
       
   257         {
       
   258         case KPSMutePressed:
       
   259             iOperationId = ERemConCoreApiMute;
       
   260             iData.Format( KFormatString, ERemConCoreApiButtonPress );
       
   261             break;
       
   262         case KPSMuteReleased:
       
   263             iOperationId = ERemConCoreApiMute;
       
   264             iData.Format( KFormatString, ERemConCoreApiButtonRelease );
       
   265             break;
       
   266         case KPSMuteClicked:
       
   267             iOperationId = ERemConCoreApiMute;
       
   268             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   269             break;
       
   270         default:
       
   271             TRACE_INFO(_L("CHidRemconBearer::SetMuteKeyOperationIdAndData : \
       
   272                     Not supported"))
       
   273             ;
       
   274         }
       
   275     }
       
   276 
       
   277 // ---------------------------------------------------------------------------
       
   278 // CHidRemconBearer::SetMediaKeyOperationIdAndData()
       
   279 // ---------------------------------------------------------------------------
       
   280 //
       
   281 void CHidRemconBearer::SetMediaKeyOperationIdAndData( TInt aEnumValue )
       
   282     {
       
   283         TRACE_FUNC
       
   284     // 1. Interface ID is required when Getcommand is called
       
   285     iInterfaceUid = TUid::Uid( KRemConCoreApiUid ); // from Remconcoreapi.h
       
   286     switch ( aEnumValue )
       
   287         {
       
   288         case EPlayReleased:
       
   289             iOperationId = ERemConCoreApiPausePlayFunction;
       
   290             iData.Format( KFormatString, ERemConCoreApiButtonRelease );
       
   291             break;
       
   292         case EPlayPressed:
       
   293             iOperationId = ERemConCoreApiPausePlayFunction;
       
   294             iData.Format( KFormatString, ERemConCoreApiButtonPress );
       
   295             break;
       
   296         case EPlayClicked:
       
   297             iOperationId = ERemConCoreApiPausePlayFunction;
       
   298             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   299             break;
       
   300         case EStopReleased:
       
   301             iOperationId = ERemConCoreApiStop;
       
   302             iData.Format( KFormatString, ERemConCoreApiButtonRelease );
       
   303             break;
       
   304         case EStopPressed:
       
   305             iOperationId = ERemConCoreApiStop;
       
   306             iData.Format( KFormatString, ERemConCoreApiButtonPress );
       
   307             break;
       
   308         case EStopClicked:
       
   309             iOperationId = ERemConCoreApiStop;
       
   310             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   311             break;
       
   312         case EForwardReleased:
       
   313             iOperationId = ERemConCoreApiForward;
       
   314             iData.Format( KFormatString, ERemConCoreApiButtonRelease );
       
   315             break;
       
   316         case EForwardPressed:
       
   317             iOperationId = ERemConCoreApiForward;
       
   318             iData.Format( KFormatString, ERemConCoreApiButtonPress );
       
   319             break;
       
   320         case EForwardClicked:
       
   321             iOperationId = ERemConCoreApiForward;
       
   322             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   323             break;
       
   324         case ERewindReleased:
       
   325             iOperationId = ERemConCoreApiRewind;
       
   326             iData.Format( KFormatString, ERemConCoreApiButtonRelease );
       
   327             break;
       
   328         case ERewindPressed:
       
   329             iOperationId = ERemConCoreApiRewind;
       
   330             iData.Format( KFormatString, ERemConCoreApiButtonPress );
       
   331             break;
       
   332         case ERewindClicked:
       
   333             iOperationId = ERemConCoreApiRewind;
       
   334             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   335             break;
       
   336         case EFastForwardReleased:
       
   337             iOperationId = ERemConCoreApiFastForward;
       
   338             iData.Format( KFormatString, ERemConCoreApiButtonRelease );
       
   339             break;
       
   340         case EFastForwardPressed:
       
   341             iOperationId = ERemConCoreApiFastForward;
       
   342             iData.Format( KFormatString, ERemConCoreApiButtonPress );
       
   343             break;
       
   344         case EFastForwardClicked:
       
   345             iOperationId = ERemConCoreApiFastForward;
       
   346             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   347             break;
       
   348         case EBackwardReleased:
       
   349             iOperationId = ERemConCoreApiBackward;
       
   350             iData.Format( KFormatString, ERemConCoreApiButtonRelease );
       
   351             break;
       
   352         case EBackwardPressed:
       
   353             iOperationId = ERemConCoreApiBackward;
       
   354             iData.Format( KFormatString, ERemConCoreApiButtonPress );
       
   355             break;
       
   356         case EBackwardClicked:
       
   357             iOperationId = ERemConCoreApiBackward;
       
   358             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   359             break;
       
   360             // This should never execute
       
   361         default:
       
   362             iOperationId = aEnumValue;
       
   363             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   364             break;
       
   365 
       
   366         }
       
   367     }
       
   368 // ---------------------------------------------------------------------------
       
   369 // CHidRemconBearer::ReceivedKeyEvent()
       
   370 // ---------------------------------------------------------------------------
       
   371 //
       
   372 void CHidRemconBearer::SetPhoneKeyOperationIdAndData( TInt aEnumValue )
       
   373     {
       
   374     TRACE_FUNC_ENTRY
       
   375     iInterfaceUid = TUid::Uid( KRemConExtCallHandlingApiUid );
       
   376     switch ( aEnumValue )
       
   377         {
       
   378         case KPSAnsweClicked:
       
   379             TRACE_INFO((_L("[HID]\tCHidRemconBearer::SetPhoneKey \
       
   380                     OperationIdAndData Answer")));
       
   381             iOperationId = ERemConExtAnswerCall;
       
   382             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   383             break;
       
   384         case KPSHangUpClicked:
       
   385             iOperationId = ERemConExtEndCall;
       
   386             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   387             break;
       
   388         case KPSRedial:
       
   389             iOperationId = ERemConExtLastNumberRedial;
       
   390             iData.Format( KFormatString, ERemConCoreApiButtonClick );
       
   391             break;
       
   392         case KPSVoiceDial:
       
   393             iOperationId = ERemConExtVoiceDial;
       
   394             iData.Format( KVoiceFormatString, ERemConCoreApiButtonRelease );
       
   395             break;
       
   396         default:
       
   397             TRACE_INFO(_L("CHidRemconBearer::SetPhoneKeyOperationIdAndData \
       
   398                     : Not supported"));        }
       
   399     TRACE_FUNC_EXIT
       
   400     }
       
   401 // ---------------------------------------------------------------------------
       
   402 // CHidRemconBearer::ReceivedKeyEvent()
       
   403 // ---------------------------------------------------------------------------
       
   404 //
       
   405 void CHidRemconBearer::ReceivedKeyEvent( TInt aEnumValue, TInt aKeyType )
       
   406     {
       
   407     TRACE_INFO((_L("[HID]\tCHidRemconBearer::ReceivedKeyEvent: value %d, \
       
   408             type %d )"), aEnumValue, aKeyType));
       
   409 
       
   410     /* To keep the background light on */
       
   411     User::ResetInactivityTime();
       
   412 
       
   413     // 2. Transaction ID
       
   414     iTransactionId = Observer().NewTransactionId();
       
   415 
       
   416     // 3. Addr 
       
   417     TRemConAddress addr;
       
   418     addr.BearerUid() = Uid();
       
   419     addr.Addr() = KNullDesC8();
       
   420 
       
   421     // 4 & 5. Operation ID and Data
       
   422     HandleKeyOperation( aEnumValue, aKeyType );
       
   423 
       
   424     // Msgtype  is ERemConCommand
       
   425     TInt error = Observer().NewCommand( addr );
       
   426     TRACE_INFO((_L("[HID]\tCHidRemconBearer::ReceivedKeyEvent: error %d )"), 
       
   427             error));
       
   428     //Start the listener once again     
       
   429     RestartKeyObeserver( aKeyType );
       
   430 
       
   431     }
       
   432 
       
   433 // ---------------------------------------------------------------------------
       
   434 // CHidRemconBearer::RestartKeyObeserver
       
   435 // ---------------------------------------------------------------------------
       
   436 //
       
   437 void CHidRemconBearer::RestartKeyObeserver( TInt aKeyType )
       
   438     {
       
   439     TRACE_FUNC_ENTRY
       
   440     switch ( aKeyType )
       
   441         {
       
   442         case EMediaKeys:
       
   443             iMediaKeyObserver->Start();
       
   444             break;
       
   445         case EAccessoryVolumeKeys:
       
   446             iAccessoryVolKeyObserver->Start();
       
   447             break;
       
   448         case EMuteKey:
       
   449             iMuteKeyObserver->Start();
       
   450             break;
       
   451         case EHookKeys:
       
   452             iHookKeyObserver->Start();
       
   453             break;
       
   454         default:
       
   455             TRACE_INFO(_L("CHidRemconBearer::RestartKeyObeserver : Not supported"))
       
   456             ;
       
   457         }
       
   458         TRACE_FUNC_EXIT
       
   459     }
       
   460 
       
   461 // ---------------------------------------------------------------------------
       
   462 // CHidRemconBearer::RestartObexserver
       
   463 // ---------------------------------------------------------------------------
       
   464 //
       
   465 void CHidRemconBearer::HandleKeyOperation( TInt aEnumValue, TInt aKeyType )
       
   466     {
       
   467     TRACE_FUNC_ENTRY
       
   468     switch ( aKeyType )
       
   469         {
       
   470         case EAccessoryVolumeKeys:
       
   471             SetSVKOperationIdAndData( aEnumValue );
       
   472             break;
       
   473         case EMuteKey:
       
   474             SetMuteKeyOperationIdAndData( aEnumValue );
       
   475             break;
       
   476         case EMediaKeys:
       
   477             SetMediaKeyOperationIdAndData( aEnumValue );
       
   478             break;
       
   479         case EHookKeys:
       
   480             SetPhoneKeyOperationIdAndData( aEnumValue );
       
   481             break;
       
   482         default:
       
   483             TRACE_INFO(_L("CHidRemconBearer::HandleKeyOperation : Not \
       
   484                     supported"))
       
   485             ;
       
   486         }
       
   487     TRACE_FUNC_EXIT
       
   488     }
       
   489 // ---------------------------------------------------------------------------
       
   490 // CHidRemconBearer::SecurityPolicy()
       
   491 // ---------------------------------------------------------------------------
       
   492 //
       
   493 TSecurityPolicy CHidRemconBearer::SecurityPolicy() const
       
   494     {
       
   495     return TSecurityPolicy( ECapabilityLocalServices );
       
   496     }
       
   497 
       
   498 // ---------------------------------------------------------------------------
       
   499 // CHidRemconBearer::ClientStatus()
       
   500 // ---------------------------------------------------------------------------
       
   501 //
       
   502 void CHidRemconBearer::ClientStatus( TBool /*aControllerPresent*/, TBool /*aTargetPresent*/)
       
   503     {
       
   504         //Pass
       
   505     TRACE_FUNC
       
   506     }
       
   507 
       
   508 // ---------------------------------------------------------------------------
       
   509 // CHidRemconBearer::GetInterface()
       
   510 // ---------------------------------------------------------------------------
       
   511 //
       
   512 TAny* CHidRemconBearer::GetInterface( TUid aUid )
       
   513     {
       
   514     TRACE_FUNC
       
   515     TAny* ret = NULL;
       
   516     if ( aUid == TUid::Uid( KRemConBearerInterface1 ) )
       
   517         {
       
   518         ret = reinterpret_cast<TAny*> ( 
       
   519                         static_cast<MRemConBearerInterface*> ( this ) );
       
   520         }
       
   521     return ret;
       
   522     }