email/email/smtp/inc/Local_imcvrecv.h
branchSymbian2
changeset 1 8758140453c0
child 6 c108117318cb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/email/smtp/inc/Local_imcvrecv.h	Thu Jan 21 12:53:44 2010 +0000
@@ -0,0 +1,471 @@
+/**
+* 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 the License "Symbian Foundation License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+
+
+
+/**
+ @file
+*/
+
+
+#ifndef __LOCAL_IMCVRECV_H__
+#define __LOCAL_IMCVRECV_H__
+
+// epoc include
+#include <s32mem.h>
+#include <badesca.h> // required for CBufSeg
+#include <msvstd.h>
+#include <msventry.h>
+#include <msvstore.h>
+#include <msvuids.h>
+#include <msvids.h>
+#include <miutatch.h>
+#include <miutlog.h>
+#include <imcvcodc.h>
+#include <imcvtext.h>
+
+// Forward Declaration
+class CImHeader;
+class CRichText;
+class CLocalMimeParser;
+class CLocalImRecvConvert;
+class RFs;
+class TImConvert;
+class TImAttachmentFile;
+class CImcvUtils;
+class CMsvBodyText;
+
+const TInt KHeaderBufferLength = 100;
+
+// Max filename length
+const TInt MaxMimeParameterValueLength = 256;
+// Likely maximum size of an encoded parameter value decoding to a length of 
+// MaxMimeParameterValueLength. In quoted printable usually 3 encoded characters
+// per decoded character. 60 characters is given to allow for delimiters and
+// charset information.
+const TInt KMimeEncodedParameterSize = MaxMimeParameterValueLength * 3 + 60;
+
+const TInt KConversionRemainderLength=20;
+
+//boundary stuff
+const TInt KBoundaryNotFound	=0;
+const TInt KBoundaryFound		=1;
+const TInt KBoundaryError		=2;
+
+
+/**
+Stores the details about a message nneded in the Message entry.
+*/
+struct TParentDetails
+	{
+	TInt				iSize;
+	TBool				iAttachment;
+	TBool				iMHTML;
+	TImEmailFolderType  iFolder;	// Only interested in the Related type
+	};
+
+
+/**
+@internalComponent
+@released
+*/
+class CLocalRfc822Token : public CBase
+	{
+public:
+	enum THeaderPart { EUnknown, ENotFinished, EFrom, EReplyTo, ETo, ECc, EBcc, ESubject, EDate, EMessageId, EPriority, EImportance, EReturnReceiptTo, EEndOfHeader };
+	THeaderPart iHeaderPart;
+	TBool iLastToken;
+	TBool iFirstLine;
+	TBool i822FieldsExist;
+
+	/*IMPORT_C*/ static CLocalRfc822Token* NewLC();
+	/*IMPORT_C*/ void Reset();
+	inline HBufC8* OutputLine();
+	/*IMPORT_C*/ virtual void ParseNextLineL( const TDesC8& aSourceLine );
+	/*IMPORT_C*/ ~CLocalRfc822Token();
+	inline TBool LastToken();
+
+	inline void SetImRecvConvert( CLocalImRecvConvert* );
+private:
+	TBool MatchAndRemoveL( const TDesC8& );
+	TBool PriorityAndReceiptsMatchAndRemoveL(THeaderPart aPriority);
+
+	CLocalRfc822Token();
+	void ConstructL();
+
+private:
+	TBuf8<KMaxIMailHeaderReadLineLength+1> iInputLine;
+	TBuf8<KMaxIMailHeaderReadLineLength+1> iBufferedInput;
+	HBufC8* iOutputLine;
+	CLocalImRecvConvert* iImRecvConvert;
+	};
+
+
+/**
+@internalTechnology
+@released
+*/
+class CLocalImRecvConvert : public CBase
+	{
+friend class CLocalMimeParser;
+public:
+	/*IMPORT_C*/ static CLocalImRecvConvert* NewLC( RFs& anFs, CMsvServerEntry* aServerEntry, 
+												TUid aMsgType, TMsvId aEmailServiceId);
+	/*IMPORT_C*/ static CLocalImRecvConvert* NewL( RFs& anFs, CMsvServerEntry* aServerEntry,
+												TUid aMsgType, TMsvId aEmailServiceId);
+	/*IMPORT_C*/ ~CLocalImRecvConvert();
+
+	/*IMPORT_C*/ void ResetL();
+	/*IMPORT_C*/ void ResetForHeadersL();
+
+	inline void SetAttachmentPathL(const TDesC& aFullPath);	// attachment path, if not set then IMCV will reject attachments
+	inline void SetMsvId(TMsvId aId);
+
+	/*IMPORT_C*/ virtual TInt ParseNextField(const TDesC8& aSourceLine);
+	/*IMPORT_C*/ void MessageCompleteL();
+	/*IMPORT_C*/ void MessageCompleteL(TMsvEmailEntry aEmailEntry);
+	/*IMPORT_C*/ void MessageCompleteL(TBool aPartialDownload);
+	/*IMPORT_C*/ TInt DeletedAttachmentSize();
+	/*IMPORT_C*/ void WritePartialFooterL(TInt aAmountLeft);
+	/*IMPORT_C*/ TMsvEmailEntry MessageEntryDetailsL();
+
+	enum TValidEntryType {EUnknownEntry, EMessageEntry, EFolderEntry, EAttachmentEntry, ETextEntry, EHtmlEntry};
+	enum TImEntryStreamSaveSettings
+		{
+		KStoreBodyText					= 0x00000001,
+		KStore822Header					= KStoreBodyText << 1,		//0x00000002
+		KStoreMIMEHeader				= KStore822Header << 1,	//0x00000004
+		};
+
+	inline const TTime Date() const;	// return RFC822 date
+	inline const TMsvPriority Priority() const;
+	inline void SaveAllAttachments(TBool aSave);
+	inline const TInt ReceiveError() const;
+	inline CMsvServerEntry& ServerEntry();
+	inline const CImHeader& Header() const;
+	inline const TBool ValidCompleteHeader() const;
+	//virtual inline const TMsvId EntryId() const;	
+	virtual TMsvId EntryId();	
+	inline TBool NotFinishedRfc822Header();
+	inline CImConvertCharconv& CharacterConverter();
+
+protected:
+	CLocalImRecvConvert(RFs& anFs, CMsvServerEntry* aServerEntry, 
+							TUid aMsgType, TMsvId aEmailServiceId);
+	void ConstructL(RFs& anFs);
+
+	void ParseNextLineL(const TDesC8& aSourceLine);
+	void ParseBodyLineL(const TDesC8& aSourceLine);
+	void ParseMimeLineL(const TDesC8& aSourceLine);
+	void EndOfHeaderProcessingL();
+	virtual void  EndOfHeaderMIMEProcessingL();
+	TBool CreateNonMIMEFolderEntryL(TMsvId aCurrentId);
+	void DecodeAndStoreLineL(const TDesC8& aSourceLine);
+
+	void ParseRecipientListL(CDesCArray& aRecipientList);
+	void PrepareDecoder();
+
+	void WriteToBodyL(const TDesC8& aText, TBool aBlankLine=EFalse);
+	void WriteToBodyL(const TDesC16& aText);
+
+	void AddFileExtension();
+	void ExtractFilename(TLex& aLex, TDes& rFileName);
+	void ReplaceInvalidCharacters(TDes& rFileName);
+	void SetAttachmentName(TDes& aFileName);
+	
+	TBool CheckUUEStartL(const TDesC8& aSourceLine);
+
+	// returns numeric value of text up to next delimiter
+	TInt Value(const TUint8*&);
+	void Whitespace(const TUint8*&);
+	TBool LineIsAllWhitespace();	
+
+	TBool CreateAttachmentL();
+	virtual void WriteToAttachmentL(const TDesC8& text);
+	void CloseAttachmentFileL();
+
+	// Message Entry specific functions
+	void ResetForNewEntryL(TValidEntryType entryType);
+	void ResetForNonMimeEntryL();
+	void MoveUpFromFolderEntryL();
+	virtual void MoveToParentEntryL();
+	void UpdateMultipartDataL();
+
+	TBool StoreEntryDataL();
+
+	virtual void StoreEntryStreamsL();
+	virtual void StoreEntryStreamsL(TInt aSettings);
+	void Store822HeaderL(CMsvStore& aStore, TBool& aCommit);
+	void StoreMIMEHeaderL(CMsvStore& aStore, TBool& aCommit);
+	void StoreBodyTextL(CMsvStore& aStore, TBool& aCommit);
+
+	virtual void CreateEntryL();
+	void Logging(const TDesC8& aString1, const TDesC8& aString2);
+	void StoreMessageEntryDetailsL();
+	
+protected:
+	enum { KNoPart = 0, KParentPart, KMultiPart };
+	TInt iEmailPart;
+	TMsvId iCurrentMultipartFolderEntryId;
+
+	TBool iMessageEntryCalled;
+	TBool iReceivingHeadersOnly;
+	TInt iReceiveError; // indicates if any anomalies were observed whilst the message was received
+	TInt iLeaveError; // keeps any errors that have caused a leave (ie Out of memory, Corrupt file, Server error)
+
+	TMsvId iRootEntryId;
+	TMsvId iTopMessagePart;
+
+	TInt8 iBCPadding[1348]; // Padding to maintain BC - TImAttachmentFile used to be here before it's size was expanded to buffer more data.
+	CMsvServerEntry* iServerEntry;
+	TUid iNewMsgType;
+
+	CLocalRfc822Token* iRfc822Token;
+
+	TValidEntryType iDefaultEntryType;
+	TValidEntryType iEntryType;
+
+	TMsvEmailEntry* iEmailEntry;
+	CImHeader* iOutputHeader;
+	
+	CParaFormatLayer* iParaLayer;
+	CCharFormatLayer* iCharLayer;
+	CRichText* iOutputBody;
+	
+	CImConvertCharconv* iCharConv;
+	CCnvCharacterSetConverter* iConverter;
+	TBool iPreparedToConvert;
+	
+	TBool iMIMEPart_822Header;	
+	TInt iEmptyHeaderSize;
+	TImBodyConvAlgorithm iAlgorithm;
+
+	TBool iCommitLine;	
+	TBool iFinalLine;	
+	TBool iPrepared;
+	TBool iFinishedHeader;
+	TBool iNotFinishedRfc822Header;
+	TBool iNewNonMIMEBodyPart;
+	TBool iFirstBoundaryReached;
+
+	CCnvCharacterSetConverter* iCharacterConverter;
+	CImConvertHeader* iHeaderConverter;
+
+	TImRfc822DateField iRfc822Date;
+
+	RFs* iFsSession;  
+
+	TBool iSkipData;
+	TBool iEncounteredLineEndingInCarriageReturn;
+
+	TBool iCurrentPartIsRichText;	//indicates if current body part is RichText, set on every Close Attachment()
+	TImCodecQP iQPCodec;
+	TImCodecB64 iB64Codec;
+	TImCodecUU iUUCodec;
+	TPtrC8 iThisLine;
+	
+	HBufC* iRemovedAttachmentTag;		// resource text which is put into the body in place of a removed MIME attachment
+	HBufC* iRetainedAttachmentTag;		// Not used at all - resource text which is put into the body next to a retained MIME attachment
+	HBufC* iDefaultAttachmentName;		// used when no name found	
+	HBufC* iAttachmentFullPath;			// full path to current message file
+
+	TBool iSavingAttachments;			// Turn on/off saving of attachments
+
+	TBuf8<KMaxBoundaryTextLength> iSeekBoundary;
+	
+	TInt iGlobalIndent;
+	TInt iPreviousLineLength;
+	TInt iPreviousTrailingWhitespace;
+	TChar iLastChar;
+	TInt iLongestLine;
+	TBool iNewEntry;
+
+	TImAttachmentFileState iAttachmentFileState;
+	TUint32 iEntryDataSize;
+
+	TBool	iLogFileExists;
+	RFile	iLogFile;
+	TLex8	iLineLex;
+	TTime   iTimeDate;
+
+	//priorities   //vk
+	TInt iPriority;		//{1..5}
+	TInt iXPriority;   // {1..5} 1,2-high, 3-normal, 4,5-low
+	TBuf8<KMaxPriorityTextLength> iPrecedence;  //   {bulk-low, list-normal,first class,special delivery-0}
+	TBuf8<KMaxPriorityTextLength> iImportance;  // {high, low, normal}
+	TMsvPriority iImPriority;
+
+	TMsvId	iEmailServiceId;
+	TBool	iPopulateMessage;
+	CImcvUtils* iImcvUtils;
+
+	TBuf8<KConversionRemainderLength> iLeftOver;
+
+	TMsvId	iSavedEntryId;
+	CArrayFixFlat<TParentDetails>* iParent;
+	// Logging
+	CImLog*					iImcvLog;
+	TMsvId					iBodyId;
+	
+public:
+	TFileName iAttachmentName;
+	CLocalMimeParser* iMimeParser;
+protected:
+	TBool	iRelatedAttachments;
+	CBufBase* iBodyBuf;
+	CMsvBodyText *iBodyText;
+	TInt iStore8BitData;
+	TImAttachmentFile iAttachmentFile;
+	TBool iParsedMimeBoundaryLast;
+	TInt iSizeOfAttachmentsRemoved;
+	HBufC* iPartialEmailFooter;
+	TInt iTopPartialDownloadCounter; // added to support correct attachment downloading after partial download
+	TBool iPartialEmail;
+	RFile*	iFile;
+	};
+
+
+/**
+@internalComponent
+@released
+*/
+class CLocalMimeParser : public CBase
+	{
+public:
+	/*IMPORT_C*/ static CLocalMimeParser* NewLC(CLocalImRecvConvert& aImRecvConvert);
+	/*IMPORT_C*/ static CLocalMimeParser* NewL(CLocalImRecvConvert& aImRecvConvert);
+	/*IMPORT_C*/ ~CLocalMimeParser();
+	void Reset();
+	void ResetForNewEntry();
+	void ParseLineL(const TDesC8& aSourceLine);
+
+	void SetBoundaryL(const TDesC8& aBoundaryText);
+	TBool IsBoundary(const TDesC8& aSourceLine);
+	void RemoveBoundary();
+	
+	inline void StoreMimeHeaderL(CMsvStore& entryStore);
+	inline void StoreMimeHeaderWithoutCommitL(CMsvStore& entryStore);
+	inline void RestoreMimeHeaderL(CMsvStore& entryStore);
+
+	inline TImEncodingType ContentEncoding();
+	inline TMimeContentType ContentType();
+	TPtrC8 ContentSubType() const;
+	TUint CurrentCharsetL() const;
+
+	inline const TBool MessageIsMime() const;
+	inline const TBool IsTerminatingBoundary() const;
+	inline const TBool BoundaryExists() const;
+	inline const TBool BoundaryFound() const;
+	inline const TInt MimeHeaderSize() const;
+	inline const TInt ReceiveError() const;
+	inline const TDesC& ContentDescription() const;
+	inline const TPtrC ContentLocation() const;
+	inline const TPtrC8 ContentId() const;
+	inline const TPtrC8 ContentDisposition() const;
+	inline TBool IsMessageDigest();
+
+	TBool VCard() const;
+	TBool VCalendar() const;
+	TImEmailFolderType MessageFolderType() const;
+	void SetMessageFolderType(TImEmailFolderType aFolderType);
+	TBool StartPart() const;
+	void RestoreMimeParserL(CMsvStore& entryStore);
+	void ExtractParameterInfoL(const TDesC8& aTag, TDes16& rBuffer, TDes8& rBuffer8);	
+	void ExtractParameterInfoL(const TDesC8& aTag, HBufC8*& rBuffer);	
+	TBool MimeFieldsExist() const;
+	void ResetMimeFieldsExist();
+	void DoMultipartTypeForNonMIMEL();
+
+#if defined (_DEBUG)
+	inline TLex8& Lex() {return iLex;};
+#endif
+
+private:
+	CLocalMimeParser(CLocalImRecvConvert& aImRecvConvert);
+	void ConstructL();
+
+	// String scanning functions
+	TBool IsSpecialChar(const TUint8 aChar);
+	TBool MatchAndRemoveToken(const TDesC8& aToken);
+
+	// MIME token recognition functions
+	void DoMimeVersion();
+	void DoContentTypeL();
+	void DoContentLocationL();
+	void DoContentBaseL();
+	void DoContentIdL();
+	void DoEncodingL();
+	void DoDescriptionL();
+	void DoDispositionL();
+
+	// MIME Content-Type type recognition functions
+	void DoTextTypeL();
+	void DoMultipartTypeL();
+	void DoMessageTypeL();
+	void DoAttachmentTypeL();
+
+	// Will be moved to MIUT, but for now ..
+	const TPtrC8 GetContentTypeValue(const TDesC8& aContentTypeParameter) const;
+	      
+	TBool ParseRfc2047ParameterInfoL( const TDesC8& aParam, TDes& rBuffer);
+	TBool ParseRfc2231ParameterInfoL( const TDesC8& aTag, TDes& rBuffer, TInt aOffset );
+	TBool DecodeRfc2231ParameterInfoL( TDes8& aInput, TDes& rBufOut, 
+											TPtrC8 aCharset/*, TPtrC8 aLanguage*/);
+	TPtrC8 ExtractParameterString(TLexMark8& rMark);
+
+private:
+	CLocalImRecvConvert& iImRecvConvert;
+	
+	CImMimeHeader* iMimeHeader;
+	TInt iEmptyMimeHeaderSize;
+	
+	TBool isMime;
+	TBool iCorrectMimeVersion;
+	TImEncodingType iContentEncoding;
+	TMimeContentType iContentType;
+	TFileName iContentDescription;
+	TBool iVCard;
+	TBool iVCalendar;
+	TBool iStartPart;
+	TImEmailFolderType iMessageFolderType;
+	TUint iCharset;
+	TUint iDefaultCharset;
+	HBufC8* iStartId;
+
+	// Boundary stuff
+	CDesC8ArrayFlat* iBoundaryText;
+	TInt iBoundaryIndex;
+	TInt iBoundaryLength;
+	TBool iTerminatingBoundary;
+	TBool iBoundaryFound;
+	TInt iReceiveError; // Indicates if any anomalies were observed whilst the message was received
+						// Can be accessed via the inline ReceiveError()
+	TPtrC8 iTestLine;
+
+	HBufC8* iMimeHeaderLine;
+	TLexMark8 iMark;
+	TLex8 iLex;
+	TLex8 iTestLex;	
+	TBool isMessageDigest;
+	TBool iMimeFieldsExist;
+	};
+
+#include "local_imcvrecv.inl"
+
+#endif