email/imap4mtm/imapsession/inc/cimapbodystructure.h
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imap4mtm/imapsession/inc/cimapbodystructure.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,285 @@
+// 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 __CIMAPBODYSTRUCTURE_H__
+#define __CIMAPBODYSTRUCTURE_H__
+
+#include <e32base.h>
+
+class CImapEnvelope;
+
+/**
+Represents an IMAP body structure as a tree.
+
+The iEmbeddedBodyStructureList allows body structure to contain embedded body structures, 
+as is required for multi-part and message/rfc822 type bodystructures.
+
+iEmbeddedBodyStructureList owns the bodystructure objects it points to, and a CImapFetchResponse
+object owns the root CImapBodyStructure that represents the entire body structure tree.
+
+Consequentl, destroying the root CImapBodyStructure owned by CImapFetchResponse will cause the entire
+tree of CImapBodyStructure objects to be destroyed.
+
+
+This class provides a set of TPtrC8 items each of which will be set to point at the correct 
+part of the incoming message during parsing. 
+
+This class does not own the data that it points to.  So the TPtrC8 items will only be valid
+while the HBufC8 buffer they are pointing to is valid.  
+
+Consequently, this class should be used in conjunction with a valid HBufC8 object.
+This object is owned by CImapFetchResponse, which also owns the root CImapBodyStructure object.
+
+The following is a visual guide to bodystructures.
+A formal definition of bodystructure can be found in Section 9 of RFC 3501.
+The second line of each category below indicates "extension data".
+
+bodyTypeMpart
+	((-body-)(-body-)(-body-) "MIXED" 
+	(n1 v1 n2 v2) (dispname (n1 v1 n2 v2)) extLang extLocation xExt1...)
+	
+bodyTypeText: all TEXT types
+	("TEXT" "PLAIN" (n1 v1 n2 v2) id "description" "encoding" "size" lines 
+	extMD5 (dispname (n1 v1 n2 v2)) extLang extLocation xExt1...)
+	
+bodyTypeMsg: only MESSAGE/RFC822
+	("MESSAGE" "RFC822" (n1 v1 n2 v2) "id" "description" "encoding" "size" (-envelope-) (-body-) lines 
+	extMD5 (dispname (n1 v1 n2 v2)) extLang extLocation xExt1...)
+	
+bodyTypeBasic: all other forms of bodyType1part
+	("OTHER" "SUB" (n1 v1 n2 v2) "id" "description" "encoding" "size" 
+	extMD5 (dispname (n1 v1 n2 v2)) extLang extLocation xExt1...)
+
+----------------
+envelope
+	(date subject from (sender1 sender2) (replyTo1 replyTo2) (to1 to2) (cc1 cc2) (bcc1 bcc2) inReplyTo MessageId)
+
+@internalTechnology
+@prototype
+*/
+class CImapBodyStructure : public CBase
+	{
+public:
+	
+	/**
+	The type of this bodystructure.
+	RFC3501 defines four bodystructure types.
+	For each type, a different set of CImapBodyStructure fields will be valid.
+	*/
+	enum TBodyStructureType 
+		{
+		/**
+		This is the default type for a bodystructure.  It is the type given to all 
+		bodystructures that are not rfc822, text or multipart.  Typically, this will
+		be used for attachments.
+		It has no embedded bodystructures, no envelope and BodyLines value.  All other fields are valid.
+		In RFC3501, this is "body-type-basic"
+		*/
+		ETypeBasic,
+		/**
+		A message with MIME type and subtype "MESSAGE/RFC822", representing a MIME 
+		header for an embedded message.
+		All CImapBodyStructure fields are valid, including the envelope.
+		There will be exactly one embedded bodystructure.
+		In RFC3501, this is "body-type-msg"
+		*/
+		ETypeMessageRfc822,
+		/**
+		This is a message whose MIME type is "TEXT" together with and MIME subtype.
+		This represents a text message.
+		It has no embedded bodystructures and no envelope.  All other fields are valid.
+		In RFC3501, this is "body-type-text"
+		*/
+		ETypeText,
+		/** 
+		This is a multipart message, with one or more embedded bodystructures.
+		It has no envelope, and none of the following fields are valid:
+			> BodyId
+			> BodyDescription
+			> BodyEncoding
+			> BodySizeOctets
+			> BodyLines
+		All other fields are valid
+		In RFC3501, this is "body-type-mpart"
+		*/
+		ETypeMultipart
+		};
+
+	/**
+	Maps an attribute name to a value
+	@internalTechnology
+	@prototype
+	*/
+	struct TAttributeValuePair
+		{
+		TPtrC8 iAttribute;
+		TPtrC8 iValue;
+		};
+	
+	/**
+	An array of pointers to CImapBodyStructure structure objects.
+	*/
+	typedef RPointerArray<CImapBodyStructure> RBodyStructureList;
+	/**
+	An array of attribute-value pairs.
+	*/
+	typedef RArray<TAttributeValuePair> RAttributeValuePairList;
+	/**
+	An array of 8-bit pointer-descriptors.
+	*/
+	typedef RArray<TPtrC8> RArrayTPtrC8;
+
+	IMPORT_C TBodyStructureType BodyStructureType() const;
+	IMPORT_C const RBodyStructureList EmbeddedBodyStructureList() const;
+	
+	IMPORT_C const TDesC8& Type() const;
+	IMPORT_C const TDesC8& SubType() const;
+		
+	IMPORT_C const RAttributeValuePairList& ParameterList() const;
+	
+	IMPORT_C const TDesC8& BodyId() const;
+	IMPORT_C const TDesC8& BodyDescription() const;
+	IMPORT_C const TDesC8& BodyEncoding() const;
+	IMPORT_C const TDesC8& BodySizeOctets() const;
+	IMPORT_C const TDesC8& BodyLines() const;
+	
+	IMPORT_C const TDesC8& ExtMD5() const;
+	IMPORT_C const TDesC8& ExtDispositionName() const;
+	IMPORT_C const RAttributeValuePairList& ExtDispositionParameterList() const;
+	IMPORT_C const RArrayTPtrC8& ExtLanguageList() const;
+	IMPORT_C const TDesC8& ExtLocation() const;
+
+	IMPORT_C CImapEnvelope& GetRfc822EnvelopeStructureL();
+
+	static CImapBodyStructure* NewL();
+	~CImapBodyStructure();
+	
+	void SetBodyStructureType(TBodyStructureType aBodyStructureType);
+	void AppendEmbeddedBodyStructureL(const CImapBodyStructure& aBodyStructure);
+	
+	void SetType(const TDesC8& aType);
+	void SetSubType(const TDesC8& aSubType);
+		
+	void AppendParameterListL(const TAttributeValuePair& aAttributeValuePair);
+	
+	void SetBodyId(const TDesC8& aBodyId);
+	void SetBodyDescription(const TDesC8& aBodyDescription);
+	void SetBodyEncoding(const TDesC8& aBodyEncoding);
+	void SetBodySizeOctets(const TDesC8& aBodySizeOctets);
+	void SetBodyLines(const TDesC8& aBodyLines);
+	
+	void SetExtMD5(const TDesC8& aExtMD5);
+	void SetExtDispositionName(const TDesC8& aExtDispositionName);
+	void AppendExtDispositionParameterListL(const TAttributeValuePair& aAttributeValuePair);
+	void AppendExtLanguageListL(const TDesC8& aExtLanguage);
+	void SetExtLocation(const TDesC8& aExtLocation);
+	
+private:
+	CImapBodyStructure();
+	
+private:
+	/**
+	The type of this bodystructure.  
+	It can be a Basic, Text, Message/Rfc822 or Multipart bodystructure.
+	Each type is defined in section 9 of RFC3501.
+	*/
+	TBodyStructureType iBodyStructureType;
+	
+	/**
+	For Multipart bodystructures, pointers to CBodyStructure objects representing each of the sub-parts is stored in the array
+	For MESSAGE/RFC822, a single pointer to a single CBodyStructure object representing the embedded sub-part is store in the array.
+	For Basic and Text bodystructures, this array will be empty.
+	This pointer array takes ownership of the objects it points to.
+	*/
+	RBodyStructureList iEmbeddedBodyStructureList;
+	
+	/**
+	The MIME type for this message part
+	When body-type-mpart detected, this is set to "MULTIPART"
+	*/
+	TPtrC8 iType;
+	/**
+	The MIME sub-type for this message part
+	*/
+	TPtrC8 iSubType;
+	
+	/**
+	A list of parameter-value pairs.
+	Corresponds to a top level "body-fld-param" (i.e. not "body-fld-dsp" which is stored in iExtDispositionParameterList)
+	*/
+	RAttributeValuePairList iParameterList;
+	
+	// single-part data
+	/**
+	Corresponds to "body-fld-id" of RFC3501
+	*/
+	TPtrC8 iBodyId;
+	/**
+	Corresponds to "body-fld-desc" of RFC3501
+	*/
+	TPtrC8 iBodyDescription;
+	/**
+	Corresponds to "body-fld-enc" of RFC3501
+	*/
+	TPtrC8 iBodyEncoding;
+	/**
+	Corresponds to "body-fld-octets" of RFC3501
+	*/
+	TPtrC8 iBodySizeOctets;
+	
+	/**
+	Corresponds to "body-fld-lines" of RFC3501
+	*/
+	TPtrC8 iBodyLines;
+	
+	// extension data
+	/**
+	Corresponds to "body-fld-md5" of RFC3501
+	NOTE: This extension data item only applies to single-part structures
+	*/
+	TPtrC8 iExtMD5;
+	/**
+	A list of parameter-value pairs.
+	Corresponds to the "string" part of "body-fld-dsp" of RFC3501
+	*/
+	TPtrC8 iExtDispositionName;
+	/**
+	
+	Corresponds to the "body-fld-param" in "body-fld-dsp" of RFC3501
+	*/
+	RAttributeValuePairList iExtDispositionParameterList;
+	/**
+	A list of strings each representing a language
+	Corresponds to "body-fld-lang" of RFC3501
+	*/
+	RArrayTPtrC8 iExtLanguageList;
+	/**
+	Corresponds to "body-fld-loc" of RFC3501
+	*/
+	TPtrC8 iExtLocation;
+	
+	// Note "future expansion" extension data is ignored safely by the parser.
+	
+private:
+	/**
+	If the bodystructure has an envelope (i.e. it is of type MESSAGE/RFC822)
+	then a CImapEnvelope will be required to point to envelope items.
+	GetRfc822EnvelopeStructureL() will construct an object of this type when first called.
+	It is likely that CImapEnvelope will later be used to populate CImMimeHeader - which will cause string copies to occur.
+	*/
+	CImapEnvelope* iRfc822EnvelopeStructure;
+	};
+
+#endif // __CIMAPBODYSTRUCTURE_H__