localconnectivityservice/headset/src/headset.cpp
branchRCL_3
changeset 20 4a793f564d72
parent 19 0aa8cc770c8a
child 21 74aa6861c87d
--- a/localconnectivityservice/headset/src/headset.cpp	Tue Aug 31 16:03:15 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1222 +0,0 @@
-/*
-* Copyright (c) 2004-2010 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:  Generic hid implementation
- *
-*/
-
-
-#include <etel3rdparty.h>
-#include <e32std.h>
-#include <e32svr.h>
-#include <coedef.h>
-#include <eiksvdef.h>
-#include <apgcli.h>
-#include <apgtask.h>
-#include <e32property.h>
-#ifdef NO101APPDEPFIXES
-#include <alarmuidomainpskeys.h>
-#else   //NO101APPDEPFIXES
-const TUid KPSUidAlarmExtCntl = { 0x102072D4 }; // reusing an AlarmUI dll UID
-const TUint32 KAlarmStopKey = 0x00000001;
-enum TAlarmUIStopAlarm
-    {
-    EAlarmUIStopAlarmUninitialized = 0,
-    EAlarmUIStopAlarm
-    };
-const TUint32 KAlarmSnoozeKey = 0x00000002;
-enum TAlarmUISnoozeAlarm
-    {
-    EAlarmUISnoozeAlarmUninitialized = 0,
-    EAlarmUISnoozeAlarm
-    };
-#endif  //NO101APPDEPFIXES
-
-#include <mpxplaybackmessage.h>
-#include <mpxmessagegeneraldefs.h>
-#include <mpxplaybackmessagedefs.h>
-
-#include "hidremconbearerinternalpskeys.h"
-#include "hidremconbearerscancodes.h"
-#include "headset.h"
-#include "finder.h"
-
-#include "debug.h"
-
-const TInt KHidUndefinedKeyCode = 0;
-const TInt KHidNotSetKeyValue = 0;
-const TInt KDoubleClickTimeout = 900000; // 0,9 seconds
-const TInt KDoubleClickTimeoutRing = 500000; // 0,5 seconds
-const TInt KScanClickTimeout = 500000; // 0,5 seconds
-const TInt KLongClickTimeout = 3000000; // 3 seconds
-
-// ======== MEMBER FUNCTIONS ========
-
-// ---------------------------------------------------------------------------
-// CHidHeadsetDriver()
-// ---------------------------------------------------------------------------
-//
-CHidHeadsetDriver::CHidHeadsetDriver( MDriverAccess* aGenericHid ) :
-    iGenericHid( aGenericHid ), iFieldList(), iDriverState( EUninitialised ),
-            iConnectionId( 0 ), iSupportedFieldCount( 0 ), iForwardStatus(
-                    EScanNotPressed ), iBackwardStatus( EScanNotPressed )
-    {
-    TRACE_FUNC_ENTRY_THIS
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// NewLC
-// ---------------------------------------------------------------------------
-//
-CHidHeadsetDriver* CHidHeadsetDriver::NewLC( MDriverAccess* aGenericHid )
-    {
-    TRACE_INFO((_L("[HID]\tCHidHeadsetDriver::NewLC(0x%08x)"), aGenericHid));
-    CHidHeadsetDriver* self = new ( ELeave ) CHidHeadsetDriver( aGenericHid );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// NewL
-// ---------------------------------------------------------------------------
-//
-CHidHeadsetDriver* CHidHeadsetDriver::NewL( MDriverAccess* aGenericHid )
-    {
-    CHidHeadsetDriver* self = CHidHeadsetDriver::NewLC( aGenericHid );
-    CleanupStack::Pop();
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// ConstructL()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::ConstructL()
-    {
-    TRACE_FUNC_THIS
-    iTelephony = CTelephony::NewL();
-    User::LeaveIfError( iAlarmServerSession.Connect() );
-    iMusicPlayer = MMPXPlaybackUtility::UtilityL( KPbModeActivePlayer );
-    iMusicPlayer->AddObserverL( *this );
-    }
-
-// ---------------------------------------------------------------------------
-// Destructor
-// ---------------------------------------------------------------------------
-//
-CHidHeadsetDriver::~CHidHeadsetDriver()
-    {
-    TRACE_FUNC_THIS
-    iAlarmServerSession.Close();
-    delete iTelephony;
-    iFieldList.Reset();
-    iFieldList.Close();
-    delete iDoubleClicktimer;
-    if ( iMusicPlayer )
-        {
-        iMusicPlayer->Close();
-        }
-    delete iScanPreviousTimer;
-    delete iScanNextTimer;
-    delete iLongClicktimer;
-    }
-
-// ---------------------------------------------------------------------------
-// From class CHidDriver
-// StartL()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::StartL( TInt /*aConnectionId*/)
-    {
-    TRACE_FUNC
-    // Ready to process headset events:
-    iDriverState = EInitialised;
-    }
-
-// ---------------------------------------------------------------------------
-// From class CHidDriver
-// InitialiseL()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::InitialiseL( TInt aConnectionId )
-    {
-    TRACE_FUNC
-    TRACE_INFO((_L("[HID]\tCHidHeadsetDriver::InitialiseL(%d)"),
-                        aConnectionId));
-    // Store the connection ID:
-    iConnectionId = aConnectionId;
-    }
-
-// ---------------------------------------------------------------------------
-// From class CHidDriver
-// Stop()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::Stop()
-    {
-    TRACE_FUNC
-    iDriverState = EDisabled;
-    }
-
-// ---------------------------------------------------------------------------
-// From class CHidDriver
-// DataIn()
-// ---------------------------------------------------------------------------
-//
-TInt CHidHeadsetDriver::DataIn( CHidTransport::THidChannelType aChannel,
-        const TDesC8& aPayload )
-    {
-    TInt retVal = KErrNone;
-    switch ( aChannel )
-        {
-        case CHidTransport::EHidChannelInt:
-            if ( EInitialised == iDriverState )
-                {
-                retVal = InterruptData( aPayload );
-                }
-            break;
-
-        case CHidTransport::EHidChannelCtrl:
-            retVal = KErrNotSupported;
-            break;
-
-        default:
-            retVal = KErrNotSupported;
-            break;
-        }
-    return retVal;
-    }
-
-// ---------------------------------------------------------------------------
-// From class CHidDriver
-// CommandResult()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::CommandResult( TInt /*aCmdAck*/)
-    {
-    // No implementation as we don't issue any requests to be acknowledged
-    }
-
-// ---------------------------------------------------------------------------
-// From class CHidDriver
-// Disconnected()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::Disconnected( TInt aReason )
-    {
-    TRACE_INFO((_L("[HID]\tCHidHeadsetDriver::Disconnected(%d)"), aReason));
-    aReason = aReason;
-    Stop();
-    }
-
-// ---------------------------------------------------------------------------
-// From class CHidDriver
-// SetInputHandlingReg()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::SetInputHandlingReg(
-        CHidInputDataHandlingReg* aHandlingReg )
-    {
-    iInputHandlingReg = aHandlingReg;
-    }
-
-// ---------------------------------------------------------------------------
-// From class CHidDriver
-// InterruptData()
-// ---------------------------------------------------------------------------
-//
-TInt CHidHeadsetDriver::InterruptData( const TDesC8& aPayload )
-    {
-    // If the report has a report ID, it is in the first byte.
-    // If not, this value is ignored (see CField::IsInReport()).
-    //
-    TInt retVal = KErrNone;
-    TInt ret = KErrNotSupported;
-    TInt firstByte = aPayload[0];
-
-    TRACE_INFO((_L("[HID]\tCHidHeadsetDriver::InterruptData(), report \
-            0x%x (%d), length %d"),firstByte, firstByte, aPayload.Length()));
-
-    if ( iFieldList.Count() == 0 )
-        {
-        retVal = KErrNotSupported;
-        }
-    for ( TInt i = 0; i < iFieldList.Count(); i++ )
-        {
-        if ( iFieldList[i]->IsInReport( firstByte ) )
-            {
-            ret = HandleReport( aPayload, iFieldList[i] );
-            if ( ret == KErrNone )
-                {
-                retVal = KErrNone;
-                }
-            }
-        else
-            {
-            retVal = KErrNotSupported;
-            }
-        }
-    return retVal;
-    }
-
-// ---------------------------------------------------------------------------
-// HandleReport()
-// ---------------------------------------------------------------------------
-//
-TInt CHidHeadsetDriver::HandleReport( const TDesC8& aReport,
-        const CField* aField )
-    {
-    TRACE_FUNC_ENTRY
-    TReportTranslator report( aReport, aField );
-    TInt retVal = KErrNotSupported;
-
-    // release if key if it pressed and relased
-    ReleasePressedKeys( report );
-
-    if ( HandleTelephonyUsage( report ) == KErrNone )
-        {
-        retVal = KErrNone;
-        }
-
-    if ( HandleControlUsage( report ) == KErrNone )
-        {
-        retVal = KErrNone;
-        }
-
-    if ( HandleVolumeUsage( report ) == KErrNone )
-        {
-        retVal = KErrNone;
-        }
-    TRACE_FUNC_EXIT
-    return retVal;
-    }
-
-// ---------------------------------------------------------------------------
-// HandleTelephonyUsage()
-// ---------------------------------------------------------------------------
-//
-TInt CHidHeadsetDriver::HandleTelephonyUsage( TReportTranslator& aReport )
-    {
-    TRACE_FUNC_ENTRY
-    TInt retVal = KErrNotSupported;
-    TInt hookSwitch = 0;
-    TInt mute = 0;
-    TInt poc = 0;
-
-    // P&S key variables
-    TUint key = KHidUndefinedKeyCode;
-    TInt value = KHidNotSetKeyValue;
-
-    if ( aReport.GetValue( mute, ETelephonyUsagePhoneMute ) == KErrNone
-            && mute == 1 )
-        {
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Send mute \
-                command"));
-        if ( iInputHandlingReg->AllowedToHandleEvent( EUsagePageTelephony,
-                ETelephonyUsagePhoneMute ) )
-            {
-            key = KHidMuteKeyEvent;
-            value = KPSMuteClicked;
-            iInputHandlingReg->AddHandledEvent( EUsagePageTelephony,
-                    ETelephonyUsagePhoneMute );
-            }
-        }
-    else if ( aReport.GetValue( hookSwitch, ETelephonyUsageHookSwitch )
-            == KErrNone && hookSwitch == 1 )
-        {
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Send hook \
-                switch command (disabled)"));
-        if ( iInputHandlingReg->AllowedToHandleEvent( EUsagePageTelephony,
-                ETelephonyUsageHookSwitch ) )
-            {
-            HookKeyPres( ETrue );
-            iInputHandlingReg->AddHandledEvent( EUsagePageTelephony,
-                    ETelephonyUsageHookSwitch );
-            }
-        }
-    else if ( aReport.GetValue( poc, ETelephonyUsagePoC ) == KErrNone && poc
-            == 1 )
-        {
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Send PoC \
-                command (disabled)"));
-        if ( iInputHandlingReg->AllowedToHandleEvent( EUsagePageTelephony,
-                ETelephonyUsagePoC ) )
-            {
-            key = KHidMuteKeyEvent;
-            value = KPSMuteClicked;
-            iInputHandlingReg->AddHandledEvent( EUsagePageTelephony,
-                    ETelephonyUsagePoC );
-            }
-        }
-    if ( key != KHidUndefinedKeyCode && value != KHidNotSetKeyValue )
-        {
-        TInt err = RProperty::Set( KPSUidHidEventNotifier, key, value );
-        retVal = KErrNone;
-        }
-
-    TRACE_FUNC_EXIT
-    return retVal;
-    }
-
-// ---------------------------------------------------------------------------
-// HandleTelephonyUsage()
-// ---------------------------------------------------------------------------
-//
-TInt CHidHeadsetDriver::HandleControlUsage( TReportTranslator& aReport )
-    {
-    TRACE_FUNC_ENTRY
-    TInt retVal = KErrNotSupported;
-    TInt playPause = 0;
-    TInt scanNext = 0;
-    TInt scanPrev = 0;
-    TInt stop = 0;
-
-    // P&S key variables
-    TUint key = KHidUndefinedKeyCode;
-    TInt value = KHidNotSetKeyValue;
-
-    if ( aReport.GetValue( playPause, EConsumerUsagePlayPause ) == KErrNone
-            && playPause )
-        {
-        if ( iInputHandlingReg->AllowedToHandleEvent( EUsagePageConsumer,
-                EConsumerUsagePlayPause ) )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Send \
-                    play/pause command (currently only play)"));
-            key = KHidControlKeyEvent;
-            value = EPlayClicked;
-            iInputHandlingReg->AddHandledEvent( EUsagePageConsumer,
-                    EConsumerUsagePlayPause );
-            }
-        }
-    else if ( aReport.GetValue( scanNext, EConsumerUsageScanNext )
-            == KErrNone && scanNext )
-        {
-        if ( iInputHandlingReg->AllowedToHandleEvent( EUsagePageConsumer,
-                EConsumerUsageScanNext ) )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Send \
-                    scan next command"));
-            TRAP_IGNORE( HandleScanNextPressL() );
-            iInputHandlingReg->AddHandledEvent( EUsagePageConsumer,
-                    EConsumerUsageScanNext );
-            }
-        }
-    else if ( aReport.GetValue( scanPrev, EConsumerUsageScanPrev )
-            == KErrNone && scanPrev )
-        {
-        if ( iInputHandlingReg->AllowedToHandleEvent( EUsagePageConsumer,
-                EConsumerUsageScanPrev ) )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Scan \
-                    prev command"));
-            TRAP_IGNORE( HandleScanPrevPressL());
-            iInputHandlingReg->AddHandledEvent( EUsagePageConsumer,
-                    EConsumerUsageScanPrev );
-            }
-        }
-    else if ( aReport.GetValue( stop, EConsumerUsageStop ) == KErrNone
-            && stop )
-        {
-        if ( iInputHandlingReg->AllowedToHandleEvent( EUsagePageConsumer,
-                EConsumerUsageStop ) )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Send \
-                    stop command"));
-            key = KHidControlKeyEvent;
-            value = EStopClicked;
-            iInputHandlingReg->AddHandledEvent( EUsagePageConsumer,
-                    EConsumerUsageScanPrev );
-            }
-        }
-    if ( key != KHidUndefinedKeyCode && value != KHidNotSetKeyValue )
-        {
-        TInt err = RProperty::Set( KPSUidHidEventNotifier, key, value );
-        retVal = KErrNone;
-        }
-
-    TRACE_FUNC_EXIT
-    return retVal;
-    }
-
-// ---------------------------------------------------------------------------
-// HandleVolumeUsage()
-// ---------------------------------------------------------------------------
-//
-TInt CHidHeadsetDriver::HandleVolumeUsage( TReportTranslator& aReport )
-    {
-    TRACE_FUNC_ENTRY
-    TInt retVal = KErrNotSupported;
-
-    TInt volUp = 0;
-    TInt volDown = 0;
-    TInt speakermute = 0;
-
-    // P&S key variables
-    TUint key = KHidUndefinedKeyCode;
-    TInt value = KHidNotSetKeyValue;
-
-    if ( aReport.GetValue( volUp, EConsumerUsageVolumeInc ) == KErrNone
-            && volUp )
-        {
-        if ( iInputHandlingReg->AllowedToHandleEvent( EUsagePageConsumer,
-                EConsumerUsageVolumeInc ) )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): \
-                    Send volume up command"));
-            key = KHidAccessoryVolumeEvent;
-            iVolumeUpPressed = ETrue;
-            value = KPSVolumeUpPressed;
-            iInputHandlingReg->AddHandledEvent( EUsagePageConsumer,
-                    EConsumerUsageScanPrev );
-            }
-        }
-    else if ( aReport.GetValue( volDown, EConsumerUsageVolumeDec )
-            == KErrNone && volDown )
-        {
-        if ( iInputHandlingReg->AllowedToHandleEvent( EUsagePageConsumer,
-                EConsumerUsageVolumeDec ) )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Send \
-                    volume down command"));
-            key = KHidAccessoryVolumeEvent;
-            iVolumeDownPressed = ETrue;
-            value = KPSVolumeDownPressed;
-            iInputHandlingReg->AddHandledEvent( EUsagePageConsumer,
-                    EConsumerUsageVolumeDec );
-            }
-        }
-    else if ( ( aReport.GetValue( speakermute, EConsumerUsageMute )
-            == KErrNone && speakermute == 1 ) )
-        {
-        if ( iInputHandlingReg->AllowedToHandleEvent( EUsagePageConsumer,
-                EConsumerUsageMute ) )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Send \
-                    mute command"));
-            key = KHidMuteKeyEvent;
-            value = KPSMuteClicked;
-            iInputHandlingReg->AddHandledEvent( EUsagePageConsumer,
-                    EConsumerUsageMute );
-            }
-        }
-
-    if ( key != KHidUndefinedKeyCode && value != KHidNotSetKeyValue )
-        {
-        TInt err = RProperty::Set( KPSUidHidEventNotifier, key, value );
-        retVal = KErrNone;
-        }
-
-    TRACE_FUNC_EXIT
-    return retVal;
-    }
-
-// ---------------------------------------------------------------------------
-// HandleScanNextPressL()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::HandleScanNextPressL()
-    {
-    TRACE_FUNC_ENTRY
-    iForwardStatus = EScanPressed;
-
-    delete iScanNextTimer;
-    iScanNextTimer = NULL;
-
-    /**
-     * Scan key has two different behaviour if you are short click buttun or long 
-     * click button. In short press next track command is sent and whit long press
-     * is sending seek forward command. iScanNextTimer is used to detect if click
-     * is long click or short click.
-     */
-
-    iScanNextTimer = CKeyPressTimer::NewL( this, TTimeIntervalMicroSeconds32(
-            KScanClickTimeout ), EScanNextPressTimer );
-
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// HandleScanNextPressL()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::HandleScanPrevPressL()
-    {
-    TRACE_FUNC_ENTRY
-    iBackwardStatus = EScanPressed;
-
-    delete iScanPreviousTimer;
-    iScanPreviousTimer = NULL;
-
-    /**
-     * Scan key has two different behaviour if you are short click buttun or 
-     * long click button. In short press previous track command is sent and 
-     * whit long press is sending seek forward command. iScanPreviousTimer 
-     * is used to detect if click is long click or short click.
-     */
-    iScanPreviousTimer = CKeyPressTimer::NewL( this,
-            TTimeIntervalMicroSeconds32( KScanClickTimeout ),
-            EScanPrevPressTimer );
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// ReleasePressedVolumeKeys
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::ReleasePressedVolumeKeys(
-        TReportTranslator& aReportTranslator )
-    {
-    TInt volUp = 0;
-    TInt volDown = 0;
-    TUint key = KHidUndefinedKeyCode;
-    TInt value = KHidNotSetKeyValue;
-
-    if ( iVolumeUpPressed )
-        {
-        if ( aReportTranslator.GetValue( volUp, EConsumerUsageVolumeInc )
-                == KErrNone && volDown == 0 )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::ReleasepressedKeys(): \
-                    Volume up released"));
-            key = KHidAccessoryVolumeEvent;
-            iVolumeUpPressed = EFalse;
-            value = KPSVolumeUpReleased;
-            }
-        }
-    else if ( iVolumeDownPressed )
-        {
-        if ( aReportTranslator.GetValue( volDown, EConsumerUsageVolumeDec )
-                == KErrNone && volDown == 0 )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::ReleasepressedKeys(): \
-                    Volume downkey realeased"));
-            key = KHidAccessoryVolumeEvent;
-            iVolumeDownPressed = EFalse;
-            value = KPSVolumeDownReleased;
-            }
-        }
-    if ( key != KHidUndefinedKeyCode && value != KHidNotSetKeyValue )
-        {
-        TInt err = RProperty::Set( KPSUidHidEventNotifier, key, value );
-
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// ReleasePressedScanKeys()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::ReleasePressedScanKeys(
-        TReportTranslator& aReportTranslator )
-    {
-    TInt scanNext = 0;
-    TInt scanPrev = 0;
-    TUint key = KHidUndefinedKeyCode;
-    TInt value = KHidNotSetKeyValue;
-
-    if ( iForwardStatus != EScanNotPressed )
-        {
-        if ( aReportTranslator.GetValue( scanNext, EConsumerUsageScanNext )
-                == KErrNone && scanNext == 0 )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Scan \
-                    next command released"));
-            HandleScanNextRelease( key, value );
-            }
-        }
-    else if ( iBackwardStatus != EScanNotPressed )
-        {
-        if ( aReportTranslator.GetValue( scanPrev, EConsumerUsageScanPrev )
-                == KErrNone && scanPrev == 0 )
-            {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Scan \
-                    prev command released"));
-            HandleScanPreviousRelease( key, value );
-            }
-        }
-    if ( key != KHidUndefinedKeyCode && value != KHidNotSetKeyValue )
-        {
-        TInt err = RProperty::Set( KPSUidHidEventNotifier, key, value );
-        }
-    }
-// ---------------------------------------------------------------------------
-// ReleasePressedKeys()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::ReleasePressedKeys(
-        TReportTranslator& aReportTranslator )
-    {
-    TRACE_FUNC_ENTRY
-
-    TInt hookSwitch = 0;
-    /*
-     * Check hook key release here, because hook key long press
-     * is handled different way.
-     */
-    if ( iOnHookPressed || iOffHookPressed || iNoneHookPressed )
-        {
-        if ( aReportTranslator.GetValue( hookSwitch,
-                ETelephonyUsageHookSwitch ) == KErrNone && hookSwitch == 0 )
-            {
-            ReleaseHookKey();
-            }
-        }
-    ReleasePressedVolumeKeys( aReportTranslator );
-
-    ReleasePressedScanKeys( aReportTranslator );
-
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// HandleScanNextRelease()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::HandleScanNextRelease( TUint& aKeyCode, TInt& aValue )
-    {
-    TRACE_FUNC_ENTRY
-    aKeyCode = KHidControlKeyEvent;
-    if ( iForwardStatus == EScanPressed )
-        {
-        aValue = EForwardClicked;
-        }
-    else //long press
-        {
-        aValue = EFastForwardReleased;
-        }
-    iForwardStatus = EScanNotPressed;
-
-    delete iScanNextTimer;
-    iScanNextTimer = NULL;
-
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// HandleScanPreviousRelease()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::HandleScanPreviousRelease( TUint& aKeyCode,
-        TInt& aValue )
-    {
-    TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::HandleReport(): Scan prev \
-            command released"));
-    aKeyCode = KHidControlKeyEvent;
-    if ( iBackwardStatus == EScanPressed )
-        {
-        aValue = EBackwardClicked;
-        }
-    else //long press
-        {
-        aValue = ERewindReleased;
-        }
-    iBackwardStatus = EScanNotPressed;
-
-    delete iScanPreviousTimer;
-    iScanPreviousTimer = NULL;
-
-    TRACE_FUNC_EXIT
-    }
-// ---------------------------------------------------------------------------
-// HookKeyPres()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::HookKeyPres( TBool aStatus )
-    {
-    TRACE_FUNC_ENTRY
-
-    THookHandling hookStatus = HookStatus();
-    if ( !iAlarmStatus )
-        {
-        iAlarmStatus = AlarmStatus();
-        }
-
-    iPlayingStatus = MusicPlayingStatus();
-
-    if ( aStatus )
-        {
-        switch ( hookStatus )
-            {
-            case EOnHook:
-                if ( !iIncomingCallStatus )
-                    {
-                    // For the first click, trigger the timer 
-                    // single click is handled in ExpiredDoubleClickTimer
-                    if ( iDoubleClicktimer )
-                        {
-                        delete iDoubleClicktimer;
-                        iDoubleClicktimer = NULL;
-                        }
-                    TRAP_IGNORE( iDoubleClicktimer = CKeyPressTimer::NewL( this,
-                        TTimeIntervalMicroSeconds32( KDoubleClickTimeoutRing ),
-                        EDoubleClickTimer ) );
-                    if ( iDoubleClicktimer )
-                        {
-                        iIncomingCallStatus = ETrue;
-                        }
-                    else // If fail to create timer, handle as single click, 
-                    // for double click case, the next click will hang off
-                        {
-                        iIncomingCallStatus = EFalse;
-                        iOnHookPressed = ETrue;
-                        }
-                    break; // switch
-                    }
-                else
-                    {
-                    iIncomingCallStatus = EFalse;
-                    if ( iDoubleClicktimer )
-                        {
-                        delete iDoubleClicktimer;
-                        iDoubleClicktimer = NULL;
-                        }
-                    // This is the double click case, handle as EOffHook
-                    }
-                // No break here
-            case EOffHook:
-                TRACE_INFO(_L("[HID]\tCHidHeadsetDriver Hook Off Pressed"));
-                iOffHookPressed = ETrue;
-                break;
-            case ENoHook:
-                TRACE_INFO(_L("[HID]\tCHidHeadsetDriver Hook None Pressed")); 
-                TRAP_IGNORE( HandleNoneHookPressL() );                
-                break;
-            default:
-                TRACE_INFO(_L("CHidHeadsetDriver::HookKeyPres : Not \
-                        supported"));                
-            }
-        }
-    else
-        {
-        ReleaseHookKey();
-        }
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// ReleaseHookKey()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::ReleaseHookKey()
-    {
-    TRACE_FUNC_ENTRY
-
-    if ( iOnHookPressed )
-        {
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver Hook On released"));
-        iOnHookPressed = EFalse;
-        // Incoming call
-        RProperty::Set( KPSUidHidEventNotifier, KHidHookKeyEvent,
-                KPSAnsweClicked );
-        }
-    if ( iOffHookPressed )
-        {
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver Hook Off released"));
-        iOffHookPressed = EFalse;
-        // Disconnect connected call
-        RProperty::Set( KPSUidHidEventNotifier, KHidHookKeyEvent,
-                KPSHangUpClicked );
-        }
-    if ( iNoneHookPressed && !iAlarmStatus )
-        {
-        TRAP_IGNORE( HandleIdleHookReleaseL() );
-        }
-    if ( iNoneHookPressed && iAlarmStatus )
-        {
-        TRAP_IGNORE( HandleAlarmHookReleaseL() );
-        }
-    if ( iLongClicktimer )
-        {
-        iLongPress = EFalse;
-        }
-    delete iLongClicktimer;
-    iLongClicktimer = NULL;
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// HandleNoneHook()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::HandleNoneHookPressL()
-    {
-    TRACE_FUNC_ENTRY
-    /**  Start long press timer is alarm is ongoing, or phone
-     *   is not alarming and thre are no hook key press whitout
-     *   release
-     */
-    if ( iAlarmStatus || ( !iNoneHookPressed && !iAlarmStatus ) )
-        {
-        iNoneHookPressed = ETrue;
-        iLongPress = EFalse;
-
-        delete iLongClicktimer;
-        iLongClicktimer = NULL;
-
-        iLongClicktimer = CKeyPressTimer::NewL( this,
-                TTimeIntervalMicroSeconds32( KLongClickTimeout ),
-                ELongPressTimer );
-        }
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// HandleAlarmHookReleaseL()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::HandleAlarmHookReleaseL()
-    {
-    TRACE_FUNC_ENTRY
-    TRACE_INFO(_L("[HID]\tCHidHeadsetDriver Hook None released"));
-    /**
-     * Hook key is released when there is active alarm. Start double
-     * click timer for monitoring double click.
-     */
-    if ( !iDoubleClicktimer && !iLongPress )
-        {
-        iDoubleClicktimer = CKeyPressTimer::NewL( this,
-                TTimeIntervalMicroSeconds32( KDoubleClickTimeout ),
-                EDoubleClickTimer );
-        }
-    /**
-     * Stot alar when hook key is pressed long time during alarm.
-     */
-    else if ( iLongPress )
-        {
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver Stop alarm"));
-        RProperty::Set( KPSUidAlarmExtCntl, KAlarmStopKey, 
-                EAlarmUIStopAlarm );
-        iAlarmStatus = EFalse;
-        iLongPress = EFalse;
-        }
-    /**
-     * Double click timer exsist and is it not long press, so 
-     * this is double click release. Then snooze alarm.
-     */
-    else if ( !iLongPress )
-        {
-        delete iDoubleClicktimer;
-        iDoubleClicktimer = NULL;
-        iAlarmStatus = EFalse;
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver Snooze"));
-        RProperty::Set( KPSUidAlarmExtCntl, KAlarmSnoozeKey,
-                EAlarmUISnoozeAlarm );
-        }
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// HandleIdleHookReleaseL
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::HandleIdleHookReleaseL()
-    {
-    TRACE_FUNC_ENTRY
-    TRACE_INFO(_L("[HID]\tCHidHeadsetDriver Hook None released"));
-    iNoneHookPressed = EFalse;
-    /**
-     * Hook key is released when there is music playing ongoing. Start double
-     * click timer for monitoring double click.
-     */
-    if ( !iDoubleClicktimer && !iLongPress )
-        {
-        iDoubleClicktimer = CKeyPressTimer::NewL( this,
-                TTimeIntervalMicroSeconds32( KDoubleClickTimeout ),
-                EDoubleClickTimer );
-        }
-    /**
-     * Hook key is released when there is not music playing ongoing. 
-     * Because double click timer is active this is second release in
-     * short beriod and redial needs to be issued.
-     */
-    else if ( !iLongPress && !iPlayingStatus )
-        {
-        delete iDoubleClicktimer;
-        iDoubleClicktimer = NULL;
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver Redial"));
-        RProperty::Set( KPSUidHidEventNotifier, KHidHookKeyEvent, 
-                KPSRedial );
-        }
-    /**
-     * Hook key is released when there is music playing ongoing. 
-     * Because double click timer is active, is send forward command sent
-     * and DoubleNextClick set to true for sending next command.
-     */
-    else if ( iPlayingStatus && !iLongPress )
-        {
-        delete iDoubleClicktimer;
-        iDoubleClicktimer = NULL;
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver next after next"));
-        if ( !iLongPress )
-            {
-            iDoubleNextClick = ETrue; //set to true and when player change 
-                                      //track press next again 
-            }
-        RProperty::Set( KPSUidHidEventNotifier, KHidControlKeyEvent,
-                EForwardClicked ); //next after next
-        }
-    /**
-     * Long press release when there are no actie calls, alarms, and music
-     * playing is stopped, activates voice dialing.
-     */
-    else if ( iLongPress )
-        {
-        delete iDoubleClicktimer;
-        iDoubleClicktimer = NULL;
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver VoiceDial"));
-        RProperty::Set( KPSUidHidEventNotifier, KHidHookKeyEvent,
-                KPSVoiceDial );
-        iLongPress = EFalse;
-        }
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// GetHookStatus()
-// ---------------------------------------------------------------------------
-//
-CHidHeadsetDriver::THookHandling CHidHeadsetDriver::HookStatus()
-    {
-    TRACE_FUNC_ENTRY
-    THookHandling retVal = EOffHook;
-    TInt ret = KErrNone;
-    CTelephony::TCallStatusV1 callStatusV1;
-    CTelephony::TCallStatusV1Pckg callStatusV1Pckg( callStatusV1 );
-    ret = iTelephony->GetLineStatus( CTelephony::EVoiceLine,
-                    callStatusV1Pckg );
-    if ( ret != KErrNone )
-        {
-        retVal = ENoHook;
-        }
-    CTelephony::TCallStatus voiceLineStatus = callStatusV1.iStatus;
-    TRACE_INFO((_L("[HID]\tCHidHeadsetDriver GetHookStatus voiceline \
-            status %d"), voiceLineStatus));
-
-    if ( voiceLineStatus == CTelephony::EStatusHold || voiceLineStatus
-            == CTelephony::EStatusRinging )
-        {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver GetHookStatus on hook"));
-        retVal = EOnHook;
-        }
-    else if ( voiceLineStatus == CTelephony::EStatusUnknown
-            || voiceLineStatus == CTelephony::EStatusIdle )
-        {
-            TRACE_INFO(_L("[HID]\tCHidHeadsetDriver GetHookStatus no hook"));
-        retVal = ENoHook;
-        }
-        TRACE_FUNC_EXIT
-    return retVal;
-    }
-
-// ---------------------------------------------------------------------------
-// From class CHidDriver
-// CanHandleReportL()
-// ---------------------------------------------------------------------------
-//
-TInt CHidHeadsetDriver::CanHandleReportL( CReportRoot* aReportRoot )
-    {
-    TRACE_INFO((_L("[HID]\tCHidHeadsetDriver::CanHandleReport(0x%08x)"),
-                        aReportRoot));
-
-    THidFieldSearch search;
-
-    THeadsetFinder headsetFinder;
-    search.SearchL( aReportRoot, &headsetFinder );
-
-    iSupportedFieldCount = headsetFinder.FieldCount();
-    for ( TInt i = 0; i < headsetFinder.FieldCount(); i++ )
-        {
-        User::LeaveIfError( iFieldList.Append( headsetFinder.GetFieldAtIndex(
-                i ) ) );
-        TRACE_INFO((_L("[HID]\tCHidHeadsetDriver::CanHandleReportL, field \
-                pointer: 0x%08x"), iFieldList[i]));
-        }
-
-    TInt valid = KErrHidUnrecognised;
-
-    if ( headsetFinder.Found() )
-        {
-        valid = KErrNone;
-        }
-    // empty finder's field list before going out of scope.
-    headsetFinder.EmptyList();
-
-    TRACE_INFO((_L("[HID]\tCHidHeadsetDriver::CanHandleReport() returning \
-            %d"), valid));
-    return valid;
-    }
-
-// ---------------------------------------------------------------------------
-// From class CHidDriver
-// SupportedFieldCount
-// ---------------------------------------------------------------------------
-//
-TInt CHidHeadsetDriver::SupportedFieldCount()
-    {
-    return iSupportedFieldCount;
-    }
-// ---------------------------------------------------------------------------
-// From class MTimerNotifier
-// TimerExpired()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::TimerExpired( TTimerType aTimerType )
-    {
-    TRACE_FUNC_ENTRY
-    switch ( aTimerType )
-        {
-        case EDoubleClickTimer:
-            ExpiredDoubleClickTimer();
-            break;
-        case ELongPressTimer:
-            ExpiredLongClickTimer();
-            break;
-        case EScanNextPressTimer:
-            iForwardStatus = EScanLongPress;
-            RProperty::Set( KPSUidHidEventNotifier, KHidControlKeyEvent,
-                    EFastForwardPressed );
-            break;
-        case EScanPrevPressTimer:
-            iBackwardStatus = EScanLongPress;
-            RProperty::Set( KPSUidHidEventNotifier, KHidControlKeyEvent,
-                    ERewindPressed );
-            break;
-        default:
-            TRACE_INFO(_L("CHidHeadsetDriver::TimerExpired : Not supported"))
-            ;
-        }
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// ExpiredDoubleClickTimer()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::ExpiredDoubleClickTimer()
-    {
-    TRACE_FUNC_ENTRY
-    if ( iDoubleClicktimer )
-        {
-        delete iDoubleClicktimer;
-        iDoubleClicktimer = NULL;
-        
-        if ( iIncomingCallStatus )
-            {
-            iIncomingCallStatus = EFalse;
-            iOnHookPressed = ETrue;
-            ReleaseHookKey();
-            }
-        if ( iAlarmStatus )
-            {
-            RProperty::Set( KPSUidAlarmExtCntl, KAlarmStopKey,
-                    EAlarmUIStopAlarm );
-            iAlarmStatus = EFalse;
-            }
-        if ( iPlayingStatus )
-            {
-            RProperty::Set( KPSUidHidEventNotifier, KHidControlKeyEvent,
-                    EForwardClicked );
-            iPlayingStatus = EFalse;
-            }
-        }
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// ExpiredLongClickTimer()
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::ExpiredLongClickTimer()
-    {
-    TRACE_FUNC_ENTRY
-    if ( iLongClicktimer )
-        {
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::TimerExpired long click"));
-        delete iLongClicktimer;
-        iLongClicktimer = NULL;
-        iLongPress = ETrue;
-        ReleaseHookKey();
-        }
-    TRACE_FUNC_EXIT
-    }
-
-// ---------------------------------------------------------------------------
-// AlarmStatus()
-// ---------------------------------------------------------------------------
-//
-TBool CHidHeadsetDriver::AlarmStatus()
-    {
-    TRACE_FUNC_ENTRY
-    TInt activealarmcount = 0;
-    TBool retVal = EFalse;
-    activealarmcount = iAlarmServerSession.AlarmCountByState(
-            EAlarmStateNotifying );
-    if ( activealarmcount > 0 )
-        {
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::AlarmStatus active alarms"));
-        retVal = ETrue;
-        }
-    else
-        {
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::AlarmStatus no active \
-                alarms"));
-        retVal = EFalse;
-        }
-    TRACE_FUNC_EXIT
-    return retVal;
-    }
-
-// ---------------------------------------------------------------------------
-// AlarmStatus()
-// ---------------------------------------------------------------------------
-//
-TBool CHidHeadsetDriver::MusicPlayingStatus()
-    {
-    TRACE_FUNC_ENTRY
-    TBool retVal = EFalse;
-    TMPXPlaybackState state = EPbStateNotInitialised;
-    TRAPD( err, state = iMusicPlayer->StateL() );
-    if ( state == EPbStatePlaying && err == KErrNone )
-        {
-        TRACE_INFO(_L("[HID]\tCHidHeadsetDriver::MusicPlayingStatus play \
-                active"));
-        retVal = ETrue;
-        }
-    TRACE_FUNC_EXIT
-    return retVal;
-    }
-
-// ---------------------------------------------------------------------------
-// HandlePlaybackMessage
-// ---------------------------------------------------------------------------
-//
-void CHidHeadsetDriver::HandlePlaybackMessage( CMPXMessage* aMsg, TInt /*aErr*/)
-    {
-    TRACE_FUNC_ENTRY
-
-    TMPXMessageId id( aMsg->ValueTObjectL<TMPXMessageId> (
-            KMPXMessageGeneralId ) );
-    // send nect track whit double hook click when track is changed
-    if ( id == KMPXMessagePbMediaChanged && iDoubleNextClick )
-        {
-        TRACE_INFO(_L("[HID]\tHandlePlaybackMessage: PbMediaChangeg"));
-        RProperty::Set( KPSUidHidEventNotifier, KHidControlKeyEvent,
-                EForwardClicked );
-        iDoubleNextClick = EFalse;
-        }
-    TRACE_FUNC_EXIT
-    }
-