diff -r 000000000000 -r 72b543305e3a email/imap4mtm/imapsession/inc/cimapatomparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imap4mtm/imapsession/inc/cimapatomparser.h Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,142 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "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: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// CImapAtomParser header +// +// + +#ifndef __CIMAPATOMPARSER_H__ +#define __CIMAPATOMPARSER_H__ + +#include + +// forward declaration +class CImapAtom; + +/** +This class takes an IMAP response string and parses it into a tree of atoms. +Whenever an open bracket is detected, a subtree is formed until the matching +close bracket is found. +Quoted literals are treated as a single atom. +The parser will stop parsing when the a close bracket is found to match the very first open bracket. +The remaining unparsed data can be accessed via UnparsedData. +@internalComponent +@prototype +*/ +class CImapAtomParser : public CBase + { +public: + /** + States of reply parser + + @internalComponent + @prototype + */ + enum TParserState + { + EStateAtomWait, + EStateInAtom, + EStateLiteralLength, + EStateLiteralSkip, + EStateLiteralFetch, + EStateParseComplete, + }; + + ~CImapAtomParser(); + + static CImapAtomParser* NewL(TBool aAllowParseAtTopLevel, TInt aLogId); + + TBool ProcessLineL(const TDesC8& aLine); + void ProcessLiteralBlockL(const TDesC8& aLiteralBlock); + + // Get the root atom of the parse tree + CImapAtom* RootAtom(); + + const TPtrC8& UnparsedData(); + + HBufC8* DetachBuffer(); + +private: + CImapAtomParser(TBool aAllowParseAtTopLevel, TInt aLogId); + void ConstructL(); + + void BufferAppendL(const TChar aChar); + + void PushL(CImapAtom* aItem); + CImapAtom* PopL(); + + void AddAtomL(); +private: + /** + If you have a string such as "aaaa (bbbb (xx yy)) cccc". + With this set to ETrue, then the whole of "aaaa (bbbb (xx yy)) cccc" will be parsed. + But when set to EFalse, only "aaaa (bbbb (xx yy))" will be parsed as the last matching bracket has been found. + */ + TBool iAllowParseAtTopLevel; + + TParserState iParserState; + TBool iParserQuoted; + TBool iGotEscape; + TInt iLiteralLength; + TInt iLiteralSkip; + + /** + A heap buffer that stores all the data pointed to by the CImapAtom objects. + */ + HBufC8* iBuffer; + TInt iBufferSize; // can we use iBuffer->MaxLength() here? + + /** + The root atom. Owned. + */ + CImapAtom* iRootAtom; + /** + The atom that is currently being procesed. Not owned. + */ + CImapAtom* iAtom; + /** + Index of the first character of the atom currently being processed + */ + TInt iAtomStart; + + /** + Atom array owns ALL the atom objects EXCEPT the root atom. + */ + RPointerArray iAtomArray; + + /** + A stack that is used to navigate back up an atom tree as it is being built. + This arrat does not own the objects that it points at. + */ + RPointerArray iAtomStack; + /** + Whether the next atom object to be constructed should be added to the tree as + a child of the current atom (ETrue) or as its sibling (EFalse). + */ + TBool iNextIsChild; + + /** + Points at the unparsed portion of the last line to be processed. + This pointer descriptor is only valid while the descriptor it points at is valid + This pointer descriptor will only be set after ProcessLineL() has returned + EFalse to indicate that no more data is expected. + */ + TPtrC8 iUnparsedData; + + /** + Log id of owning session + */ + TInt iLogId; + }; + +#endif // __CIMAPATOMPARSER_H__