core/src/command_wrappers.h
changeset 0 7f656887cf89
child 78 b3ffff030d5c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/src/command_wrappers.h	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,242 @@
+// command_wrappers.h
+// 
+// Copyright (c) 2006 - 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
+//
+
+
+#ifndef __COMMAND_WRAPPERS_H__
+#define __COMMAND_WRAPPERS_H__
+
+#include <e32base.h>
+#include <fshell/iocli.h>
+#include <fshell/ioutils.h>
+#include "command_constructors.h"
+
+using namespace IoUtils;
+
+
+class MCommandObserver;
+
+
+class MCommand
+	{
+public:
+	virtual RIoReadHandle& CmndStdin() = 0;
+	virtual RIoWriteHandle& CmndStdout() = 0;
+	virtual RIoWriteHandle& CmndStderr() = 0;
+	virtual TInt CmndRun(const TDesC& aCommandLine, IoUtils::CEnvironment& aEnv, MCommandObserver& aObserver, RIoSession& aIoSession) = 0;
+	virtual void CmndForeground() = 0;
+	virtual void CmndBackground() = 0;
+	virtual void CmndKill() = 0;
+	virtual TInt CmndSuspend() = 0;
+	virtual TInt CmndResume() = 0;
+	virtual void CmndRelease() = 0;
+	virtual TExitType CmndExitType() const = 0;
+	virtual TExitCategoryName CmndExitCategory() const = 0;
+	virtual const TDesC& CmndName() const = 0;
+	virtual TInt CmndReattachStdin(RIoEndPoint& aStdinEndPoint) = 0;
+	virtual TInt CmndReattachStdout(RIoEndPoint& aStdoutEndPoint) = 0;
+	virtual TInt CmndReattachStderr(RIoEndPoint& aStderrEndPoint) = 0;
+	virtual TBool CmndIsDisownable() const = 0;
+	virtual void CmndDisown() = 0;
+	};
+
+
+class MCommandObserver
+	{
+public:
+	virtual void HandleCommandComplete(MCommand& aCommand, TInt aError) = 0;
+	};
+
+
+class CCommandWrapperBase : public CBase, public MCommand
+	{
+protected:
+	CCommandWrapperBase();
+	~CCommandWrapperBase();
+	void BaseConstructL(const TDesC& aName);
+protected: // From MCommand.
+	virtual RIoReadHandle& CmndStdin();
+	virtual RIoWriteHandle& CmndStdout();
+	virtual RIoWriteHandle& CmndStderr();
+	virtual const TDesC& CmndName() const;
+	virtual TInt CmndReattachStdin(RIoEndPoint& aStdinEndPoint);
+	virtual TInt CmndReattachStdout(RIoEndPoint& aStdoutEndPoint);
+	virtual TInt CmndReattachStderr(RIoEndPoint& aStderrEndPoint);
+	virtual TBool CmndIsDisownable() const;
+	virtual void CmndDisown();
+private: // From MCommand.
+	virtual void CmndRelease();
+private:
+	HBufC* iName;	///< This is used by concrete classes as they see fit.
+	RIoReadHandle iStdin;
+	RIoWriteHandle iStdout;
+	RIoWriteHandle iStderr;
+	};
+
+
+class CThreadCommand : public CCommandWrapperBase
+	{
+public:
+	enum TFlags
+		{
+		EUpdateEnvironment = 0x00000001,
+		ESharedHeap = 0x00000002, // Any command that accesses gShell must have this set
+		};
+public:
+	static CThreadCommand* NewL(const TDesC& aName, TCommandConstructor aCommandConstructor, TUint aFlags);
+	~CThreadCommand();
+private:
+	CThreadCommand(TCommandConstructor aCommandConstructor, TUint aFlags);
+	void ConstructL(const TDesC& aName);
+private: // From MCommand.
+	virtual TInt CmndRun(const TDesC& aCommandLine, IoUtils::CEnvironment& aEnv, MCommandObserver& aObserver, RIoSession& aIoSession);
+	virtual void CmndForeground();
+	virtual void CmndBackground();
+	virtual void CmndKill();
+	virtual TInt CmndSuspend();
+	virtual TInt CmndResume();
+	virtual TExitType CmndExitType() const;
+	virtual TExitCategoryName CmndExitCategory() const;
+public:
+	class TArgs
+		{
+	public:
+		TArgs(TUint aFlags, CEnvironment& aEnv, TCommandConstructor aCommandConstructor, const TDesC& aCommandLine, TRequestStatus& aParentStatus);
+	public:
+		TUint iFlags;
+		CEnvironment& iEnv;
+		TCommandConstructor iCommandConstructor;
+		const TPtrC iCommandLine;
+		TRequestStatus* iParentStatus;
+		TThreadId iParentThreadId;
+		};
+	class CThreadWatcher : public CActive
+		{
+	public:
+		static CThreadWatcher* NewL();
+		~CThreadWatcher();
+		TInt Logon(CThreadCommand& aCommand, RThread& aThread, MCommandObserver& aObserver);
+		void SetActive();
+	private:
+		CThreadWatcher();
+	private: // From CActive.
+		virtual void RunL();
+		virtual void DoCancel();
+	private:
+		CThreadCommand* iCommand;
+		RThread* iThread;
+		MCommandObserver* iObserver;
+		};
+private:
+	TUint iFlags;
+	TCommandConstructor iCommandConstructor;
+	MCommandObserver* iObserver;
+	TArgs* iArgs;
+	RThread iThread;
+	CThreadWatcher* iWatcher;
+	};
+
+
+class CProcessCommand : public CCommandWrapperBase
+	{
+public:
+	static CProcessCommand* NewL(const TDesC& aExeName);
+	static CProcessCommand* NewL(const TDesC& aExeName, RProcess& aProcess);
+	~CProcessCommand();
+protected:
+	CProcessCommand();
+	void ConstructL(const TDesC& aExeName, RProcess* aProcess = NULL);
+	virtual void CreateProcessL(const TDesC& aCommandLine, CEnvironment& aEnv);
+private:
+	void CmndRunL(const TDesC& aCommandLine, IoUtils::CEnvironment& aEnv, MCommandObserver& aObserver);
+protected: // From MCommand.
+	virtual TInt CmndRun(const TDesC& aCommandLine, IoUtils::CEnvironment& aEnv, MCommandObserver& aObserver, RIoSession& aIoSession);
+	virtual void CmndForeground();
+	virtual void CmndBackground();
+	virtual void CmndKill();
+	virtual TInt CmndSuspend();
+	virtual TInt CmndResume();
+	virtual TExitType CmndExitType() const;
+	virtual TExitCategoryName CmndExitCategory() const;
+	virtual TBool CmndIsDisownable() const;
+	virtual void CmndDisown();
+public:
+	class CProcessWatcher : public CActive
+		{
+	public:
+		static CProcessWatcher* NewL();
+		~CProcessWatcher();
+		TInt Logon(CProcessCommand& aCommand, RProcess& aProcess, MCommandObserver& aObserver);
+	private:
+		CProcessWatcher();
+	private: // From CActive.
+		virtual void RunL();
+		virtual void DoCancel();
+	private:
+		CProcessCommand* iCommand;
+		RProcess* iProcess;
+		MCommandObserver* iObserver;
+		};
+protected:
+	MCommandObserver* iObserver;
+	RProcess iProcess;
+	CProcessWatcher* iWatcher;
+	};
+
+
+class CPipsCommand : public CProcessCommand
+	{
+public:
+	static CPipsCommand* NewL(const TDesC& aExeName);
+	CPipsCommand();
+	~CPipsCommand();
+private: // From MCommand.
+	virtual TInt CmndRun(const TDesC& aCommandLine, IoUtils::CEnvironment& aEnv, MCommandObserver& aObserver, RIoSession& aIoSession);
+	virtual void CmndKill();
+private: // From CProcessCommand.
+	virtual void CreateProcessL(const TDesC& aCommandLine, IoUtils::CEnvironment& aEnv);
+private:
+	TBool iUsingPipsRun;
+	TInt iPipsRunChildProcessId;
+	};
+
+
+class CAliasCommand : public CCommandWrapperBase, public MCommandObserver
+	{
+public:
+	static CAliasCommand* NewL(MCommand& aAliasedCommand, const TDesC* aAdditionalArguments, const TDesC* aReplacementArguments);
+	~CAliasCommand();
+private:
+	CAliasCommand(MCommand& aAliasedCommand);
+	void ConstructL(const TDesC* aAdditionalArguments, const TDesC* aReplacementArguments);
+private: // From MCommand.
+	RIoReadHandle& CmndStdin();
+	RIoWriteHandle& CmndStdout();
+	RIoWriteHandle& CmndStderr();
+	TInt CmndRun(const TDesC& aCommandLine, IoUtils::CEnvironment& aEnv, MCommandObserver& aObserver, RIoSession& aIoSession);
+	void CmndForeground();
+	void CmndBackground();
+	void CmndKill();
+	TInt CmndSuspend();
+	TInt CmndResume();
+	TExitType CmndExitType() const;
+	TExitCategoryName CmndExitCategory() const;
+private: // From MCommandObserver.
+	virtual void HandleCommandComplete(MCommand& aCommand, TInt aError);
+private:
+	MCommand& iAliasedCommand;
+	HBufC* iAdditionalArguments;
+	HBufC* iReplacementArguments;
+	MCommandObserver* iCommandObserver;
+	};
+
+
+#endif // __COMMAND_WRAPPERS_H__