--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/testexecute/testexecute.cpp Wed Jul 07 16:07:08 2010 +0100
@@ -0,0 +1,205 @@
+// testexecute.cpp
+//
+// Copyright (c) 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include <fshell/memoryaccesscmd.h>
+#include <fshell/descriptorutils.h>
+#include "proxyserver.h"
+#include <test/testexecutelogger.h>
+
+using namespace IoUtils;
+
+class CCmdTestExecute : public CMemoryAccessCommandBase, public MMessageHandler
+ {
+public:
+ static CCommandBase* NewLC();
+ ~CCmdTestExecute();
+private:
+ CCmdTestExecute();
+
+private: // From MMessageHandler
+ virtual TBool HandleMessageL(CProxySession* aSession, const RMessage2& aMessage);
+
+private: // From CCommandBase.
+ virtual const TDesC& Name() const;
+ virtual void DoRunL();
+ virtual void ArgumentsL(RCommandArgumentList& aArguments);
+ virtual void OptionsL(RCommandOptionList& aOptions);
+
+private: // From CActive
+ void RunL();
+ void DoCancel();
+
+ class CLogonCompleter : public CActive
+ {
+ public:
+ CLogonCompleter(CCmdTestExecute* aCommand) : CActive(CActive::EPriorityStandard), iCommand(aCommand)
+ {
+ CActiveScheduler::Add(this);
+ iCommand->iTefProc.Logon(iStatus);
+ SetActive();
+ }
+ void RunL() { iCommand->Complete(iStatus.Int()); }
+ void DoCancel() { iCommand->iTefProc.LogonCancel(iStatus); }
+ ~CLogonCompleter() { Cancel(); }
+
+ private:
+ CCmdTestExecute* iCommand;
+ };
+
+private:
+ CProxyServer* iProxy;
+ RTestExecuteLogServ iLogger;
+ RBuf8 iTempBuf;
+
+ TFileName2 iScriptFile;
+ TBool iIgnoredT, iIgnoredC;
+ HBufC* iIncludes;
+ HBufC* iExcludes;
+ TBool iDebug;
+ CLogonCompleter* iLogonCompleter;
+ RProcess iTefProc;
+ };
+
+
+EXE_BOILER_PLATE(CCmdTestExecute)
+
+CCommandBase* CCmdTestExecute::NewLC()
+ {
+ CCmdTestExecute* self = new(ELeave) CCmdTestExecute();
+ CleanupStack::PushL(self);
+ self->BaseConstructL();
+ return self;
+ }
+
+CCmdTestExecute::~CCmdTestExecute()
+ {
+ Cancel();
+ if (iProxy)
+ {
+ iProxy->Destroy();
+ }
+ iLogger.Close();
+ iTempBuf.Close();
+ delete iIncludes;
+ delete iExcludes;
+ delete iLogonCompleter;
+ iTefProc.Close();
+ }
+
+CCmdTestExecute::CCmdTestExecute()
+ : CMemoryAccessCommandBase(EManualComplete | ESharableIoSession)
+ {
+ iTefProc.SetHandle(0); // Don't default to the current process
+ }
+
+const TDesC& CCmdTestExecute::Name() const
+ {
+ _LIT(KName, "testexecute");
+ return KName;
+ }
+
+void CCmdTestExecute::ArgumentsL(RCommandArgumentList& aArguments)
+ {
+ aArguments.AppendFileNameL(iScriptFile, _L("script-file"));
+ }
+
+void CCmdTestExecute::OptionsL(RCommandOptionList& aOptions)
+ {
+ aOptions.AppendBoolL(iDebug, _L("debug"));
+ aOptions.AppendBoolL(iIgnoredT, _L("ignore"));
+ aOptions.AppendBoolL(iIgnoredC, _L("ignore2"));
+ aOptions.AppendStringL(iIncludes, _L("include"));
+ aOptions.AppendStringL(iExcludes, _L("exclude"));
+ }
+
+#define CTRL(x) ((x)-'a'+1)
+
+void CCmdTestExecute::DoRunL()
+ {
+ LoadMemoryAccessL();
+ iTempBuf.CreateL(1024);
+ User::LeaveIfError(Stdin().CaptureKey(CTRL('c'), 0, 0)); // So we can do cleanup
+ Stdin().WaitForKey(iStatus);
+ SetActive();
+
+
+ User::LeaveIfError(iLogger.Connect()); // Keep it open
+ iLogger.CreateLog(_L("\\logs\\testexecute\\fshelllovesyou"), RTestExecuteLogServ::ELogModeOverWrite); // The server won't actually stay open unless you call CreateLog!
+
+ // Set up our proxy
+ iProxy = CProxyServer::NewInSeparateThreadL(_L("TestExecuteLogEngine"), this);
+
+ if (iScriptFile.Length())
+ {
+ LtkUtils::RLtkBuf cmdLine;
+ CleanupClosePushL(cmdLine);
+ cmdLine.AppendL(iScriptFile);
+ if (iDebug) cmdLine.AppendL(_L(" -d"));
+ if (iIncludes) cmdLine.AppendFormatL(_L(" -tci %S"), iIncludes);
+ if (iExcludes) cmdLine.AppendFormatL(_L(" -tcx %S"), iExcludes);
+
+ LeaveIfErr(iTefProc.Create(_L("testexecute.exe"), cmdLine), _L("Couldn't create testexecute.exe %S"), &cmdLine);
+ iLogonCompleter = new(ELeave) CLogonCompleter(this);
+ iTefProc.Resume();
+ CleanupStack::PopAndDestroy(&cmdLine);
+ }
+ else
+ {
+ // Just do some tests
+ RTestExecuteLogServ newlogger;
+ LeaveIfErr(newlogger.Connect(), _L("Couldn't connect to proxied RTestExecuteLogServ"));
+
+ newlogger.CreateLog(_L("\\logs\\testexecute\\scriptyscripty"), RTestExecuteLogServ::ELogModeOverWrite);
+ newlogger.Write(_L("I AM A LOG"));
+ newlogger.Close();
+ }
+ }
+
+TBool CCmdTestExecute::HandleMessageL(CProxySession* /*aSession*/, const RMessage2& aMessage)
+ {
+ switch (aMessage.Function())
+ {
+ case RTestExecuteLogServ::EWriteLog:
+ {
+ aMessage.ReadL(0, iTempBuf);
+ Write(iTempBuf.Expand());
+ break;
+ }
+ default:
+ break;
+ }
+
+ return EFalse; // We allow everything to go through to the real TEF as well
+ }
+
+void CCmdTestExecute::RunL()
+ {
+ if (Stdin().KeyCode() == CTRL('c'))
+ {
+ Printf(_L("CTRL-C detected, cleaning up proxy server...\r\n"));
+ iProxy->Destroy();
+ iProxy = NULL;
+ Printf(_L("Exiting...\r\n"));
+ SetErrorReported(ETrue); // Supress complaints about the cancel
+ Complete(KErrCancel);
+ }
+ else
+ {
+ Stdin().WaitForKey(iStatus);
+ SetActive();
+ }
+ }
+
+void CCmdTestExecute::DoCancel()
+ {
+ Stdin().WaitForKeyCancel();
+ }