diff -r 000000000000 -r 2e3d3ce01487 mediakeys/KeyPublisherPlugin/src/KeyPublisher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mediakeys/KeyPublisherPlugin/src/KeyPublisher.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,439 @@ +/* +* Copyright (c) 2005 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: +* Animation plugin implementation file +* +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include + +#include "KeyPublisher.h" + +// CONSTANTS + +const TInt KScanCodeMask = 0xFFFF; + +#if defined(__WINS__) +const TInt KVolumeUpKeyEmulator = 0xAC; +const TInt KVolumeDownKeyEmulator = 0xAD; +#endif +// Change these values once peoblem with keys is fixed +const TInt KVolumeUpKeyHardware = EStdKeyIncVolume; //0xa3; +const TInt KVolumeDownKeyHardware = EStdKeyDecVolume; //0xa2; + +const TInt KMusicPlayHarware = EStdKeyApplication2; +const TInt KMusicStopHarware = EStdKeyApplication3; +const TInt KMusicForwardHardware = EStdKeyApplication4; +const TInt KMusicRewindHardware = EStdKeyApplication5; + +// Scan codes in this table are blocked by the Key Publisher Anim plugin +// Table KBlockedKeyCodes[] and KBlockedKeyCodesEvents[][3] must have same +// number of rows and match correspondingly +const TInt KBlockedKeyCodes[]= + { +#if defined(__WINS__) + /*0*/KVolumeUpKeyEmulator, + /*1*/KVolumeDownKeyEmulator, +#endif + /*2*/KVolumeUpKeyHardware, + /*3*/KVolumeDownKeyHardware, + + /*4*/ KMusicPlayHarware, + /*5*/ KMusicStopHarware, + /*6*/ KMusicForwardHardware, + /*7*/ KMusicRewindHardware + + }; +const TInt KBlockedKeyCodesEvents[][3]= + { /* Press - 0 */ /* Release - 1 */ /* Click - 2 */ +#if defined(__WINS__) + /*0*/{KPSVolumeUpPressed, KPSVolumeUpReleased, KPSVolumeUpClicked }, + /*1*/{KPSVolumeDownPressed, KPSVolumeDownReleased, KPSVolumeDownClicked }, +#endif + /*2*/{KPSVolumeUpPressed, KPSVolumeUpReleased, KPSVolumeUpClicked }, + /*3*/{KPSVolumeDownPressed, KPSVolumeDownReleased, KPSVolumeDownClicked }, + + /*4*/{EPlayPressed, EPlayReleased, EPlayClicked }, + /*5*/{EStopPressed, EStopReleased, EStopClicked }, + /*6*/{EFastForwardPressed, EFastForwardReleased, EForwardClicked }, + /*7*/{ERewindPressed, ERewindReleased, EBackwardClicked } + + }; + +const TInt KBlockedKeyCodeTableSize = sizeof(KBlockedKeyCodes) / sizeof(TInt); + +const TInt KTimerMilliSecond = 1000; // in micro seconds + +_LIT_SECURITY_POLICY_C1(KKeyPublisherReadPolicy, ECapability_None); +_LIT_SECURITY_POLICY_C1(KKeyPublisherWritePolicy, ECapabilityWriteDeviceData); + +// Following constants can subject change if duration is not suitable + +const TInt KFirstTimerExpiryInterval = 600 * KTimerMilliSecond; // 600mSec +// For second time onwards ,the duration of the time interval, is below +// Should not be grater than 1 Minute +const TInt KTimerExpiryInterval = 500 * KTimerMilliSecond; // 500mSec + +// ----------------------------------------------------------------------- +// CKeyPublisher::CKeyPublisher +// Description: Constuctor +// ----------------------------------------------------------------------- +// +CKeyPublisher::CKeyPublisher() +: iTimerStarted (EFalse) ,iPressEventSent(EFalse) ,iReleaseEventSent(ETrue), + iTimerCount(0), iConnected(EFalse) + { + } +// ----------------------------------------------------------------------- +// CKeyPublisher::~CKeyPublisher +// Description: Destructor +// ----------------------------------------------------------------------- +// +CKeyPublisher::~CKeyPublisher() + { + + iSoundSession.Close(); + + if (iFunctions) + { + //switch OFF the animation raw event receiving + iFunctions->GetRawEvents(EFalse); + } + if(iTimer) + { + delete iTimer; + } + } +// ----------------------------------------------------------------------- +// CKeyPublisher::ConstructL (part of CWindowAnim) +// Description: Enable the Raw Event handling from Win server. and +// create timer (not starting) +// ----------------------------------------------------------------------- +// +void CKeyPublisher::ConstructL(TAny* /*aArgs*/, TBool /*aHasFocus*/) + { + + /* iFunction: protected member of CAnim /CWindowAnim + * Pointer to a class containing functions implemented by the window + * server. These are available to any CAnim derived class. Note that + * this value is automatically set for you by the animation framework. + * we do not need to assign a value to this pointer. + */ + + /* This function switches animation raw event handling on and off. If + * raw event handling is switched on(ETrue), then raw events, + * e.g. pen events, key presses, power events etc., are all offered + * to the animation event handling code - MEventHandler::OfferRawEventL(). + */ + iFunctions->GetRawEvents(ETrue); + + TInt error = iSoundSession.Connect(); + if (error == KErrNone) + { + iConnected = ETrue; + } + + // Timer for implementing Pressed/Released/Clicked feature. + iTimer = CPeriodic::NewL(CActive::EPriorityStandard); + + //Define the P&S for Volume keys and Media Keys + RProperty::Define(KPSUidMediaKeysEventNotifier, KMediaKeysVolumeKeyEvent, + RProperty::EInt, KKeyPublisherReadPolicy, KKeyPublisherWritePolicy); + RProperty::Define(KPSUidMediaKeysEventNotifier, KMediaKeysControlKeyEvent, + RProperty::EInt, KKeyPublisherReadPolicy, KKeyPublisherWritePolicy); + // Define Vol Sync Notifier in P & S + RProperty::Define(KPSUidMediaKeysEventNotifier,KMediaKeysCurrentVolume, + RProperty::EInt, KKeyPublisherReadPolicy, KKeyPublisherWritePolicy); + // Define P&S Key for Volume keys from Accessory device + RProperty::Define(KPSUidMediaKeysEventNotifier,KMediaKeysAccessoryVolumeEvent, + RProperty::EInt, KKeyPublisherReadPolicy, KKeyPublisherWritePolicy); + } +// ----------------------------------------------------------------------- +// CKeyPublisher::IsBlockedKeyCode +// Description: Search the list of blocked keys by comparing scan codes +// return : ETrue if key is blocked, else EFalse +// ----------------------------------------------------------------------- +// +TBool CKeyPublisher::IsBlockedKeyCode(TInt aScanCode) + { + for (TInt index=0; index < KBlockedKeyCodeTableSize; index++) + { + if (aScanCode == KBlockedKeyCodes[index]) + { + // Found the Key + return ETrue; + } + } + // Not found + return EFalse; + } +// ----------------------------------------------------------------------- +// CKeyPublisher::GetEnumVal +// Description: Based on the scancode and event, find the Enum value(which +// are declared in the TRemConCoreApiButtonAction). +// MMBearerPlugin will decript this enum value. +// return : +// ----------------------------------------------------------------------- +// +TInt CKeyPublisher::GetEnumVal(TInt aScanCode, + TRemConCoreApiButtonAction aEvent) + { + TInt result = KPSVolumeNoKey; + TInt index; + + // Find the Index of the Scan code in the KBlockedKeyCodes[] + // and use the same index in KBlockedKeyCodesEvents[][] + // for getting enum values + for (index=0; index < KBlockedKeyCodeTableSize; index++) + { + if (aScanCode == KBlockedKeyCodes[index]) + { + break; + } + } + + if (index == KBlockedKeyCodeTableSize) + { + // Not found + return result; + } + + result = KBlockedKeyCodesEvents[index][aEvent]; + return result; + } +// ----------------------------------------------------------------------- +// CKeyPublisher::PublishEvent +// Description: Publish the event to P&S based on the Scancode, event +// return : +// ----------------------------------------------------------------------- +// +void CKeyPublisher::PublishEvent(TInt aScanCode, + TRemConCoreApiButtonAction aEvent) + { + TInt uidMMKey; + + if ( +#if defined(__WINS__) + (aScanCode == KVolumeUpKeyEmulator) || + (aScanCode == KVolumeDownKeyEmulator) || +#endif + (aScanCode == KVolumeUpKeyHardware) || + (aScanCode == KVolumeDownKeyHardware) + ) + { + uidMMKey = KMediaKeysVolumeKeyEvent; // Volume Keys - Up / down + } + else + { + uidMMKey = KMediaKeysControlKeyEvent; //Media Keys - play ,stop ,etc + } + + iProperty.Set(KPSUidMediaKeysEventNotifier, + uidMMKey, + GetEnumVal(aScanCode, aEvent)); + + } + +// ----------------------------------------------------------------------- +// CKeyPublisher::OfferRawEvent +// Description: This function starts getting called when animation raw +// event is switched on by calling GetRawEvents(ETrue) +// return : ETrue - if key is handled and blocks it to applications +// EFalse - if not handled here, Apps/other anim plugins will +// receive this key event. +// ----------------------------------------------------------------------- +// +TBool CKeyPublisher::OfferRawEvent(const TRawEvent &aRawEvent) + { + TBool returnValue = EFalse; // Key not blocked + TInt scan; + + switch (aRawEvent.Type()) + { + case TRawEvent::EKeyDown: + { + scan = aRawEvent.ScanCode() & KScanCodeMask; + + if (IsBlockedKeyCode(scan)) + { + if (iConnected) + { + iSoundSession.KeyPressed(scan); + } + + if ((! iTimerStarted) && (iReleaseEventSent)) + { + + if ((scan != KMusicForwardHardware) && (scan != KMusicRewindHardware)) + { + // Send Clicked Event + PublishEvent(scan,ERemConCoreApiButtonClick); + } + + //Start Timer + iTimer->Start(KFirstTimerExpiryInterval, + KTimerExpiryInterval, + TCallBack(TimerCallback, this)); + iTimerStarted = ETrue; + iPrevScanCode = scan; + iPressEventSent = EFalse; + returnValue = ETrue; // Block + iReleaseEventSent = EFalse; // For blocking multiple key + // presses + } + } + } + break; + case TRawEvent::EKeyUp: + { + scan = aRawEvent.ScanCode() & KScanCodeMask; + + if ((iPrevScanCode == scan) && IsBlockedKeyCode(scan)) + { + + // Clicked Scenario + if ( iPressEventSent == EFalse ) + { + + if ((iPrevScanCode == KMusicForwardHardware) || + (iPrevScanCode == KMusicRewindHardware)) + { + // Send Clicked Event + PublishEvent(iPrevScanCode, ERemConCoreApiButtonClick); + } + + // Since Click event has been sent when pressed down, + // (except Frwd & Rewind) + // Just stop the timer + if (iTimerStarted) + { + iTimer->Cancel(); + iTimerStarted = EFalse; + } + iReleaseEventSent = ETrue; + iPrevScanCode = 0; + returnValue = ETrue; //Block it + } + else // Released Scenario + { + PublishEvent(scan,ERemConCoreApiButtonRelease); + + iPrevScanCode = 0; + iPressEventSent = EFalse; + returnValue = ETrue; //Block it + iReleaseEventSent = ETrue; + + } + + } // end of if ((iPrevScanCode == scan) && IsBlockedK... + } + break; + default: + break; + } + return returnValue; // to allow the event to be passed back to app + } +// ----------------------------------------------------------------------- +// CKeyPublisher::HandleTimerEvent +// Description: When Timer is expired, this function is called from +// callback function. If the timer is expired for the first +// time then KeyPressed event is published to P&S. And +// second and further expires, only count is incremented. +// Once the count reaches some predefined value, Released +// Key event is posted to P&S. and timer is switched off. +// return : +// ----------------------------------------------------------------------- +// +void CKeyPublisher::HandleTimerEvent() + { + + // Send Pressed Key Event + PublishEvent(iPrevScanCode,ERemConCoreApiButtonPress); + iPressEventSent = ETrue; + iTimer->Cancel(); + iTimerStarted = EFalse; + + } + +// ----------------------------------------------------------------------- +// CKeyPublisher::TimerCallback +// Description: When Timer is expired, this function is called +// return : +// ----------------------------------------------------------------------- +// +TInt CKeyPublisher::TimerCallback(TAny* aThis) + { + + //STATIC_CAST(CKeyPublisher*,aThis)->HandleTimerEvent(); + static_cast(aThis)->HandleTimerEvent(); + return 0; + + } + +// ----------------------------------------------------------------------- +// CKeyPublisher::Redraw (part of CWindowAnim - pure virtual function) +// Description: +// ----------------------------------------------------------------------- +// +void CKeyPublisher::Redraw() + { + //Pass + } +// ----------------------------------------------------------------------- +// CKeyPublisher::FocusChanged (part of CWindowAnim - pure virtual function) +// Description: +// ----------------------------------------------------------------------- +// +void CKeyPublisher::FocusChanged(TBool /*aState*/) + { + //Pass + } +// ----------------------------------------------------------------------- +// CKeyPublisher::CommandReplyL (part of CAnim - pure virtual function) +// Description: +// ----------------------------------------------------------------------- +// +TInt CKeyPublisher::CommandReplyL(TInt /*aOpcode*/, TAny* /*aArgs*/) + { + //Pass + return KErrNone; + } +// ----------------------------------------------------------------------- +// CKeyPublisher::Command (part of CAnim - pure virtual function) +// Description: +// ----------------------------------------------------------------------- +// +void CKeyPublisher::Command(TInt /*aOpcode*/, TAny* /*aArgs*/) + { + //Pass + } +// ----------------------------------------------------------------------- +// CKeyPublisher::Animate (part of CAnim - pure virtual function) +// Description: +// ----------------------------------------------------------------------- +// +void CKeyPublisher::Animate(TDateTime* /*aDateTime*/) + { + //Pass + } + +// End of File