diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/tsrc/bc/bctestutil/src/bctestkeyfeeder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/tsrc/bc/bctestutil/src/bctestkeyfeeder.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,449 @@ +/* +* Copyright (c) 2006-2007 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: Emulate key and pointer event. +* +*/ + + +#include + +#include "AutotestCommands.h" // test commands are defined in here +#include "bctestkeyfeeder.h" +#include "bctestlogger.h" +#include "bctestsuite.h" + +const TInt KInitDelay = 1000000; // 1 second +const TInt KInterval = 100000; // 1/10 second +const TInt KTickCount = 10; // default one second between key feeds +const TText KKey1 = '1'; +const TText KKey2 = '2'; +const TText KKey3 = '3'; +const TText KKey4 = '4'; +const TText KKey5 = '5'; +const TText KKey6 = '6'; +const TText KKey7 = '7'; +const TText KKey8 = '8'; +const TText KKey9 = '9'; +const TText KKey0 = '0'; +const TText KKeyAsterisk = '*'; +const TText KKeyHash = '#'; + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// C++ default constructor +// --------------------------------------------------------------------------- +// +CBCTestKeyFeeder::CBCTestKeyFeeder() + { + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CBCTestKeyFeeder::~CBCTestKeyFeeder() + { + if ( iPeriodic ) + { + iPeriodic->Cancel(); + delete iPeriodic; + } + } + +// --------------------------------------------------------------------------- +// CBCTestKeyFeeder::StartAutoTestL +// Initialize member variables and start timer. +// --------------------------------------------------------------------------- +// +void CBCTestKeyFeeder::StartAutoTestL( SAutoTest* aAutoTest ) + { + if ( aAutoTest ) + { + iAutoTest = aAutoTest; + iScriptCommands = iAutoTest->scripts[0]; + } + if ( !iAutoTest || !iScriptCommands ) + { + return; + } + + iSuite->HandleTestEventL( ETestCaseStart, iScriptIndex ); + + if ( iPeriodic ) + { + iPeriodic->Cancel(); + delete iPeriodic; + iPeriodic = NULL; + } + iPeriodic=CPeriodic::NewL( CActive::EPriorityHigh ); + // Start periodic function after 1 seconds and after that call + // it every 1/10th of second + iPeriodic->Start( KInitDelay, KInterval, TCallBack( + PeriodicKeyFeederL, this ) ); + + // member variables don't need to be cleared before use, + // but do it anyway - just in case + iIndex = 0; + iScriptIndex = 0; + iCommand = 0; + iRepeatCommand = 0; + iRepeat = 0; + iWaitCount = 0; + + iTickCount = KTickCount; + iTickCounter = iTickCount; + + iKeyUp = EFalse; + iKeyDown = EFalse; + + // ensure sane values for conditional stuff + iIfCount = 0; + + if ( !iEikEnv ) + { + iEikEnv = CEikonEnv::Static(); + } + } + +// --------------------------------------------------------------------------- +// CBCTestKeyFeeder::PeriodicKeyFeeder +// This method is called every 0.1 seconds, calls HandleAutoCommand +// --------------------------------------------------------------------------- +// +TInt CBCTestKeyFeeder::PeriodicKeyFeederL( TAny* aThis ) + { + CBCTestKeyFeeder* feeder = + static_cast( aThis ); + + feeder->HandleAutoCommandL(); + return 0; + } + +// --------------------------------------------------------------------------- +// CBCTestKeyFeeder::HandleAutoCommand +// Does the actual key feeding +// --------------------------------------------------------------------------- +// +void CBCTestKeyFeeder::HandleAutoCommandL() + { + if ( iTimerPaused ) // timer paused, do nothing + { + return; + } + if ( iTickCounter > 0 ) + { + iTickCounter--; + return; // tick count not yet full, do nothing + } + iTickCounter=iTickCount; // reset tick counter and continue + + //commands in one script done + if ( iIndex >= iAutoTest->countArray[iScriptIndex] ) + { + iSuite->HandleTestEventL( ETestCaseEnd, iScriptIndex ); + iScriptIndex++; + TBool continueRun = ETrue; + if ( iScriptIndex >= iAutoTest->scriptCount ) // all scripts done + { + continueRun = EFalse; + } + else + { + iScriptCommands = iAutoTest->scripts[iScriptIndex]; + iIndex = 0; + if ( !iScriptCommands ) + { + iSuite->HandleTestEventL( ETestCaseNoScript, iScriptIndex ); + iIndex = iAutoTest->countArray[iScriptIndex]; + } + else + { + iSuite->HandleTestEventL( ETestCaseStart, iScriptIndex ); + } + } + + if ( iIfCount != 0 ) + { + iSuite->HandleTestEventL( + ETestCaseUnbalancedIf, iScriptIndex - 1 ); + iIfCount = 0; + } + + if ( !continueRun ) + { + iPeriodic->Cancel(); // stop periodic timer + } + + return; + } + + if ( iWaitCount > 0 ) // still waiting (WAIT command) + { + iWaitCount--; + return; // waiting - do nothing + } + + if ( iRepeat == 0 ) // not repeating, parse next command + { + iCommand = iScriptCommands[iIndex]; + iIndex++; + } + else // still doing REPEAT + { + iCommand = iRepeatCommand; // command being repeated + iRepeat--; + } + + switch ( iCommand ) + { + case LeftCBA: + KeyPress( EKeyDevice0, EStdKeyDevice0 ); + break; + case RightCBA: + KeyPress( EKeyDevice1, EStdKeyDevice1 ); + break; + case KeyOK: + KeyPress( EKeyDevice3, EStdKeyDevice3 ); + break; + case Up: + KeyPress( EKeyUpArrow, EStdKeyUpArrow ); + break; + case Down: + KeyPress( EKeyDownArrow, EStdKeyDownArrow ); + break; + case Left: + KeyPress( EKeyLeftArrow, EStdKeyLeftArrow ); + break; + case Right: + KeyPress( EKeyRightArrow, EStdKeyRightArrow ); + break; + case Key1: + KeyPress( KKey1, KKey1 ); + break; + case Key2: + KeyPress( KKey2, KKey2 ); + break; + case Key3: + KeyPress( KKey3, KKey3 ); + break; + case Key4: + KeyPress( KKey4, KKey4 ); + break; + case Key5: + KeyPress( KKey5, KKey5 ); + break; + case Key6: + KeyPress( KKey6, KKey6 ); + break; + case Key7: + KeyPress( KKey7, KKey7 ); + break; + case Key8: + KeyPress( KKey8, KKey8 ); + break; + case Key9: + KeyPress( KKey9, KKey9 ); + break; + case Key0: + KeyPress( KKey0, KKey0 ); + break; + case KeyAsterisk: + KeyPress( KKeyAsterisk, EStdKeyNkpAsterisk ); + break; + case KeyHash: + KeyPress( KKeyHash, EStdKeyHash ); + break; + case KeyApplication: + KeyPress( EKeyApplication, EStdKeyApplication0 ); + break; + case KeyPhoneSend: + KeyPress( EKeyPhoneSend, EStdKeyYes ); + break; + case KeyPhoneEnd: + KeyPress( EKeyPhoneEnd, EStdKeyNo ); + break; + case KeyPower: + KeyPress( EKeyPowerOff, EStdKeyDevice2 ); + break; + case KeyVoice: + KeyPress( EKeySide, EStdKeyDevice6 ); + break; + case KeyBackspace: + KeyPress( EKeyBackspace, EStdKeyBackspace ); + break; + case KeyABC: // may not work as ABC key, should work as shift, tough + KeyPress( EStdKeyRightShift, EStdKeyRightShift ); + break; + case GripOpen: + KeyPress( EKeyGripOpen, EStdKeyDevice4 ); + break; + case GripClose: + KeyPress( EKeyGripClose, EStdKeyDevice5 ); + break; + case REPEAT: // one round missed because no commands executed + iRepeatCommand = iScriptCommands[iIndex++]; + iRepeat = iScriptCommands[iIndex++]; + break; + case WAITCOMMAND: + iWaitCount = iScriptCommands[iIndex++]; + break; + case SETTICKCOUNT: + iTickCount = iScriptCommands[iIndex++]; + iTickCounter = iTickCount; + break; + case JUSTKEYDOWN: + iKeyDown = ETrue; + break; + case JUSTKEYUP: + iKeyUp = ETrue; + break; + case PointerDown: + { + TInt pointerX = iScriptCommands[iIndex++]; + TInt pointerY = iScriptCommands[iIndex++]; + TRawEvent event; + event.Set( TRawEvent::EButton1Down, pointerX, pointerY ); + PointerEvent( event ); + } + break; + case PointerUp: + { + TInt pointerX = iScriptCommands[iIndex++]; + TInt pointerY = iScriptCommands[iIndex++]; + TRawEvent event; + event.Set( TRawEvent::EButton1Up, pointerX, pointerY ); + PointerEvent( event ); + } + break; + case PointerMove: + { + TInt pointerX = iScriptCommands[iIndex++]; + TInt pointerY = iScriptCommands[iIndex++]; + TRawEvent event; + event.Set( TRawEvent::EPointerMove, pointerX, pointerY ); + PointerEvent( event ); + break; + } + default: + break; + } + } + +/******************* autotest key feeder implementations ********************/ + +// --------------------------------------------------------------------------- +// CBCTestKeyFeeder::KeyDown +// --------------------------------------------------------------------------- +// +void CBCTestKeyFeeder::KeyDown( TInt aScanCode ) + { + if ( aScanCode == EStdKeyRightShift ) + { + iOldModifiers = iEikEnv->WsSession().GetModifierState(); + iModifiers = EModifierShift | iOldModifiers; + } + + TRawEvent event; + event.Set( TRawEvent::EKeyDown, aScanCode ); + iEikEnv->WsSession().SimulateRawEvent( event ); + } + +// --------------------------------------------------------------------------- +// CBCTestKeyFeeder::KeyUp +// --------------------------------------------------------------------------- +// +void CBCTestKeyFeeder::KeyUp( TInt aScanCode ) + { + if ( aScanCode == EStdKeyRightShift ) + { + iModifiers = iOldModifiers; + } + + TRawEvent event; + event.Set( TRawEvent::EKeyUp, aScanCode ); + iEikEnv->WsSession().SimulateRawEvent( event ); + } + +// --------------------------------------------------------------------------- +// CBCTestKeyFeeder::KeyPress +// --------------------------------------------------------------------------- +// +void CBCTestKeyFeeder::KeyPress( TInt aCode, TInt aScanCode ) + { + User::ResetInactivityTime();// Reset user inactivity timers + + if ( iKeyDown ) // Long key press -> do just key down + { + KeyDown( aScanCode ); + iKeyDown = EFalse; + return; // ends key press + } + + if ( iKeyUp ) // Ends long key press -> do just key up + { + KeyUp( aScanCode ); + iKeyUp = EFalse; + return; // ends key press + } + + // there seems to be no keycode for abc-key, simulate by pressing + // key down and up + if ( aCode == EStdKeyRightShift ) + { + KeyDown( aCode ); + KeyUp( aCode ); + return; + } + + // Do normal key press + TKeyEvent event = { aCode, aScanCode, iModifiers, 0 }; + iEikEnv->WsSession().SimulateKeyEvent( event ); + } + +// --------------------------------------------------------------------------- +// CBCTestKeyFeeder::PauseTimer +// --------------------------------------------------------------------------- +// +void CBCTestKeyFeeder::PauseTimer() + { + iTimerPaused = ETrue; + } + +// --------------------------------------------------------------------------- +// CBCTestKeyFeeder::ResumeTimer +// --------------------------------------------------------------------------- +// +void CBCTestKeyFeeder::ResumeTimer() + { + iTimerPaused = EFalse; + } + +// --------------------------------------------------------------------------- +// CBCTestKeyFeeder::PointerEvent +// --------------------------------------------------------------------------- +// +void CBCTestKeyFeeder::PointerEvent( TRawEvent& aEvent ) + { + iEikEnv->WsSession().SimulateRawEvent( aEvent ); + } + +// --------------------------------------------------------------------------- +// CBCTestKeyFeeder::SetSuite +// --------------------------------------------------------------------------- +// +void CBCTestKeyFeeder::SetSuite( CBCTestSuite* aSuite ) + { + iSuite = aSuite; + }