diff -r 000000000000 -r 7f656887cf89 core/src/parser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/src/parser.h Wed Jun 23 15:52:26 2010 +0100 @@ -0,0 +1,103 @@ +// parser.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 __PARSER_H__ +#define __PARSER_H__ + +#include +#include "error.h" +#include "pipe_line.h" + +class CLexer; +class CParser; + + +class MParserObserver + { +public: + virtual void HandleParserComplete(CParser& aParser, const TError& aError) = 0; + virtual void AboutToExecuteLine(const TDesC& aOrignalLine, const TDesC& aExpandedLine); + virtual void LineReturned(TInt aError); + }; + + +class CParser : public CBase, public MPipeLineObserver + { +public: + enum TMode + { + ENormal = 0x00000000, + EKeepGoing = 0x00000001, + EDebug = 0x00000002, + EExportLineNumbers = 0x00000004 + }; +public: + static CParser* NewL(TUint aMode, const TDesC& aDes, RIoSession& aIoSession, RIoReadHandle& aStdin, RIoWriteHandle& aStdout, RIoWriteHandle& aStderr, IoUtils::CEnvironment& aEnv, CCommandFactory& aFactory, MParserObserver* aObserver); + ~CParser(); + void Start(); + void Start(TBool& aIsForeground); + void Kill(); + TInt Suspend(); + TInt Resume(); + TInt BringToForeground(); + void SendToBackground(); + TInt Reattach(RIoEndPoint& aStdinEndPoint, RIoEndPoint& aStdoutEndPoint, RIoEndPoint& aStderrEndPoint); + TBool IsDisownable() const; + void Disown(); +private: + enum TCondition + { + ENone, + EAnd, + EOr, + EAndOr + }; +private: + CParser(TUint aMode, const TDesC& aDes, RIoSession& aIoSession, RIoReadHandle& aStdin, RIoWriteHandle& aStdout, RIoWriteHandle& aStderr, IoUtils::CEnvironment& aEnv, CCommandFactory& aFactory, MParserObserver* aObserver); + void ConstructL(); + void CreateNextPipeLine(TBool* aIsForeground); + void CreateNextPipeLineL(TBool* aIsForeground); + void FindNextPipeLineL(TPtrC& aData, TCondition& aCondition, TBool& aReachedLineEnd); + HBufC* ExpandVariablesLC(const TDesC& aData); + TInt SkipLineRemainder(); + void SkipToEnd(); + static TInt CompletionCallBack(TAny* aSelf); + static TInt NextCallBack(TAny* aSelf); + static TInt ExitCallBack(TAny* aSelf); +private: // From MPipeLineObserver. + virtual void HandlePipeLineComplete(CPipeLine& aPipeLine, const TError& aError); +private: + const TUint iMode; + const TPtrC iData; + TCondition iCondition; + RIoSession& iIoSession; + RIoReadHandle iStdin; + RIoWriteHandle iStdout; + RIoWriteHandle iStderr; + IoUtils::CEnvironment& iEnv; + CCommandFactory& iFactory; + CLexer* iLexer1; ///< Used to find a "pipe-line's worth" of data in iData. + CLexer* iLexer2; ///< Used to parse a particular pipe-line (after its variables have been expanded). + MParserObserver* iObserver; + CPipeLine* iForegroundPipeLine; + RPointerArray iBackgroundPipeLines; + TError iCompletionError; + CAsyncCallBack* iCompletionCallBack; + CAsyncCallBack* iNextPipeLineCallBack; + CAsyncCallBack* iExitCallBack; + TBool iAbort; + TInt iNextLineNumber; + TBool iOwnsIoHandles; + }; + + +#endif // __PARSER_H__