mediakeys/MMKeyBearer/src/MMKeyBearerImplementation.cpp
changeset 0 2e3d3ce01487
child 2 7645e9ce10dc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mediakeys/MMKeyBearer/src/MMKeyBearerImplementation.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,490 @@
+/*
+* Copyright (c) 2005-2008 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 FILES
+#include <e32def.h>
+#include <remcon/remconbearerobserver.h>
+#include <remcon/remconconverterplugin.h>
+#include <remconaddress.h>
+#include <remconcoreapi.h>
+#include <mediakeysinternalpskeys.h>
+#include <UsbWatcherInternalPSKeys.h>
+#include <usbpersonalityids.h>
+#include <PSVariables.h>   // Property values
+
+// Include this once it is exported
+// #include <RemConExtensionApi.h>
+
+#include "MMKeyBearerImplementation.h"
+#include "MMKeyBearerObserverPS.h"
+#include "mmkeybearerscancodes.h"
+#include "trace.h"
+
+#define SET_MEDIAKEY_OPID(eNum, opId, remconEvent) \
+case eNum:                                          \
+	iOperationId = opId;                            \
+    iData.Format(KFormatString,remconEvent);        \
+    break;
+
+//Constants
+_LIT8(KFormatString,"%c");
+
+// ---------------------------------------------------------
+// CMMKeyBearer::NewL()
+// Description: Factory function.
+// return: Ownership of a new CMMKeyBearer.
+// ---------------------------------------------------------
+//
+CMMKeyBearer* CMMKeyBearer::NewL(TBearerParams& aParams)
+    {
+    FUNC_LOG;
+
+    CMMKeyBearer* self = new(ELeave) CMMKeyBearer(aParams);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CMMKeyBearer::~CMMKeyBearer()
+// Destructor.
+// ---------------------------------------------------------
+//
+CMMKeyBearer::~CMMKeyBearer()
+    {
+    FUNC_LOG;
+
+    delete iMMKeyBearerObserver;
+    delete iMediaKeyObserver;
+    delete iAccessoryVolKeyObserver;
+    delete iUSBFileTransferObserver;
+    iAknServer.Close();
+    }
+
+// ---------------------------------------------------------
+// CMMKeyBearer::CMMKeyBearer()
+// construction.
+// ---------------------------------------------------------
+//
+CMMKeyBearer::CMMKeyBearer(TBearerParams& aParams)
+:   CRemConBearerPlugin(aParams),
+    iUSBFileTransfer(KUsbWatcherSelectedPersonalityNone),
+    iAknServerConnected(EFalse)
+    {
+    FUNC_LOG;
+
+    //Pass
+    }
+
+// ---------------------------------------------------------
+// CMMKeyBearer::ConstructL()
+// 2nd-phase construction.
+// ---------------------------------------------------------
+//
+void CMMKeyBearer::ConstructL()
+    {
+    FUNC_LOG;
+
+    // throw an indication up to RemCon.
+    TRemConAddress addr;
+    addr.BearerUid() = Uid();
+    TInt err = Observer().ConnectIndicate(addr);
+
+    // Start Active object for listening key events from P&S
+    TRAP_AND_LEAVE(
+        iMMKeyBearerObserver = CMMKeyBearerObserver::NewL(*this, ESideVolumeKeys),
+        "Volume key observer init failed" );
+
+    TRAP_AND_LEAVE(
+        iMediaKeyObserver = CMMKeyBearerObserver::NewL(*this, EMediaKeys),
+        "Media key observer init failed" );
+
+    TRAP_AND_LEAVE(
+        iAccessoryVolKeyObserver = CMMKeyBearerObserver::NewL(*this, EAccessoryVolumeKeys),
+        "Accessory key observer init failed" );
+
+    TRAP_AND_LEAVE(
+        iUSBFileTransferObserver = CMMKeyBearerObserver::NewL(*this, EFileTransferStatus),
+        "USB observer init failed" );
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::ConnectRequest()
+// Rem Con server send connect request to Bearer Plugin
+// ---------------------------------------------------------
+//
+void CMMKeyBearer::ConnectRequest(const TRemConAddress& /*aAddr*/)
+    {
+    FUNC_LOG;
+
+    // Pass
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::DisconnectRequest()
+// Rem Con server send disconnect request to Bearer Plugin
+// ---------------------------------------------------------
+//
+void CMMKeyBearer::DisconnectRequest(const TRemConAddress& /*aAddr*/)
+    {
+    FUNC_LOG;
+
+    // Pass
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::SendResponse()
+//
+// ---------------------------------------------------------
+//
+TInt CMMKeyBearer::SendResponse(TUid /* aInterfaceUid */,
+        TUint /*aOperationId*/,
+        TUint /*aTransactionId*/, // we don't care about this transaction ID
+        RBuf8&  aData ,
+        const TRemConAddress& /*aAddr*/)
+    {
+    FUNC_LOG;
+
+    aData.Close();
+    return KErrNone;
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::SendCommand()
+//
+// ---------------------------------------------------------
+//
+TInt CMMKeyBearer::SendCommand(TUid /* aInterfaceUid */ ,
+        TUint /* aOperationId */,
+        TUint /* aTransactionId */,
+        RBuf8& /* aData */,
+        const TRemConAddress& /*aAddr*/)
+    {
+    FUNC_LOG;
+
+    return KErrNone;
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::GetResponse()
+//
+// ---------------------------------------------------------
+//
+TInt CMMKeyBearer::GetResponse(TUid& /* aInterfaceUid */,
+        TUint& /* aTransactionId*/,
+        TUint& /* aOperationId */,
+        RBuf8& /* aData */,
+        TRemConAddress& /*aAddr */)
+    {
+    FUNC_LOG;
+
+    return KErrNone;
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::GetCommand()
+//
+// ---------------------------------------------------------
+//
+TInt CMMKeyBearer::GetCommand(TUid& aInterfaceUid ,
+        TUint& aTransactionId,
+        TUint& aOperationId,
+        RBuf8& aData,
+        TRemConAddress& aAddr)
+    {
+    FUNC_LOG;
+
+    aInterfaceUid = iInterfaceUid;
+    aOperationId = iOperationId;
+
+    // Pass ownership of this to RemCon.
+    TRAPD_ERR( err, aData.CreateL(iData) );
+    ERROR( err, "Remcon ownership change failed" );
+
+    aAddr.BearerUid() = Uid();
+    aAddr.Addr() = KNullDesC8();
+
+    aTransactionId = iTransactionId;
+
+    return KErrNone;
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::SetSVKOperationIdAndData()
+//
+// ---------------------------------------------------------
+//
+void CMMKeyBearer::SetSVKOperationIdAndData(TInt aEnumValue)
+    {
+    FUNC_LOG;
+
+    INFO_1( "SetSVKOperationIdAndData: enumValue = %d", aEnumValue );
+
+    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
+        default:
+            iOperationId = aEnumValue;
+            iData.Format(KFormatString,ERemConCoreApiButtonClick);
+            break;
+
+        }
+
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::SetMediaKeyOperationIdAndData()
+//
+// ---------------------------------------------------------
+//
+void CMMKeyBearer::SetMediaKeyOperationIdAndData(TInt aEnumValue)
+    {
+    FUNC_LOG;
+
+    INFO_1( "SetMediaKeyOperationIdAndData: enumValue = %d", aEnumValue );
+
+    switch (aEnumValue)
+        {
+
+        SET_MEDIAKEY_OPID (EPlayReleased, ERemConCoreApiPausePlayFunction,
+                           ERemConCoreApiButtonRelease);
+        SET_MEDIAKEY_OPID (EPlayPressed,  ERemConCoreApiPausePlayFunction,
+                           ERemConCoreApiButtonPress);
+        SET_MEDIAKEY_OPID (EPlayClicked,  ERemConCoreApiPausePlayFunction,
+                           ERemConCoreApiButtonClick);
+
+        SET_MEDIAKEY_OPID (EStopReleased, ERemConCoreApiStop,
+                           ERemConCoreApiButtonRelease);
+        SET_MEDIAKEY_OPID (EStopPressed,  ERemConCoreApiStop,
+                           ERemConCoreApiButtonPress);
+        SET_MEDIAKEY_OPID (EStopClicked,  ERemConCoreApiStop,
+                           ERemConCoreApiButtonClick);
+
+        SET_MEDIAKEY_OPID (EForwardReleased, ERemConCoreApiForward,
+                           ERemConCoreApiButtonRelease);
+        SET_MEDIAKEY_OPID (EForwardPressed,  ERemConCoreApiForward,
+                           ERemConCoreApiButtonPress);
+        SET_MEDIAKEY_OPID (EForwardClicked,  ERemConCoreApiForward,
+                           ERemConCoreApiButtonClick);
+
+        SET_MEDIAKEY_OPID (ERewindReleased, ERemConCoreApiRewind,
+                           ERemConCoreApiButtonRelease);
+        SET_MEDIAKEY_OPID (ERewindPressed,  ERemConCoreApiRewind,
+                           ERemConCoreApiButtonPress);
+        SET_MEDIAKEY_OPID (ERewindClicked,  ERemConCoreApiRewind,
+                           ERemConCoreApiButtonClick);
+
+        SET_MEDIAKEY_OPID (EFastForwardReleased, ERemConCoreApiFastForward,
+                           ERemConCoreApiButtonRelease);
+        SET_MEDIAKEY_OPID (EFastForwardPressed,  ERemConCoreApiFastForward,
+                           ERemConCoreApiButtonPress);
+        SET_MEDIAKEY_OPID (EFastForwardClicked,  ERemConCoreApiFastForward,
+                           ERemConCoreApiButtonClick);
+
+        SET_MEDIAKEY_OPID (EBackwardReleased, ERemConCoreApiBackward,
+                           ERemConCoreApiButtonRelease);
+        SET_MEDIAKEY_OPID (EBackwardPressed,  ERemConCoreApiBackward,
+                           ERemConCoreApiButtonPress);
+        SET_MEDIAKEY_OPID (EBackwardClicked,  ERemConCoreApiBackward,
+                           ERemConCoreApiButtonClick);
+
+
+        // This should never execute
+        default:
+            iOperationId = aEnumValue;
+            iData.Format(KFormatString,ERemConCoreApiButtonClick);
+            break;
+
+        }
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::ReceivedKeyEvent()
+//
+// ---------------------------------------------------------
+//
+void CMMKeyBearer::ReceivedKeyEvent(TInt aEnumValue, TInt aKeyType)
+    {
+    FUNC_LOG;
+
+    INFO_3( "Received key: enumValue = %d, keyType = %d, usbFileTransfer = %d",
+        aEnumValue, aKeyType, iUSBFileTransfer );
+
+    // Mediakeys must be disabled when MTP (Music Transfer) is happening.
+    if (aKeyType == EFileTransferStatus)
+        {
+        iUSBFileTransferObserver->Start(); // Ensure first that no status change gets missed
+        iUSBFileTransfer = iUSBFileTransferObserver->GetValue(); // Read the MTP status
+        return;
+        }
+    if ((aKeyType == EMediaKeys) &&
+        (iUSBFileTransfer == KUsbPersonalityIdMTP ||
+         iUSBFileTransfer == KUsbPersonalityIdPCSuiteMTP))
+        {
+        iMediaKeyObserver->Start();
+        return;
+        }
+
+    // Check for keypadlock if the events are from device keypad
+    // If events are from accessory device,then do not check for keypadlock
+    if (aKeyType != EAccessoryVolumeKeys)
+        {
+        TBool keysLocked = EFalse;
+        if (!(iAknServerConnected))  // Connect to server for first time
+            {
+            if(iAknServer.Connect() == KErrNone)
+                {
+                iAknServerConnected = ETrue;
+                }
+            else                   // If connection fails, then return
+                {
+                //Start the listener once again
+               if (aKeyType == ESideVolumeKeys)
+                    {
+                    iMMKeyBearerObserver->Start();
+                    }
+                if (aKeyType == EMediaKeys)
+                    {
+                    iMediaKeyObserver->Start();
+                    }
+                return ;
+                }
+            }
+        iAknServer.ShowKeysLockedNote(keysLocked);
+
+        if (keysLocked)
+            {
+            // Device is locked , Discard the key event
+
+            //Start the listener once again
+            if (aKeyType == ESideVolumeKeys)
+                {
+                iMMKeyBearerObserver->Start();
+                }
+            if (aKeyType == EMediaKeys)
+                {
+                iMediaKeyObserver->Start();
+                }
+
+            return;
+            }
+        }
+
+    /* To keep the background light on */
+    User::ResetInactivityTime();
+
+    // 1. Interface ID is required when Getcommand is called
+    iInterfaceUid = TUid::Uid(KRemConCoreApiUid); // from Remconcoreapi.h
+
+    // 2. Transaction ID
+    iTransactionId = Observer().NewTransactionId();
+
+    // 3. Addr
+    TRemConAddress addr;
+    addr.BearerUid() = Uid();
+    addr.Addr() = KNullDesC8();
+
+    // 4 & 5. Operation ID and Data
+    if ((aKeyType == ESideVolumeKeys) || (aKeyType == EAccessoryVolumeKeys))
+        {
+        SetSVKOperationIdAndData(aEnumValue);
+        }
+    else
+        {
+        SetMediaKeyOperationIdAndData(aEnumValue);
+        }
+
+    // Msgtype  is ERemConCommand
+    TInt aError = Observer().NewCommand(addr);
+
+    //Start the listener once again
+    if (aKeyType == ESideVolumeKeys)
+        {
+        iMMKeyBearerObserver->Start();
+        }
+    else if (aKeyType == EMediaKeys)
+        {
+        iMediaKeyObserver->Start();
+        }
+    else if (aKeyType == EAccessoryVolumeKeys)
+        {
+        iAccessoryVolKeyObserver->Start();
+        }
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::SecurityPolicy()
+//
+// ---------------------------------------------------------
+//
+TSecurityPolicy CMMKeyBearer::SecurityPolicy() const
+    {
+    FUNC_LOG;
+
+    return TSecurityPolicy(ECapabilityLocalServices);
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::ClientStatus()
+//
+// ---------------------------------------------------------
+//
+void CMMKeyBearer::ClientStatus(TBool /*aControllerPresent*/,
+                                TBool /*aTargetPresent*/)
+    {
+    FUNC_LOG;
+
+    //Pass
+    }
+// ---------------------------------------------------------
+// CMMKeyBearer::GetInterface()
+//
+// ---------------------------------------------------------
+//
+TAny* CMMKeyBearer::GetInterface(TUid aUid)
+    {
+    FUNC_LOG;
+
+    TAny* ret = NULL;
+    if ( aUid == TUid::Uid(KRemConBearerInterface1) )
+        {
+        ret = reinterpret_cast<TAny*>(
+                    static_cast<MRemConBearerInterface*>(this)
+                    );
+        }
+    return ret;
+
+    }
+
+
+// End of file