diff -r 000000000000 -r 7f656887cf89 core/src/command_wrappers.h --- /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 +#include +#include +#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__