commands/testexecute/testexecute.cpp
changeset 5 9c58252c6740
--- /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();
+	}