email/imap4mtm/imapsession/inc/cimapfetchbodystructurebase.h
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imapsession/inc/cimapfetchbodystructurebase.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,127 @@
+// Copyright (c) 2006-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:
+//
+
+#ifndef __CIMAPFETCHBODYSTRUCTUREBASE_H__
+#define __CIMAPFETCHBODYSTRUCTUREBASE_H__
+
+#include "cimapcommand.h"
+#include "tmessageflaginfo.h"
+
+class CImapFetchResponse;
+class MOutputStream;
+class CImapBodyStructureBuilder;
+class CImapRfc822HeaderFieldsParser;
+
+/**
+@internalTechnology
+@prototype
+*/
+class CImapFetchBodyStructureBase : public CImapCommand
+	{
+private:
+	enum TState
+		{		
+		/**
+		Looking for the next data item(s), in the current line.
+		This state can transition to EStateBodyStructureLiteral or EStateHeaderFieldsLiteral if 
+		either of these data items are found, or EStateComplete if no data items are found.
+		*/
+		EStateDataItemLine,
+		/**
+		Waiting for a literal that will be delivered to the body structure parser.
+		This state will ALWAYS transition to EStateBodyStructureLine, so that the parser can 
+		search for the closing BODYSTRUCTURE bracket which is always delivered on a line.
+		*/
+		EStateBodyStructureLiteral,
+		/**
+		Waiting for a line that will be delivered to the body structure parser.
+		This state can transition to EStateBodyStructureLiteral or EStateDataItemLine
+		depending on whether the parser requests more data (which will be literal).
+		*/
+		EStateBodyStructureLine,
+		/**
+		Waiting for a literal that will be delivered to the header fields parser.
+		This state will ALWAYS transition to EStateRequestDataItemLine, as header fields are always 
+		delivered as a block of literal data followed by a return to the data items line.
+		*/
+		EStateHeaderFieldsLiteral,
+		/**
+		This state occurs after EStateHeaderFieldsLiteral.  It means that a data item line
+		is expected, but it has yet to be fetched from the input stream.
+		This differs to EStateDataItemLine, which means that the current block of data
+		still has data items in it.
+		*/
+		EStateFetchNextDataItemLine,
+		/**
+		Either all data has been parsed, or the data was not recognised.
+		*/
+		EStateComplete,
+		};
+
+public:
+	~CImapFetchBodyStructureBase();
+
+protected:
+	CImapFetchBodyStructureBase(CImapFolderInfo* aSelectedFolderInfo, TInt aLogId, const TDesC8& aHeaderFields);
+
+	// From CImapCommand
+	TParseBlockResult DoParseBlockL(const TDesC8& aData);
+
+	TBool UidDataItemFoundInResponse();
+
+private:
+	// From CImapCommand
+	void SendMessageL(TInt aTagId, MOutputStream& aStream);	
+
+	TParseBlockResult ProcessStartL();
+	TParseBlockResult ProcessDataItemsL();
+	void ProcessFlagsL();
+	void ProcessUidL();
+	void ProcessBodyStructureL();
+	void ProcessBodyStructureL(const TDesC8& aData);
+	void ProcessHeaderFieldsL();
+	void ProcessHeaderFieldsL(const TDesC8& aData);
+	TBool GetAndStoreNextPart();
+
+protected:
+	const TDesC8* iSequenceSet;
+	CImapFetchResponse* iFetchResponse;
+
+private:
+	/**
+	Whether the UID data item was found in the untagged response.
+	If the UID data item was NOT found then the response is an unsolicited FETCH response caused
+	by a server event (e.g. a user deleting some messages from some other client such as a PC),
+	rather than a direct response to our UID FETCH command - which would have included the UID DATA item.
+	
+	Non-UID FETCH responses should not be returned as the result of a FetchBodystructure request.
+	*/
+	TBool iUidDataItemFoundInResponse;
+	/**
+	Stores the result of parsing the FLAGS data item and the UID data item.
+	If both UID and FLAGS data items are included in the response, then the data in this
+	object will be copied to the equivalent object in iFetchResponse.
+	If only the FLAGS data item included in the response, then this is an unsolicited FETCH response
+	and the data is discarded (so as not to corrupt the data in iFetchResponse)
+	*/
+	TMessageFlagInfo iMessageFlagInfo;
+	TPtrC8 iCurrentPart;
+	const TDesC8& iHeaderFields;
+	TState iState;
+	CImapBodyStructureBuilder* iBodyStructureBuilder;
+	CImapRfc822HeaderFieldsParser* iHeaderFieldsParser;
+	};
+
+#endif // __CIMAPFETCHBODYSTRUCTUREBASE_H__