uifw/AvKon/tsrc/bc/bctestutil/src/bctestkeyfeeder.cpp
changeset 0 2f259fa3e83a
--- /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 <eikon.hrh>
+
+#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<CBCTestKeyFeeder*>( 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;
+    }