email/imap4mtm/imapsession/inc/cimapatomparser.h
changeset 0 72b543305e3a
child 65 d8ac8e5e4721
--- /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 <e32base.h>
+
+// 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<CImapAtom> 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<CImapAtom> 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__