diff -r c061fa280d92 -r 9c58252c6740 commands/testexecute/testexecute.cpp --- /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 +#include +#include "proxyserver.h" +#include + +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(); + }