--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/testexecfw/useremul/src/UserEmulatorAppUi.cpp Mon Mar 08 15:03:44 2010 +0800
@@ -0,0 +1,2110 @@
+/*------------------------------------------------------------------
+ -
+ * Software Name : UserEmulator
+ * Version : v4.2.1309
+ *
+ * Copyright (c) 2009 France Telecom. All rights reserved.
+ * This software is distributed under the License
+ * "Eclipse Public License - v 1.0" the text of which is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * France Telecom
+ *
+ * Contributors:
+ *------------------------------------------------------------------
+ -
+ * File Name: UserEmulatorAppUi.cpp
+ *
+ * Created: 13/08/2009
+ * Author(s): Marcell Kiss, Reshma Sandeep Das
+ *
+ * Description:
+ * Application User Interface class
+ *------------------------------------------------------------------
+ -
+ *
+ */
+
+// System Includes
+#include <avkon.hrh>
+#include <aknmessagequerydialog.h>
+#include <aknnotewrappers.h>
+#include <stringloader.h>
+#include <f32file.h>
+#include <s32file.h>
+#include <hlplch.h>
+#include <e32property.h>
+#include <APGCLI.H>
+#include <aknlists.h>
+#include <utf.h>
+#include <hal.h>
+#include <APGWGNAM.H>
+#include <eiklbv.h>
+#include <aknglobalnote.h>
+#include <BACLINE.H>
+// User Includes
+#include <UserEmulator_0x2001C3AF.rsg>
+#include "UserEmulator_0x2001C3AF.hlp.hrh"
+#include "UserEmulator.hrh"
+#include "UserEmulatorApplication.h"
+#include "UserEmulatorAppUi.h"
+#include "Utils.h"
+#include "SettingsDialog.h"
+#include "clientdll.h"
+#include "clientcommander.h"
+
+// Local constants
+_LIT(KAPPLAUNCH, "app, ");
+_LIT(KVIEWSWITCH, "view, ");
+_LIT(KKEYPRESS, "keypress, ");
+_LIT(KORIENTATION,"orientation, ");
+_LIT(KSCREENRESET,"screenreset, ");
+_LIT(KPOINTEREVENT, "pointerevent, ");
+_LIT(KWAIT, "wait, ");
+_LIT(KCLOSEAPP, "closeapp, ");
+_LIT(KRUNERROR, "A script or test is already running!");
+
+_LIT(KButtonDown,"pointerdownAt");
+_LIT(KButtonUp,"pointerupAt");
+_LIT(KPointerMove,"moveTo");
+
+// Orange World menu
+#define HS_VIEW_OSS_BROWSER_APPUID 0x10008d39
+// Uid of the Aactive Idle framework (3.1 devices)
+const TUid KUidStandBy1 = { 0x101fd64c };
+// Uid of the Aactive Idle framework (3.2 devices)
+const TUid KUidStandBy = { 0x102750f0 };
+// Uid of the Active Idle framework (5.0 devices)
+const TUid KUidStandby50 = {0x20017CD9};
+
+const TInt KArrayGranularity = 10;
+
+_LIT(KAppNotFound, "ERROR: Application Not found ");
+_LIT(KStartTest,"*** Start Test ***" );
+_LIT(KEndScript, "*** End of Script: " );
+_LIT(KViewSwitchingError, "ERROR: View not found");
+_LIT(KStopScript,"*** Cancelled script: ");
+
+_LIT(KStringLit,"%S\n");
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::ConstructL()
+ {
+ iIsFolderScanCompletedCalled = EFalse;
+
+ // Initialise app UI with standard value.
+ BaseConstructL(CAknAppUi::EAknEnableSkin | EAknEnableMSK );
+
+ iCommandLineScriptsArray = new (ELeave) CDesC8ArrayFlat(KArrayGranularity);
+
+ iSettings = new(ELeave) CSettings(*Application(), iEikonEnv);
+ iSettings->ConstructL();
+
+ iScriptsView = CUserEmulatorScriptsView::NewL(ClientRect(),iSettings, iEikonEnv);
+ AddToStackL(iScriptsView);
+
+ iLogger = new(ELeave) CLogger(*iScriptsView,*iSettings, iEikonEnv);
+ iLogger->ConstructL();
+
+ // Create an instance of XML handler.
+ iXmlHandler = CXmlHandler::NewL( *this ,iActionList);
+
+ iDelayTimer = CDelayTimer::NewL(*this);
+ User::LeaveIfError(iSession.Connect());
+
+ // Initialise Window server dll's client side
+ SetupClientDllL();
+ SetupCommander();
+
+ HAL::Get(HAL::EManufacturer, iManufacturer);
+
+ iScriptRun = EFalse;
+ iRecording = EFalse;
+ iRandomTestStarted = EFalse;
+
+ iGlobalCapturer = CGlobalCapturer::NewL(*this, *iSettings, iScriptRun, iRandomTestStarted,
+ iClientCommander, iEikonEnv,iSession);
+ iGlobalCapturer->StartCapturingL();
+
+ iThreadNotifier = CThreadNotifier::NewL(*this, *iLogger,*iSettings,iEikonEnv);
+ iThreadNotifier->IssueRequest();
+
+ iRandomTest = NULL;
+}
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::CUserEmulatorAppUi()
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CUserEmulatorAppUi::CUserEmulatorAppUi(RWsSession& aSession): CAknAppUi(),iClientDll( aSession ),
+ iClientCommander( iClientDll ),
+ iActionIndex(0),iLoopExists(EFalse),
+ iStopScripts(EFalse),iSelectedIndex(0),iError(EFalse),
+ iLoopCounter(0),iSelectedScriptCount(0),
+ iPointerCount(0)
+
+{// No implementation required
+}
+
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::~CUserEmulatorAppUi()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CUserEmulatorAppUi::~CUserEmulatorAppUi()
+{
+ iClientCommander.Close ();
+ iClientDll.Close();
+
+ delete iXmlHandler;
+ delete iDelayTimer;
+ iSession.Close();
+ delete iSettings;
+
+ if(iRandomTest)
+ {
+ delete iRandomTest;
+ iRandomTest = NULL;
+ }
+
+ iActionList.ResetAndDestroy();
+ iActionList.Close();
+
+ iNestedLoopArray.Close();
+ if(iCommandLineScriptsArray)
+ {
+ iCommandLineScriptsArray->Reset();
+ delete iCommandLineScriptsArray;
+ }
+ iScriptErrorIndexes.Close();
+
+ delete iThreadNotifier;
+ delete iGlobalCapturer;
+ delete iLogger;
+
+ if(iScriptsView)
+ {
+ RemoveFromStack(iScriptsView);
+ delete iScriptsView;
+ }
+}
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::TerminationKeyReceived()
+// Stop script run after Power button press
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::TerminationKeyReceived()
+ {
+ iScriptRun = EFalse;
+ if(iActionList.Count() > 0)
+ iStopScripts = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::BringUserEmulatorToFront()
+// Stops recording and brings this application to foreground
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::BringUserEmulatorToFront()
+ {
+ iRecording = EFalse;
+ BringToForeground();
+ }
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::ShowScriptsL()
+// Calls SCript View's ShowScriptsL function
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::ShowScriptsL()
+{
+ iScriptsView->ShowScriptsL();
+
+ //UnMark all the scripts
+ iScriptsView->UnMarkL(EAknUnmarkAll);
+}
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::SetupClientDllL()
+// Loads Window server dll's server side
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::SetupClientDllL()
+ {
+ // Create the server dll filename
+ TFileName serverDllFilename( KServerDllFilename );
+
+ // Load the animation server, if an error occurs then
+ // let higher level handle the problem
+ User::LeaveIfError( iClientDll.Load( serverDllFilename ) );
+ }
+
+// -----------------------------------------------------------------------------
+// CAnimationAppUi::SetupImageCommander()
+// Setup the client side commander.
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::SetupCommander()
+ {
+ // Tell client to construct a server side object
+ TBuf8<1> params( TInt8( 0 ) );
+ RWindowBase* windowBase = iScriptsView->DrawableWindow();
+ iClientCommander.AnimConstruct( *windowBase,
+ 0,
+ params );
+ }
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::DoCmdSettingsL()
+// Displays Settings dialog
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::DoCmdSettingsL()
+{
+ TInt button = 0;
+ CSettingsDialog* dlg = new(ELeave) CSettingsDialog(*iSettings);
+ button = dlg->ExecuteLD(R_DIALOG_SETTINGS);
+}
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::DynInitMenuPaneL
+// Set context specific menu
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
+{
+ if(R_MARKUNMARK_SUBMENU == aResourceId)
+ {
+ iScriptsView->iListBoxSelectionFlag = iScriptsView->CheckListBoxSelection();
+
+ if(iScriptsView->iListBoxSelectionFlag==EOneItemSel)
+ {
+ aMenuPane->SetItemDimmed(EMark, ETrue);
+ aMenuPane->SetItemDimmed(EMarkAll, ETrue);
+ aMenuPane->SetItemDimmed(EUnmarkAll, ETrue);
+ }
+ if(iScriptsView->iListBoxSelectionFlag==EOneItem)
+ {
+ aMenuPane->SetItemDimmed(EUnmark, ETrue);
+ aMenuPane->SetItemDimmed(EMarkAll, ETrue);
+ aMenuPane->SetItemDimmed(EUnmarkAll, ETrue);
+ }
+ if(iScriptsView->iListBoxSelectionFlag==EMoreItemsSel)
+ aMenuPane->SetItemDimmed(EMark, ETrue);
+ if(iScriptsView->iListBoxSelectionFlag==EMoreItems)
+ {
+ aMenuPane->SetItemDimmed(EUnmark, ETrue);
+ aMenuPane->SetItemDimmed(EUnmarkAll, ETrue);
+ }
+ if(iScriptsView->iListBoxSelectionFlag==EMoreItemsAll)
+ {
+ aMenuPane->SetItemDimmed(EMark, ETrue);
+ aMenuPane->SetItemDimmed(EMarkAll, ETrue);
+ }
+ if(iScriptsView->iListBoxSelectionFlag==EMoreItemsAllExc)
+ aMenuPane->SetItemDimmed(EUnmark, ETrue);
+ if(iScriptsView->iListBoxSelectionFlag==EMoreItemsNotAll)
+ aMenuPane->SetItemDimmed(EMark, ETrue);
+ if(iScriptsView->iListBoxSelectionFlag==EMoreItemsNotAllNotCurrent)
+ aMenuPane->SetItemDimmed(EUnmark, ETrue);
+ }
+ if (R_MENU == aResourceId)
+ {
+ iScriptsView->iListBoxSelectionFlag = iScriptsView->CheckListBoxSelection();
+
+ if(iRandomTestStarted || iRecording || iScriptRun)
+ {
+ aMenuPane->SetItemDimmed(ERandomTestStart, ETrue);
+ aMenuPane->SetItemDimmed(ESelectRunScript, ETrue);
+ aMenuPane->SetItemDimmed(ERecordKeys, ETrue);
+ aMenuPane->SetItemDimmed(ESettings,ETrue);
+ }
+
+ if (iScriptsView->GetScriptsCount() == 0)
+ {
+ aMenuPane->SetItemDimmed(ESelectRunScript, ETrue);
+ aMenuPane->SetItemDimmed(EMenuSelectCmdId, ETrue);
+ }
+
+ // Order of this 'SetItemDimmed' must not be changed within this function
+ if(iScriptsView->iListBoxSelectionFlag==0)
+ aMenuPane->SetItemDimmed(EMenuSelectCmdId, ETrue);
+ }
+}
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::StartTestL()
+// Run the test script
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::StartTestL()
+{
+ _LIT(KTESTLOG,"");
+ iLogger->WriteLogL(KTESTLOG,ETrue, ETrue);
+ iScriptRun = ETrue;
+ TInt errcode;
+ TInt err=iScriptsView->RunScriptsL(errcode);
+ if(err!=KErrNone)
+ {
+ iScriptRun = EFalse;
+ _LIT(KSCRIPTREADERROR,"Script file reading error. Drive might be locked or file name error");
+ CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
+ errorNote->ExecuteLD(KSCRIPTREADERROR);
+ }
+ iGlobalCapturer->StartL();
+}
+
+// -----------------------------------------------------------------------------
+// CUserEmulatorAppUi::HandleCommandL()
+// Function called by the framework to handle all the commands from Menu option
+// -----------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::HandleCommandL(TInt aCommand)
+{
+ switch (aCommand)
+ {
+ case ESelectRunScript:
+ {
+ if(!iScriptRun && !iRandomTestStarted && !iRecording)
+ {
+ //Select and run the test script
+ iScriptRun = ETrue;
+ iScriptsView->HandleMarkCommandL(EAknCmdMark);
+ TInt errcode;
+ TInt err=iScriptsView->RunScriptsL(errcode);
+
+ if(errcode!=KErrNone)
+ iScriptRun = EFalse;
+
+ if(err!=KErrNone)
+ {
+ iScriptRun = EFalse;
+ _LIT(KSCRIPTREADERROR,"Script file reading error. Drive might be locked or file name error.");
+ CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
+ errorNote->ExecuteLD(KSCRIPTREADERROR);
+ }
+ else
+ {
+ iGlobalCapturer->StartL();
+ }
+ }
+ else
+ {
+ CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
+ errorNote->ExecuteLD(KRUNERROR);
+ }
+
+ }
+ break;
+ case ERecordKeys:
+ {
+ iScriptsView->UnMarkL(EAknUnmarkAll);
+ if(!iRandomTestStarted)
+ {
+ if(iGlobalCapturer->StartRecordKeysL()==0)
+ iRecording = ETrue;
+ else
+ iRecording = EFalse;
+ }
+ else
+ {
+ CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
+ errorNote->ExecuteLD(KRUNERROR);
+ }
+ }
+ break;
+ case ERandomTestStart:
+ {
+ StartRandomTestL();
+ }
+ break;
+ case ESystemInfo:
+ iScriptsView->CmdGetSystemInfoL(EFalse);
+ break;
+
+ case EMark:
+ case EAknCmdMark:
+ iScriptsView->HandleMarkCommandL(EAknCmdMark);
+ break;
+ case EMarkAll:
+ case EAknMarkAll:
+ iScriptsView->HandleMarkCommandL(EAknMarkAll);
+ break;
+
+ case EUnmark:
+ case EAknCmdUnmark:
+ iScriptsView->UnMarkL(EAknCmdUnmark);
+ break;
+ case EUnmarkAll:
+ case EAknUnmarkAll:
+ iScriptsView->UnMarkL(EAknUnmarkAll);
+ break;
+
+ case ESettings:
+ DoCmdSettingsL();
+ break;
+
+ case EEikCmdExit:
+ case EAknSoftkeyExit:
+ if(!iScriptRun && !iRandomTestStarted && !iRecording)
+ Exit();
+ break;
+
+ case EHelp:
+ {
+ CArrayFix<TCoeHelpContext>* buf = CCoeAppUi::AppHelpContextL();
+ HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), buf);
+
+ }
+ break;
+
+ case EAbout:
+ {
+ CAknMessageQueryDialog* dlg = new (ELeave)CAknMessageQueryDialog();
+ dlg->PrepareLC(R_ABOUT_QUERY_DIALOG);
+ HBufC* title = iEikonEnv->AllocReadResourceLC(R_ABOUT_DIALOG_TITLE);
+ dlg->QueryHeading()->SetTextL(*title);
+ CleanupStack::PopAndDestroy(); //title
+ HBufC* msg = iEikonEnv->AllocReadResourceLC(R_ABOUT_DIALOG_TEXT);
+ dlg->SetMessageTextL(*msg);
+ CleanupStack::PopAndDestroy(); //msg
+ dlg->RunLD();
+ }
+ break;
+ default:
+
+ break;
+ }
+}
+
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::RefreshFileNotification()
+// Refresh script list if there was a change in script folder
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::RefreshFileNotification()
+ {
+ CNotifyFileChange* nfc = iScriptsView->GetNotifyFileChange();
+ nfc->RefreshPath(iSettings->iScriptsPath);
+ }
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::SetApplicationRectInSettings
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::SetApplicationRectInSettings()
+ {
+ iSettings->iAppRect = ApplicationRect();
+ }
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::StartRandomTestL()
+// Start random test. Displays error message if it fails.
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::StartRandomTestL()
+{
+ if(!iRecording && !iScriptRun)
+ {
+ if(!iRandomTest)
+ {
+ SetApplicationRectInSettings();
+ iRandomTest = CRandomTest::NewL(*this,iEikonEnv->WsSession(),*iSettings, iSession,*iLogger);
+ }
+
+ _LIT(KRANDOMTEST,"Random test began");
+ CAknConfirmationNote* errorNote = new (ELeave) CAknConfirmationNote(ETrue);
+ errorNote->ExecuteLD(KRANDOMTEST);
+ User::After(100000);
+
+ iRandomTestStarted = ETrue;
+
+ _LIT(KRANDOMTESTSTART, "***Random test started***\n");
+ iLogger->WriteLogL(KRANDOMTESTSTART,EFalse,EFalse);
+
+ iGlobalCapturer->StartL();
+ iRandomTest->StartRandomTestL();
+ }
+ else
+ {
+ CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
+ errorNote->ExecuteLD(KRUNERROR);
+ }
+}
+
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::PanicOccured()
+// Callback from Thread Notifier when a panic occures
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::PanicOccured()
+ {
+ if(iRandomTestStarted && iRandomTest)
+ iRandomTest->CancelRandomTest();
+ }
+
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::HelpContextL()
+// Set help context
+// ----------------------------------------------------------------
+//
+CArrayFix<TCoeHelpContext>* CUserEmulatorAppUi::HelpContextL() const
+ {
+ CArrayFixFlat<TCoeHelpContext>* array = new(ELeave)CArrayFixFlat<TCoeHelpContext>(1);
+ CleanupStack::PushL(array);
+ array->AppendL(TCoeHelpContext(KUidUserEmulatorApp, KContext1));
+ CleanupStack::Pop(array);
+ return array;
+ }
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::OnParseCompletedL
+// Callback function. Called at the end of xml script parse
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::OnParseCompletedL( TInt aError , TState aState)
+{
+ if ( KErrNone == aError )
+ {
+ iScriptErrorIndexes.Append(iSelectedScriptCount);
+ if(aState == EOnEndElement)
+ {
+ iPointerCount = 0;
+ TRAPD(error, PerformActionL());
+ if(error != KErrNone)
+ {
+ _LIT(KErrorDec,"Error: %d\n");
+ TBuf<KBuffer128> buffer;
+ buffer.AppendFormat( KErrorDec,error );
+ iLogger->WriteLogL(buffer,EFalse);
+ return;
+ }
+
+ }
+ }
+ else
+ {
+ HBufC* scriptName = iScriptsView->GetScriptNameLC(iSelectedScriptCount);
+ if(scriptName)
+ {
+ const TInt KLitLength = 38;
+ _LIT(KErrorFormat, "Error..Cannot execute script: %S\n");
+
+ HBufC* buffer = HBufC::NewLC( scriptName->Length()+ KLitLength );
+ TPtr bufferPtr( buffer->Des() );
+ bufferPtr.AppendFormat(KErrorFormat,&scriptName->Des());
+ iLogger->WriteLogL(*buffer,EFalse);
+ CleanupStack::PopAndDestroy(); //buffer
+ }
+ iScriptsView->ChangeIconL(EScriptFailed,iSelectedScriptCount);
+
+ iScriptRun = EFalse;
+ TRAPD(err, iScriptsView->HandleMarkCommandL(EAknCmdMark));
+
+ CleanupStack::PopAndDestroy(); //scriptName
+
+ }
+ if(++iSelectedScriptCount == iScriptsView->GetSelectedScriptsCount())
+ iSelectedScriptCount = 0;
+
+}
+
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::StartParsingL
+// Simply calls xml handle StartParsingL function
+// ----------------------------------------------------------------
+//
+TInt CUserEmulatorAppUi::StartParsingL( const TDesC& aFileName )
+{
+ // Parse XML document without active object.
+ return iXmlHandler->StartParsingL( aFileName );
+}
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::OpenUrlL
+// Starts browser with the given url
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::OpenUrlL(const TPtrC& aUrl)
+{
+ TApaTaskList taskList(iEikonEnv->WsSession());
+ TApaTask task = taskList.FindApp(TUid::Uid(HS_VIEW_OSS_BROWSER_APPUID));
+
+ if (task.Exists()) // Test whether we've been returned an empty task
+ {
+ task.BringToForeground();
+ HBufC8 *url8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(aUrl);
+ task.SendMessage(TUid::Uid(0), *url8); // UID not used
+ delete url8;
+ }
+ else
+ {
+ TThreadId thread;
+ iSession.StartDocument(aUrl, TUid::Uid(HS_VIEW_OSS_BROWSER_APPUID), thread);
+ }
+}
+
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::StartJavaApp
+// Start a Java app
+// ----------------------------------------------------------------
+//
+TInt CUserEmulatorAppUi::StartJavaApp(const TDesC& aAppName)
+{
+ TApaAppInfo appInfo;
+ TBool found = EFalse;
+
+ iSession.GetAllApps();
+ _LIT(KFakeApp,".fakeapp");
+ const TInt KFALength = 8;
+ while (iSession.GetNextApp( appInfo ) == KErrNone)
+ {
+ if (appInfo.iFullName.Right(KFALength) == KFakeApp)
+ {
+ if (appInfo.iCaption == aAppName)
+ {
+ imidletUID = appInfo.iUid;
+ found = ETrue;
+ }
+ }
+ }
+
+ // We've got the UID of the MIDlet so we can launch it
+ if (!found)
+ {
+ _LIT(KJAVAAPPERROR, "Java Application not found");
+ TRAPD(err, CUtils::MessageBoxL(KJAVAAPPERROR));
+ return KErrNotFound;
+ }
+
+ TThreadId threadId;
+ return iSession.StartDocument(KNullDesC, imidletUID, threadId);
+}
+void CUserEmulatorAppUi::RestartRandomTests()
+{
+ if(iRandomTestStarted && iRandomTest)
+ iRandomTest->RestartRandomTest();
+}
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::PerformNextAction
+// Sets timer. When timer expired PerformActionL is called.
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::PerformNextAction(TInt aInterval)
+{
+ iDelayTimer->Wait(aInterval);
+}
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::PerformActionL
+// Main worker function. Executes parsed actions form scripts
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::PerformActionL()
+{
+ CAction *action = NULL;
+
+ if(!iActionIndex)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Copy(KStartTest);
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+
+ if(iActionList.Count()) //Action list is not NULL
+ {
+ if(iActionIndex >= iActionList.Count())
+ {
+ iActionIndex = 0;
+ iActionList.ResetAndDestroy();
+ iActionList.Close();
+ iGlobalCapturer->Stop();
+ iScriptRun = EFalse;
+ return;
+ }
+ action = iActionList[iActionIndex++];
+ }
+ if (!action)
+ return;
+
+ TInt64 interval = 0;
+ TInt performactiontimer = 10;
+ TPtrC params;
+
+ if (action->iParams)
+ params.Set(*action->iParams);
+
+ // Execute actions
+ switch(action->iType)
+ {
+ case EActionTypeEndScript:
+ {
+ TInt status = 0;
+
+ if(iError)
+ {
+ iError = EFalse;
+ status = EScriptFailed;
+ }
+ else
+ status = EScriptPassed;
+
+ //Logging to file
+ iLogBuffer.Zero();
+ iLogBuffer.Append(KEndScript);
+
+ HBufC* scriptName = iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex));
+ if(scriptName)
+ {
+ iLogBuffer.Append(scriptName->Des());
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+
+ CleanupStack::PopAndDestroy(); //scriptName
+
+ iScriptsView->ChangeIconL(status,iScriptErrorIndexes.operator [](iSelectedIndex));
+
+ iScriptsView->HandleMarkCommandL(EAknCmdMark);
+
+ if(++iSelectedIndex == iScriptErrorIndexes.Count())
+ {
+ BringToForeground();
+
+ iSelectedIndex = 0;
+ iScriptErrorIndexes.Close();
+ }
+
+ // Reset loop array
+ iNestedLoopArray.Reset();
+ }
+ break;
+
+ case EActionTypeLoopStart:
+ {
+ if(!iError)
+ {
+ TInt Counter;
+ TPtr buffer = action->iParams->Des();
+ buffer.Trim();
+ TLex16 lval(buffer);
+ lval.Val(Counter);
+ iNestedLoopArray.Append(Counter);
+ iNestedLoopArray.Append(iActionIndex);
+ iLoopExists = ETrue;
+ }
+ }
+ break;
+
+ case EActionTypeLoopEnd:
+ {
+ if(!iError && iNestedLoopArray.Count()>1)
+ {
+ TInt Counter=iNestedLoopArray.operator [](iNestedLoopArray.Count()-2);
+
+ if(Counter==1 || Counter==0 || Counter < -1)
+ {
+ iNestedLoopArray.Remove(iNestedLoopArray.Count()-2);
+ iNestedLoopArray.Remove(iNestedLoopArray.Count()-1);
+ if(iNestedLoopArray.Count()==0)
+ iLoopExists = EFalse;
+ }
+ else
+ {
+ if(Counter!=-1) // Infinite loop
+ iNestedLoopArray.operator [](iNestedLoopArray.Count()-2) = Counter-1;
+
+ iActionIndex = iNestedLoopArray.operator [](iNestedLoopArray.Count()-1);
+ }
+ }
+ }
+ break;
+ case EActionTypeView: // View switching
+ {
+ if(!iError){
+ TUid appUid, viewUid, customMessageUid;
+ TBuf<KBuffer64> tmp16;
+ TBuf<KBuffer64> AppName;
+
+ if(action->iPrintLog)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Copy(KVIEWSWITCH);
+ iLogBuffer.Append(*action->iPrintLog);
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+
+ if (ParseParams( *action->iParams, appUid, viewUid, customMessageUid, tmp16, AppName ) != KErrNone )
+ return;
+
+
+ if(AppName.Length()>0)
+ {
+ appUid=GetAppUidFromName(AppName);
+ if(appUid.iUid==0)
+ return;
+ }
+
+ TBuf8<KBuffer64> customMessage;
+ customMessage.Copy(tmp16);
+
+ // check params count, if only one, try to run applicationu
+ if (viewUid.iUid == 0 && customMessageUid.iUid == 0 && customMessage.Length() == 0)
+ {
+ TThreadId threadId; // not used
+ TInt res = iSession.StartDocument(KNullDesC, appUid, threadId);
+ if(res != KErrNone)
+ {
+ _LIT(KAPPLAUNCERROR,"*ERROR* Application not found");
+ CUtils::MessageBoxL(KAPPLAUNCERROR);
+ iLogger->WriteLogL(KViewSwitchingError,EFalse);
+ iError = ETrue;
+ }
+ }
+ else
+ {
+ TApaTaskList taskList(iEikonEnv->WsSession());
+ TApaTask task = taskList.FindApp(appUid);
+
+ if (action->iKeys.Count())
+ {
+ if (task.Exists())
+ {
+ task.EndTask();
+ User::After(KWait03);
+ }
+ }
+
+ TRAPD(err,iCoeEnv->AppUi()->ActivateViewL( TVwsViewId(appUid,viewUid),customMessageUid, customMessage ));
+
+ if (err == KErrCancel)
+ {
+ // do nothing, user has hit red key.
+ }
+ else if (err != KErrNone)
+ {
+ // probably some problem with ActivateViewL func, we need to trap this case
+ TBuf<KBuffer128> buf;
+ buf.Format(KViewSwitchingError);
+ CUtils::MessageBoxL(buf);
+ //Logging to File
+ iLogBuffer.Zero();
+ iLogBuffer.AppendFormat(KStringLit,&KViewSwitchingError);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ iError = ETrue;
+ }
+ }
+
+ if (action->iKeys.Count())
+ {
+ User::After(KWait03);
+
+ RWsSession& wsSession = iCoeEnv->WsSession();
+
+ // switch focus
+ TInt id = wsSession.GetFocusWindowGroup();
+
+ // send key events
+ TWsEvent wsEvent;
+ wsEvent.SetType(EEventKey);
+ TKeyEvent& keyEvent(*wsEvent.Key());
+ keyEvent.iModifiers=0;
+ keyEvent.iRepeats=0;
+
+ for (TInt i=0; i<action->iKeys.Count(); i++)
+ {
+ keyEvent.iCode = action->iKeys[i];
+ keyEvent.iScanCode= 0;
+ wsSession.SendEventToWindowGroup(id,wsEvent);
+ User::After(KWait1);
+ }
+ }
+
+ if(action->iScreenshotTag)
+ {
+ CImageCapture* imageCapture = CImageCapture::NewL(*iSettings,*this,iEikonEnv);
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex))),appUid);
+ CleanupStack::PopAndDestroy(); //script name
+ }
+ }
+ }
+ break;
+ // Launch either a new Java app or open a url
+ case EActionTypeJavaApp:
+ {
+ if(!iError)
+ {
+ TBuf<KBuffer64> appName;
+ TBuf<KBuffer256> url;
+
+ if(action->iPrintLog)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Copy(KAPPLAUNCH);
+ iLogBuffer.Append(*action->iPrintLog);
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+ if (ParseParams( params, appName, url ) != KErrNone)
+ return;
+
+ // Try to start the Java app if not then open the url
+ if (StartJavaApp(appName) != KErrNone)
+ OpenUrlL(url);
+
+ if(action->iScreenshotTag)
+ {
+ CImageCapture* imageCapture = CImageCapture::NewL(*iSettings,*this,iEikonEnv);
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex))),imidletUID);
+ }
+ }
+ }
+ break;
+
+ case EActionTypeApp: // Launching new app
+ {
+ if(!iError){
+ TUid appUid;
+ TBuf<KBuffer64> argument;
+ TBuf<KBuffer64> AppName;
+ TInt error = KErrNone;
+
+ if(action->iPrintLog)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Copy(KAPPLAUNCH);
+ iLogBuffer.Append(*action->iPrintLog);
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+
+ // Parse app uid or app name from param
+ if(params.Left(2)== KHEX)
+ {
+ if (ParseParams(params, appUid, argument ) != KErrNone )
+ return;
+ }
+ else
+ {
+ if (ParseParams(params, AppName, argument ) != KErrNone )
+ return;
+ }
+
+ if(AppName.Length()>0)
+ {
+ appUid=GetAppUidFromName(AppName);
+ if(appUid.iUid==0)
+ return;
+ }
+
+ if (action->iKeys.Count())
+ {
+ TApaTaskList taskList(iEikonEnv->WsSession());
+ TApaTask task = taskList.FindApp(appUid);
+
+ if (task.Exists())
+ {
+ task.EndTask();
+ User::After(KWait03);
+ }
+ }
+
+ TBuf<KBuffer64> argument16;
+ argument16.Copy(argument);
+ TThreadId threadId; // not used
+ error = iSession.StartDocument(argument16, appUid, threadId);
+
+ if ( error == KErrNotFound )
+ {
+ //Logging to File
+ iLogBuffer.Zero();
+ iLogBuffer.AppendFormat(KStringLit,&KAppNotFound);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ iError = ETrue;
+ }
+ else if ( error != KErrNone )
+ {
+ // Do nothing for the moment
+ }
+
+ if (action->iKeys.Count())
+ {
+ User::After(KWait005);
+
+ RWsSession& wsSession=iEikonEnv->WsSession();
+
+ // switch focus
+ TInt id = wsSession.GetFocusWindowGroup();
+
+ // send key events
+ TWsEvent wsEvent;
+ wsEvent.SetType(EEventKey);
+ TKeyEvent& keyEvent(*wsEvent.Key());
+ keyEvent.iModifiers=0;
+ keyEvent.iRepeats=0;
+
+ for (TInt i=0; i<action->iKeys.Count(); i++)
+ {
+ keyEvent.iCode = action->iKeys[i];
+ keyEvent.iScanCode= keyEvent.iCode;
+ wsSession.SendEventToWindowGroup(id,wsEvent);
+
+ User::After(KWait1);
+ }
+ }
+ if(action->iScreenshotTag)
+ {
+ CImageCapture* imageCapture = CImageCapture::NewL(*iSettings,*this,iEikonEnv);
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex))),appUid);
+ CleanupStack::PopAndDestroy(); //script name
+ }
+
+ }
+ }
+ break;
+ case EActionTypeWait:
+ {
+ if(!iError){
+ if(action->iPrintLog)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Copy(KWAIT);
+ iLogBuffer.Append(*action->iPrintLog);
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+
+ if(action->iScreenshotTag)
+ {
+ CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(iEikonEnv->WsSession(), iEikonEnv->WsSession().GetFocusWindowGroup());
+ TUid foreTaskUid = gn->AppUid();
+ CleanupStack::PopAndDestroy(gn);
+
+ CImageCapture* imageCapture = CImageCapture::NewL(*iSettings,*this,iEikonEnv);
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(
+ iScriptErrorIndexes.operator [](iSelectedIndex))),foreTaskUid.Null());
+
+ CleanupStack::PopAndDestroy(); //script name
+ }
+
+ TPtr buffer = action->iParams->Des();
+ buffer.Trim();
+
+ TLex16 lval(buffer);
+ lval.Val(interval);
+ if(interval>30)
+ User::AfterHighRes(interval-30); // -30 -> 30 msec is around the delay of processing PerformAction func.
+
+
+ }
+ }
+ break;
+ case EActionCloseApp:
+ {
+ if(!iError)
+ {
+ TUid appUid;
+ TBuf<KBuffer64> argument;
+
+ if(action->iPrintLog)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Copy(KCLOSEAPP);
+ iLogBuffer.Append(*action->iPrintLog);
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+
+ if (ParseParams( *action->iParams, appUid, argument ) != KErrNone )
+ return;
+
+ TApaTaskList taskList(iEikonEnv->WsSession());
+ TApaTask task = taskList.FindApp(appUid);
+
+ if (task.Exists())
+ {
+ task.EndTask();
+ User::After(KWait03);
+ }
+
+ if(action->iScreenshotTag)
+ {
+ CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(iEikonEnv->WsSession(),
+ iEikonEnv->WsSession().GetFocusWindowGroup());
+ TUid foreTaskUid = gn->AppUid();
+ CleanupStack::PopAndDestroy(gn);
+
+ CImageCapture* imageCapture = CImageCapture::NewL(*iSettings,*this,iEikonEnv);
+ imageCapture->CaptureL( *action->iScreenshotTag,
+ *(iScriptsView->GetScriptNameLC(
+ iScriptErrorIndexes.operator [](iSelectedIndex))),foreTaskUid.Null());
+ CleanupStack::PopAndDestroy(); //script name
+ }
+ }
+ }
+ break;
+ case EActionTypeOrientationChange:
+ {
+ if(!iError)
+ {
+ _LIT(KLandscape,"landscape");
+ //Logging to File
+ if(action->iPrintLog)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Copy(KORIENTATION);
+ iLogBuffer.Append(*action->iPrintLog);
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+
+ TInt state=0;
+ TInt mode=0;
+ if((*action->iParams).Compare(KLandscape)==0)
+ {
+ state = 1;
+ mode = 1;
+ }
+
+ RProperty::Set( TUid::Uid(0x101F8773), 8, state);
+ iEikonEnv->ScreenDevice()->SetScreenMode(mode);
+
+ if(action->iScreenshotTag)
+ {
+ CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(iEikonEnv->WsSession(), iEikonEnv->WsSession().GetFocusWindowGroup());
+ TUid foreTaskUid = gn->AppUid();
+ CleanupStack::PopAndDestroy(gn);
+ TUid appuid = foreTaskUid.Null();
+
+ CImageCapture* imageCapture = CImageCapture::NewL(*iSettings,*this,iEikonEnv);
+ if(iLoopExists)
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex))),appuid);
+ else
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex))),foreTaskUid);
+
+ CleanupStack::PopAndDestroy(); //script name
+ }
+
+ }
+ }
+ break;
+ case EActionTypeScreenReset:
+ {
+ if(!iError)
+ {
+ //Logging to File
+ if(action->iPrintLog)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Copy(KSCREENRESET);
+ iLogBuffer.Append(*action->iPrintLog);
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+
+ iGlobalCapturer->KillUnwantedAppsResetL();
+
+ iGlobalCapturer->ScreenReset();
+
+
+ if(action->iScreenshotTag)
+ {
+ CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(iEikonEnv->WsSession(), iEikonEnv->WsSession().GetFocusWindowGroup());
+ TUid foreTaskUid = gn->AppUid();
+ CleanupStack::PopAndDestroy(gn);
+ TUid appuid = foreTaskUid.Null();
+
+ CImageCapture* imageCapture = CImageCapture::NewL(*iSettings,*this,iEikonEnv);
+
+ if(iLoopExists)
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex))),appuid);
+ else
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex))),foreTaskUid);
+
+ CleanupStack::PopAndDestroy(); //script name
+ }
+
+ }
+ }
+ break;
+ case EActionTypePointerEvent:
+ {
+ if (!iError && AknLayoutUtils::PenEnabled())
+ {
+ TBuf<KBuffer32> eventname;
+ TBuf<KBuffer32> argument;
+ TBuf<KBuffer32> arg1;
+ TBuf<KBuffer32> arg2;
+ TBuf<KBuffer32> argx;
+ TBuf<KBuffer32> argy;
+ TBuf<KBuffer32> argx1;
+ TBuf<KBuffer32> argy1;
+ TInt16 intargx;
+ TInt16 intargy;
+ TInt16 intargx1;
+ TInt16 intargy1;
+
+ if(action->iPrintLog)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Copy(KPOINTEREVENT);
+ iLogBuffer.Append(*action->iPrintLog);
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+ // For example: PointerTo 10,10 (or MoveTo 12,12,100,100)
+ const TInt KParamMaxLength = 32;
+ if((*action->iParams).Length()<=KParamMaxLength)
+ {
+ if (ParseParams( *action->iParams, eventname, argument ) == KErrNone )
+ {
+ if (ParseParams( argument, argx, argy ) == KErrNone )
+ {
+ if (ParseParams( argy, argx1, argy1 ) == KErrNone )
+ {// 3 params
+ TLex16 lval1(argx);
+ lval1.Val(intargx);
+ TLex16 lval2(argx1);
+ lval2.Val(intargx1);
+ TLex16 lval3(argy1);
+ lval3.Val(intargy1);
+ if(eventname.Compare(KButtonDown)==0)
+ ButtonDownEvent(intargx+intargy1,intargx1+intargy1);
+ if(eventname.Compare(KButtonUp)==0)
+ ButtonUpEvent(intargx+intargy1,intargx1+intargy1);
+ if(eventname.Compare(KPointerMove)==0)
+ PointerMoveEvent(intargx+intargy1,intargx1+intargy1);
+ }
+ else
+ {
+ // 2 params
+ TLex16 lval1(argx);
+ lval1.Val(intargx);
+ TLex16 lval2(argy);
+ lval2.Val(intargy);
+ if(eventname.Compare(KButtonDown)==0)
+ ButtonDownEvent(intargx,intargy);
+ if(eventname.Compare(KButtonUp)==0)
+ ButtonUpEvent(intargx,intargy);
+ if(eventname.Compare(KPointerMove)==0)
+ PointerMoveEvent(intargx,intargy);
+
+ }
+ }
+ }
+ }
+
+ if(action->iScreenshotTag)
+ {
+ CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(iEikonEnv->WsSession(), iEikonEnv->WsSession().GetFocusWindowGroup());
+ TUid foreTaskUid = gn->AppUid();
+ CleanupStack::PopAndDestroy(gn);
+ TUid appuid = foreTaskUid.Null();
+
+ CImageCapture* imageCapture = CImageCapture::NewL(*iSettings,*this,iEikonEnv);
+ if(iLoopExists)
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex))),appuid);
+ else
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex))),foreTaskUid);
+
+ CleanupStack::PopAndDestroy(); //script name
+ }
+ }
+ else
+ {
+ if(iPointerCount == 0)
+ {
+ _LIT(KErrorNote, "Script might not work properly on Non touch enabled device!!");
+ CAknGlobalNote* globalNote = CAknGlobalNote::NewL();
+ CleanupStack::PushL( globalNote );
+ globalNote->ShowNoteL( EAknGlobalErrorNote , KErrorNote );
+ CleanupStack::PopAndDestroy();
+ iPointerCount++;
+ }
+ }
+ }
+ break;
+
+ case EActionTypeKeys: // keys handling
+ {
+ TUid foreTaskUid;
+ if(!iError){
+
+ //Logging to File
+ if(action->iPrintLog)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Copy(KKEYPRESS);
+ iLogBuffer.Append(*action->iPrintLog);
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+
+ if (action->iKeys.Count())
+ {
+ User::After(KWait03);
+
+ RWsSession& wsSession = iEikonEnv->WsSession();
+
+ // switch focus
+ wsSession.GetFocusWindowGroup();
+
+ // send key events
+ TWsEvent wsEvent;
+ TKeyEvent& keyEvent(*wsEvent.Key());
+ keyEvent.iModifiers=0;
+
+ TInt repeats;
+ if(action->iParams)
+ {
+ TPtr buffer = action->iParams->Des();
+ buffer.Trim();
+ TLex16 lval(buffer);
+ lval.Val(repeats);
+ }
+ else
+ repeats = 0;
+
+ CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(iEikonEnv->WsSession(), iEikonEnv->WsSession().GetFocusWindowGroup());
+ foreTaskUid = gn->AppUid();
+ CleanupStack::PopAndDestroy(gn);
+
+ for (TInt i=0; i<action->iKeys.Count(); i++)
+ {
+ keyEvent.iCode = action->iKeys[i];
+
+ AknLayoutUtils::TAknCbaLocation location = AknLayoutUtils::CbaLocation();
+ TBool orientation = ETrue;
+
+ if (location == AknLayoutUtils::EAknCbaLocationBottom)
+ {
+ //Potrait mode
+ orientation = ETrue;
+ }
+ else
+ {
+ // Landscape mode
+ orientation = EFalse;
+ }
+
+ if(63498 == action->iKeys[i] && orientation) //Down Arrow Key
+ keyEvent.iScanCode= EStdKeyDownArrow;
+ else if(63498 == action->iKeys[i] && !orientation) //Landscape (Left Arrow Key)
+ keyEvent.iScanCode= EStdKeyLeftArrow;
+ else if(63497 == action->iKeys[i] && orientation) //Up Arrow Key
+ keyEvent.iScanCode= EStdKeyUpArrow;
+ else if(63497 == action->iKeys[i] && !orientation) //Landscape (Right Arrow Key)
+ keyEvent.iScanCode= EStdKeyRightArrow;
+ else if(63496 == action->iKeys[i] && orientation) //Right Arrow Key
+ keyEvent.iScanCode= EStdKeyRightArrow;
+ else if(63496 == action->iKeys[i] && !orientation) //Landscape (Down Arrow Key)
+ keyEvent.iScanCode= EStdKeyDownArrow;
+ else if(63495 == action->iKeys[i] && orientation) //Left Arrow Key
+ keyEvent.iScanCode= EStdKeyLeftArrow;
+ else if(63495 == action->iKeys[i] && !orientation) //Landscape (Up Arrow Key)
+ keyEvent.iScanCode= EStdKeyUpArrow;
+ else if(63554 == action->iKeys[i] ) //Left Soft Key (OK Key)
+ keyEvent.iScanCode = EStdKeyDevice0;
+ else if(63555 == action->iKeys[i] ) //Right Soft Key (OK Key)
+ keyEvent.iScanCode = EStdKeyDevice1;
+ else if(63586 == action->iKeys[i]) //KYES (Green Key)
+ keyEvent.iScanCode = EStdKeyYes;
+ else if(63587 == action->iKeys[i]) //KNO (Red Key)
+ keyEvent.iScanCode = EStdKeyNo;
+ else if(8 == action->iKeys[i]) // BS (C key)
+ keyEvent.iScanCode = EStdKeyBackspace;
+ else if(35 == action->iKeys[i]) // Hash mark
+ keyEvent.iScanCode = EStdKeyHash;
+ else if(63570 == action->iKeys[i]) //KMENU (Menu Key)
+ keyEvent.iScanCode = EStdKeyApplication0;
+ else if ((foreTaskUid != KUidStandBy1) &&
+ (foreTaskUid != KUidStandBy) &&
+ (foreTaskUid != KUidStandby50) ||
+ (167 == action->iKeys[i])) //Middle Soft Key)
+ keyEvent.iScanCode = keyEvent.iCode;
+ else
+ keyEvent.iScanCode = 0;
+
+ TRawEvent lEventDown;
+ lEventDown.Set(TRawEvent::EKeyDown, keyEvent.iScanCode);
+ UserSvr::AddEvent(lEventDown);
+
+ User::After(KWait01);
+
+ // long key press
+ if(repeats>0)
+ User::After((KWait01*12)*repeats);
+
+ TRawEvent lEventUp;
+ lEventUp.Set(TRawEvent::EKeyUp, keyEvent.iScanCode);
+ UserSvr::AddEvent(lEventUp);
+
+ User::After(KWait01);
+ }
+ }
+ if(action->iScreenshotTag)
+ {
+ CImageCapture* imageCapture = CImageCapture::NewL(*iSettings,*this,iEikonEnv);
+ TUid appuid = foreTaskUid.Null();
+ imageCapture->CaptureL(*action->iScreenshotTag,*(iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex))),appuid);
+
+ CleanupStack::PopAndDestroy(); //script name
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ if(!iStopScripts)
+ {
+ if(!action->iScreenshotTag)
+ PerformNextAction(performactiontimer);
+ }
+ else
+ {
+ CancelScriptExecutionL();
+ }
+}
+
+// ------------------------------------------------------------------
+// Selects and starts scripts according to command-line parameters
+// ------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::FolderScanCompletedL()
+ {
+ TInt Count=0;
+ // Selects scripts in list box. iCommandLineScriptsArray is filled with command-line params previously
+ for(TInt i=0;i<iCommandLineScriptsArray->Count();i++)
+ {
+
+ if(iScriptsView->GetScriptIndexAndMarkL((*iCommandLineScriptsArray)[i])!=-1)
+ {
+ Count++;
+ }
+ }
+
+ // If there was one match at least -> start tests!
+ if(Count>0)
+ StartTestL();
+ else
+ {
+ // If there was no command-line param, don't display this message.
+ if(iCommandLineScriptsArray->Count()!=0)
+ {
+ _LIT(KNoScriptToRun,"Argument doesn't contain any valid script name!");
+ CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
+ errorNote->ExecuteLD(KNoScriptToRun);
+ }
+ }
+
+ if(iCommandLineScriptsArray)
+ iCommandLineScriptsArray->Reset();
+
+ iIsFolderScanCompletedCalled = ETrue;
+ }
+
+// ------------------------------------------------------------------
+// Finds App name in app list and returns it's app uid if app exists
+// ------------------------------------------------------------------
+//
+TUid CUserEmulatorAppUi::GetAppUidFromName(TDesC& aAppName)
+ {
+ TApaAppInfo appInfo;
+ TBool res=EFalse;
+ TUid uid;
+ uid.iUid = 0;
+ iSession.GetAllApps();
+
+ while (iSession.GetNextApp( appInfo ) == KErrNone)
+ {
+ if(aAppName.Compare(appInfo.iCaption)==0)
+ {
+ res=ETrue;
+ break;
+ }
+ }
+
+ if(res)
+ return appInfo.iUid;
+ else
+ return uid;
+ }
+
+// ----------------------------------------------------------------
+// Stops script execution after Power button press
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::CancelScriptExecutionL()
+{
+ if(!iScriptErrorIndexes.Count())
+ return;
+ if(iStopScripts)
+ {
+ iLogBuffer.Zero();
+ iLogBuffer.Append(KStopScript);
+ iStopScripts = EFalse;
+ iScriptsView->ChangeIconL(EScriptCancelled, iScriptErrorIndexes.operator [](iSelectedIndex));
+ iScriptRun = EFalse;
+ iScriptsView->HandleMarkCommandL(EAknCmdMark);
+ }
+
+ ResetLists();
+
+ //Logging to file
+ HBufC* scriptName = iScriptsView->GetScriptNameLC(iScriptErrorIndexes.operator [](iSelectedIndex));
+ if(scriptName)
+ {
+ iLogBuffer.Append(scriptName->Des());
+ iLogBuffer.Append(KNEWLINE);
+ iLogger->WriteLogL(iLogBuffer,EFalse);
+ }
+ CleanupStack::PopAndDestroy(); //scriptName
+
+ iSelectedIndex = 0;
+ iScriptErrorIndexes.Close();
+
+ BringToForeground();
+}
+
+// ---------------------------------------------------------------
+// Converts coordinates because of different manufacturer devices
+// ---------------------------------------------------------------
+//
+void CUserEmulatorAppUi::CoordConversionByOrientation(TInt x,TInt y,TInt& xMod,TInt& yMod)
+ {
+ //TSize screen=iFunctions->ScreenDevice()->SizeInPixels();
+ TSize screen=iEikonEnv->ScreenDevice()->SizeInPixels();
+ TInt Width=screen.iWidth;
+ TInt Height=screen.iHeight;
+
+ // Coord conversion
+ if(Width <= Height) // Portrait mode
+ {
+ switch(iManufacturer)
+ {
+ case KManufacturerNokia:
+ xMod = y;
+ yMod = Width-x;
+ break;
+
+ case KManufacturerSamsung:
+ case KManufacturerSonyEricsson:
+ default:
+ xMod = x;
+ yMod = y;
+ break;
+
+ }
+ }
+ else // Landscape mode
+ {
+ switch(iManufacturer)
+ {
+ case KManufacturerNokia:
+ default:
+ xMod=x;
+ yMod=y;
+ break;
+
+ case KManufacturerSamsung:
+ case KManufacturerSonyEricsson:
+ xMod = Height-y;
+ yMod = x;
+ break;
+ }
+ }
+ }
+
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::ButtonDownEvent
+// Sends pointer down raw event to the system
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::ButtonDownEvent(TInt intargx, TInt intargy)
+{
+ TRawEvent event;
+ TInt x,y;
+ CoordConversionByOrientation(intargx,intargy,x,y);
+ event.Set(TRawEvent::EButton1Down, x, y);
+ iEikonEnv->WsSession().SimulateRawEvent(event);
+}
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::ButtonUpEvent
+// Sends pointer up raw event to the system
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::ButtonUpEvent(TInt intargx, TInt intargy)
+{
+ TRawEvent event;
+ TInt x,y;
+ CoordConversionByOrientation(intargx,intargy,x,y);
+ event.Set(TRawEvent::EButton1Up, x, y);
+ iEikonEnv->WsSession().SimulateRawEvent(event);
+}
+// ----------------------------------------------------------------
+// CUserEmulatorAppUi::PointerMoveEvent
+// Sends pointer drag raw event to the system
+// ----------------------------------------------------------------
+//
+void CUserEmulatorAppUi::PointerMoveEvent(TInt intargx, TInt intargy)
+{
+ TRawEvent event;
+ TInt x,y;
+ CoordConversionByOrientation(intargx,intargy,x,y);
+ event.Set(TRawEvent::EPointerMove, x, y);
+ iEikonEnv->WsSession().SimulateRawEvent(event);
+}
+// ------------------------------------------------------------------------------
+// CUserEmulatorAppUi::ResetLists
+// Resets the action list (Action list contains parsed actions from xml script)
+// ------------------------------------------------------------------------------
+//
+void CUserEmulatorAppUi::ResetLists()
+{
+ iActionIndex = 0;
+ iActionList.ResetAndDestroy();
+ iActionList.Close();
+}
+// ----------------------------------------
+// CUserEmulatorAppUi::BringToForeground
+// Puts this application foreground
+// ----------------------------------------
+//
+void CUserEmulatorAppUi::BringToForeground()
+{
+ TApaTaskList taskList(iEikonEnv->WsSession());
+ TApaTask task = taskList.FindApp(KUidUserEmulatorApp);
+ if (task.Exists())
+ task.BringToForeground();
+}
+
+// ----------------------------------------
+// CUserEmulatorAppUi::RandomTestEndsL
+// Stops random test
+// ----------------------------------------
+//
+void CUserEmulatorAppUi::RandomTestEndsL()
+{
+ iRandomTest->StopRandomTest();
+ iRandomTestStarted = EFalse;
+ iGlobalCapturer->Stop();
+
+ BringToForeground();
+
+ _LIT(KRANDOMTESTENDLOG, "***Random test ended***\n");
+ iLogger->WriteLogL(KRANDOMTESTENDLOG,EFalse,EFalse);
+
+ _LIT(KRANDOMTESTEND,"Random test ended");
+ CUtils::MessageBoxL(KRANDOMTESTEND);
+}
+
+// ------------------------------------------------------
+// CUserEmulatorAppUi::ParseParams
+// Parses input string into three UIds and one string
+// ------------------------------------------------------
+//
+TInt CUserEmulatorAppUi::ParseParams( const TDesC& aParamString,
+ TUid& aAppUid, TUid& aViewUid,
+ TUid& aCustomMessageUid, TDes& aCustomMessage, TDes& aAppName ) const
+{
+ TInt i, error;
+ TLex lex(aParamString);
+
+ // Initialise all the values
+ aAppUid.iUid = 0;
+ aViewUid.iUid = 0;
+ aCustomMessageUid.iUid = 0;
+ aCustomMessage.Zero();
+
+ // Extract the three Uids
+ for ( i=0 ; i<3 ; i++ )
+ {
+ lex.SkipSpace();
+ if ( !lex.Eos() )
+ {
+ TPtrC token(lex.NextToken());
+
+ TPtrC param;
+
+ // Extract the comma between parameters
+ if ( token.Right(1) == KComma )
+ {
+ param.Set( token.Left(token.Length()-1) );
+ }
+ else
+ {
+ param.Set( token );
+ }
+
+ // Extract the value taking into account whether its an hex
+ // value or not
+ TInt32 uid;
+ if ( param.Left(2) == KHEX )
+ {
+ TLex lex2(param.Mid(2));
+ TUint val;
+ error = lex2.Val( val, EHex );
+ uid = val;
+ }
+ else
+ {
+ uid = 0;
+ aAppName.Copy(param);
+ error = KErrNone;
+ }
+
+ if ( error != KErrNone )
+ {
+ return error;
+ }
+
+ switch( i )
+ {
+ case 0:
+ aAppUid.iUid = uid;
+ break;
+
+ case 1:
+ aViewUid.iUid = uid;
+ break;
+
+ case 2:
+ aCustomMessageUid.iUid = uid;
+ break;
+ }
+ }
+ }
+
+ // Maybe we don't have a custom message
+ lex.SkipSpace();
+ if ( !lex.Eos() )
+ {
+ // Extract the custom message
+ aCustomMessage.Copy( lex.Remainder().Left(aCustomMessage.MaxLength()) );
+ }
+
+ return KErrNone;
+}
+
+// --------------------------------------------------------
+// CUserEmulatorAppUi::ParseParams
+// Cuts one input string into one UId and one string
+// --------------------------------------------------------
+//
+TInt CUserEmulatorAppUi::ParseParams(const TDesC& aParamString, TUid& anAppUid, TDes& aArgument) const
+{
+ TInt error;
+ TLex lex(aParamString);
+
+ // Initialise all the values
+ anAppUid.iUid = 0;
+ aArgument.Zero();
+
+ // Extract the Uid
+ lex.SkipSpace();
+ if ( !lex.Eos() )
+ {
+ TPtrC token(lex.NextToken());
+
+ TPtrC param;
+
+ // Extract the comma between parameters
+ if ( token.Right(1) == KComma )
+ {
+ param.Set( token.Left(token.Length()-1) );
+ }
+ else
+ {
+ param.Set( token );
+ }
+
+ // Extract the value taking into account whether its an hex
+ // value or not
+ if ( param.Left(2) == KHEX )
+ {
+ TLex lex2(param.Mid(2));
+ TUint val;
+ error = lex2.Val(val, EHex);
+ anAppUid.iUid = val;
+ }
+ else
+ {
+ TLex lex2(param);
+ error = lex2.Val(anAppUid.iUid);
+ }
+
+ if ( error != KErrNone )
+ {
+ return error;
+ }
+ }
+
+ // Maybe we don't have a custom message
+ lex.SkipSpace();
+ if ( !lex.Eos() )
+ {
+ // Extract the custom message
+ aArgument.Copy(lex.Remainder().Left(aArgument.MaxLength()));
+ }
+
+ return KErrNone;
+}
+// ----------------------------------------------------------------------------------------
+// CUserEmulatorAppUi::ParseMultipleParams
+// Parses input string into two strings. Delimiter character is ',' . Input string
+// can have 4 params and 3 delimiter. (Eq: 23,27,43,21)
+// ----------------------------------------------------------------------------------------
+//
+TInt CUserEmulatorAppUi::ParseMultipleParams(const TDesC& aParamString, TDes& aArgument1, TDes& aArgument2) const
+{
+ // Initialise all the values
+ aArgument1.Zero();
+ aArgument2.Zero();
+
+ TInt pos1 = aParamString.Locate(',');
+ if(pos1==KErrNotFound || pos1+1>aParamString.Length() )
+ return KErrNotFound;
+ TInt pos = aParamString.Mid(pos1+1).Locate(',');
+ if (pos == KErrNotFound)
+ return KErrNotFound;
+ else
+ pos=pos+pos1+1;
+
+ // Extract the app name
+ aArgument1.Copy(aParamString.Left(pos));
+ CUtils::StripSpaces(aArgument1);
+
+ // Extract the argument
+ if(pos+1>aParamString.Length())
+ return KErrNotFound;
+ aArgument2.Copy(aParamString.Mid(pos+1));
+ CUtils::StripSpaces(aArgument2);
+
+ return KErrNone;
+}
+// -----------------------------------------------
+// CUserEmulatorAppUi::ParseParams
+// Parses input string into two strings
+// -----------------------------------------------
+//
+TInt CUserEmulatorAppUi::ParseParams(const TDesC& aParamString, TDes& aAppName, TDes& aArgument) const
+{
+ // Initialise all the values
+ aAppName.Zero();
+ aArgument.Zero();
+
+
+ TInt pos = aParamString.Locate(',');
+ if (pos == KErrNotFound)
+ return KErrNotFound;
+
+ // Extract the app name
+ aAppName.Copy(aParamString.Left(pos));
+ CUtils::StripSpaces(aAppName);
+
+ // Extract the argument
+ if(pos+1>aParamString.Length())
+ return KErrNotFound;
+ aArgument.Copy(aParamString.Mid(pos+1));
+ CUtils::StripSpaces(aArgument);
+
+ return KErrNone;
+}
+
+// -----------------------------------------------------
+// SetSystemInfoFlag
+// Set the system flag info
+// -----------------------------------------------------
+void CUserEmulatorAppUi::SetSystemInfoFlag(TBool aValue)
+{
+ iSystemInfo = aValue;
+}
+
+// -----------------------------------------------------
+// ProcessCmdParamsL
+// Processes command line arguments
+// -----------------------------------------------------
+void CUserEmulatorAppUi::ProcessCmdParamsL(const TDesC &aParams, TBool aProcessByFolderScanCompleted)
+ {
+ // Params' length has to be at least 2 chars long
+ if(aParams.Length()>0)
+ {
+ HBufC* buff = HBufC::NewLC(aParams.Length());
+ buff->Des().Copy(aParams);
+ // If first 2 chars of the argument are '/r' then run random test(s)
+ if(buff->Left(2).Compare(KSLASHR)==0)
+ {
+ // Process params beyond '/r'
+ if(buff->Length()>2)
+ {
+ TInt pos;
+ TBuf<1> tmp;
+ tmp.Copy(KComma);
+ buff->Des().Copy(buff->Right(buff->Length()-2));
+ buff->Des().TrimAll();
+ // Transforms string to our inner format (Commas instead of spaces)
+ while((pos=buff->Locate(' '))!=KErrNotFound)
+ {
+ buff->Des().Replace(pos,1,tmp);
+ }
+ iSettings->iRandomTestAppID.Copy(buff->Left(KBuffer256));
+ iSettings->iRandomTestAppIdStatus = ETrue;
+ }
+ else
+ { // Runs normal random test. There are no UIDs in argument
+ iSettings->iRandomTestAppIdStatus = EFalse;
+ }
+
+ TRAPD(err, StartRandomTestL());
+ }
+ else
+ {
+ // Scripts run
+ TInt pos;
+ TBuf8<256> UId;
+ TInt Count=0;
+ while((pos=buff->Locate(' '))!=KErrNotFound)
+ {
+ if(pos>255)
+ {
+ _LIT(KTooLongName,"One of the given script names is too long!");
+ CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
+ errorNote->ExecuteLD(KTooLongName);
+ CleanupStack::PopAndDestroy(buff);
+ return;
+ }
+ UId.Copy(buff->Left(pos));
+ buff->Des().Copy(buff->Mid(pos+1));
+ if(UId.Locate('.')==KErrNotFound)
+ UId.Append(KXMLEXT);
+ // Set index and check if UId is in the list of scripts
+ if(aProcessByFolderScanCompleted)
+ {
+ if(iScriptsView->GetScriptIndexAndMarkL(UId)!=-1)
+ Count++;
+ }
+ else
+ iCommandLineScriptsArray->AppendL(UId);
+
+ }
+
+ if(buff->Length()>0)
+ {
+ UId.Copy(*buff);
+ if(UId.Locate('.')==KErrNotFound)
+ UId.Append(KXMLEXT);
+
+ if(aProcessByFolderScanCompleted)
+ {
+ if(iScriptsView->GetScriptIndexAndMarkL(UId)!=-1)
+ Count++;
+ }
+ else
+ iCommandLineScriptsArray->AppendL(UId);
+ }
+
+ if(aProcessByFolderScanCompleted)
+ {
+ if(Count>0)
+ StartTestL();
+ else
+ {
+ _LIT(KNoScriptToRun,"Argument doesn't contain any valid script name!");
+ CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
+ errorNote->ExecuteLD(KNoScriptToRun);
+ }
+ }
+ }
+
+ CleanupStack::PopAndDestroy(buff);
+ }
+
+ }
+
+// -----------------------------------------------------
+// ProcessMessageL
+// Reads command line arguments
+// -----------------------------------------------------
+void CUserEmulatorAppUi::ProcessMessageL(TUid /*aUid*/, const TDesC8 &aParams)
+ {
+ if(aParams.Length()>=KBuffer256)
+ {
+ _LIT(KArgTooLong,"Command line argument is too long!");
+ CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
+ errorNote->ExecuteLD(KArgTooLong);
+ }
+ else
+ {
+ HBufC* buff = HBufC::NewLC(aParams.Length());
+ buff->Des().Copy(aParams);
+ // In this case ProcessMessage called later than list box initialisation
+ // so UE can process command-line params strait away. (Without storing params in an array
+ // and processing it later)
+ ProcessCmdParamsL(*buff,iIsFolderScanCompletedCalled);
+ CleanupStack::PopAndDestroy(buff);
+ }
+
+ }
+
+
+
+// -----------------------------------------------------
+// ProcessCommandParametersL
+// Reads command line arguments
+// -----------------------------------------------------
+TBool CUserEmulatorAppUi::ProcessCommandParametersL(TApaCommand aCommand,TFileName &aDocumentName,
+ const TDesC8 &aTail)
+ {
+ TInt Args;
+ TBuf<KBuffer256> buf;
+ TInt res=GetArgsL(buf, Args);
+
+ if(!res)
+ {
+ _LIT(KArgTooLong,"Command line argument is too long!");
+ CAknErrorNote* errorNote = new (ELeave) CAknErrorNote(ETrue);
+ errorNote->ExecuteLD(KArgTooLong);
+ }
+ else
+ {
+ if(Args>1)
+ ProcessCmdParamsL(buf,iIsFolderScanCompletedCalled);
+ else
+ ProcessCmdParamsL(aDocumentName,iIsFolderScanCompletedCalled);
+ }
+
+ return CEikAppUi::ProcessCommandParametersL( aCommand , aDocumentName, aTail);
+ }
+
+// -----------------------------------------------------------------
+// GetArgsL
+// Reads command line arguments in the original way (args process)
+// -----------------------------------------------------------------
+TBool CUserEmulatorAppUi::GetArgsL(TDes& aParam,TInt& aArgs)
+ {
+ TBool res=ETrue;
+
+ CCommandLineArguments* args=CCommandLineArguments::NewLC();
+ aArgs = args->Count();
+ for (TInt i=1; i<args->Count(); i++)
+ {
+ TPtrC argumentPrt(args->Arg(i));
+ if(aParam.Length() + argumentPrt.Length() >= KBuffer256)
+ {
+ res=EFalse;
+ break;
+ }
+ aParam.Append(argumentPrt);
+ aParam.Append(_L(" "));
+ }
+ if(aParam.Length()>0)
+ aParam.TrimAll();
+
+ CleanupStack::PopAndDestroy(1);
+
+ return res;
+ }
+
+// End of File