--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/pop3andsmtpmtm/servermtmutils/inc/IMCVRECV.H Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,499 @@
+// 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:
+// IMCVRECV.H
+//
+
+#if !defined (__IMCVRECV_H__)
+#define __IMCVRECV_H__
+
+#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>
+#include <imutdll.h>
+#include <cimcaf.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include "cimconvertheader.h"
+#endif
+
+class CMsvPlainBodyTextEntry;
+class CImHeader;
+class CRichText;
+class CMimeParser;
+class CImRecvConvert;
+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
+/**
+@internalComponent
+@released
+*/
+ {
+ TInt iSize;
+ TBool iAttachment;
+ TBool iMHTML;
+ TImEmailFolderType iFolder; // Only interested in the Related type
+ TBool iICal;
+ TBool iVCal;
+ };
+
+//----------------------------------------------------------------------------------------
+class CRfc822Token : public CBase
+//----------------------------------------------------------------------------------------
+/**
+@internalComponent
+@released
+*/
+ {
+public:
+ enum THeaderPart { EUnknown, ENotFinished, EFrom, EReplyTo, ETo, ECc, EBcc, ESubject, EDate, EReceived, EMessageId, EPriority, EImportance, EReturnReceiptTo, EEndOfHeader };
+ THeaderPart iHeaderPart;
+ TBool iLastToken;
+ TBool iFirstLine;
+ TBool i822FieldsExist;
+
+ IMPORT_C static CRfc822Token* NewLC();
+ IMPORT_C void Reset();
+ inline HBufC8* OutputLine();
+ IMPORT_C void ParseNextLineL( const TDesC8& aSourceLine );
+ IMPORT_C ~CRfc822Token();
+ inline TBool LastToken();
+
+ inline void SetImRecvConvert( CImRecvConvert* );
+private:
+ TBool MatchAndRemoveL( const TDesC8& );
+ TBool PriorityAndReceiptsMatchAndRemoveL(THeaderPart aPriority);
+
+ CRfc822Token();
+ void ConstructL();
+
+private:
+ TBuf8<KMaxIMailHeaderReadLineLength+1> iInputLine;
+ TBuf8<KMaxIMailHeaderReadLineLength+1> iBufferedInput;
+ HBufC8* iOutputLine;
+ CImRecvConvert* iImRecvConvert;
+ };
+
+//----------------------------------------------------------------------------------------
+class CImRecvConvert : public CBase
+//----------------------------------------------------------------------------------------
+/**
+@internalAll
+@released
+*/
+ {
+friend class CMimeParser;
+public:
+ IMPORT_C static CImRecvConvert* NewLC( RFs& anFs, CMsvServerEntry* aServerEntry,
+ TUid aMsgType, TMsvId aEmailServiceId);
+ IMPORT_C static CImRecvConvert* NewL( RFs& anFs, CMsvServerEntry* aServerEntry,
+ TUid aMsgType, TMsvId aEmailServiceId);
+ IMPORT_C ~CImRecvConvert();
+
+ IMPORT_C void Cancel();
+
+ 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 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 void SetCaf(CImCaf& aCAF);
+ IMPORT_C TMsvEmailEntry MessageEntryDetailsL();
+
+ enum TValidEntryType {EUnknownEntry, EMessageEntry, EFolderEntry, EAttachmentEntry, ETextEntry, EHtmlEntry, ERtfEntry};
+ 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;
+ inline const TMsvId EntryId() const;
+ inline TBool NotFinishedRfc822Header();
+ inline CImConvertCharconv& CharacterConverter();
+ void ImCafRegisterL(const TDesC8& aMimeLine);
+ void ImAddToCafMetaDataL(const TDesC8& aMimeLine);
+ void ImAddToCafMetaDataL(const TDesC8& aField, const TDesC8& aData);
+ TBool ImCafProcessing() const;
+ TBool ImCafRegistered() const;
+private:
+ CImRecvConvert(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();
+ 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();
+ void WriteToAttachmentL(const TDesC8& text);
+ void CloseAttachmentFileL();
+
+ // Message Entry specific functions
+ void ResetForNewEntryL(TValidEntryType entryType);
+ void ResetForNonMimeEntryL();
+ void MoveUpFromFolderEntryL();
+ void MoveToParentEntryL();
+ void UpdateMultipartDataL();
+
+ TBool StoreEntryDataL();
+
+ void StoreEntryStreamsL();
+ void StoreEntryStreamsL(TInt aSettings);
+ void Store822HeaderL(CMsvStore& aStore, TBool& aCommit);
+ void StoreMIMEHeaderL(CMsvStore& aStore, TBool& aCommit);
+ void StoreBodyTextL(CMsvStore& aStore, TBool& aCommit);
+
+ void CreateEntryL();
+ void Logging(const TDesC8& aString1, const TDesC8& aString2);
+ void StoreMessageEntryDetailsL();
+ void WritePartialFooter8L(TInt aAmountLeft);
+
+private:
+ 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;
+
+ CRfc822Token* 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;
+ TBool iParsedTime;
+
+ //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;
+ CMimeParser* iMimeParser;
+private:
+ TBool iRelatedAttachments;
+ CBufBase* iBodyBuf;
+ CMsvBodyText *iBodyText;
+ TInt iStore8BitData;
+ TImAttachmentFile iAttachmentFile;
+ TBool iParsedMimeBoundaryLast;
+ TInt iSizeOfAttachmentsRemoved;
+ HBufC* iPartialEmailFooter;
+ HBufC8* iPartialEmailFooter8;
+ HBufC8* iPartialRetrievalBody; // for storing the partial email body
+ TInt iTopPartialDownloadCounter; // added to support correct attachment downloading after partial download
+ TBool iPartialEmail;
+ RFile* iFile;
+ // Additions for CAF;
+ CImCaf* iCaf;
+ // Indicates whether the first line of the plaintext body part is received.
+ TBool iFirstLinePlainText;
+ // Indicates whether to store the mail bodytext in chunks or entire.
+ TBool iStorePlainBodyText;
+ // A wrapper over CMsvPlainBodyText to store body text in chunks.
+ CMsvPlainBodyTextEntry *iPlainBodyTextEntry;
+ };
+
+
+//----------------------------------------------------------------------------------------
+class CMimeParser : public CBase
+//----------------------------------------------------------------------------------------
+/**
+@internalComponent
+@released
+*/
+ {
+public:
+ IMPORT_C static CMimeParser* NewLC(CImRecvConvert& aImRecvConvert);
+ IMPORT_C static CMimeParser* NewL(CImRecvConvert& aImRecvConvert);
+ IMPORT_C ~CMimeParser();
+
+ 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;
+ TBool ICalendar() const;
+ TImEmailFolderType MessageFolderType() const;
+ void SetMessageFolderType(TImEmailFolderType aFolderType);
+ TBool StartPart() const;
+ void RestoreMimeParserL(CMsvStore& entryStore);
+ void ExtractParameterInfoL(const TDesC8& aTag, TDes16& rBuffer, HBufC8*& paramValue8);
+ void ExtractParameterInfoL(const TDesC8& aTag, HBufC8*& rBuffer);
+ TBool MimeFieldsExist() const;
+ void ResetMimeFieldsExist();
+ void DoMultipartTypeForNonMIMEL();
+
+#if defined (_DEBUG)
+ inline TLex8& Lex() {return iLex;};
+#endif
+
+ TPtrC8 ContentTypeDescription() const;
+
+private:
+ CMimeParser(CImRecvConvert& aImRecvConvert);
+ void ConstructL();
+
+ // String scanning functions
+ TBool IsSpecialChar(const TUint8 aChar);
+ TBool MatchAndRemoveToken(const TDesC8& aToken);
+ TInt FindAttribute(const TDesC8& aTag, const TDesC8& aParameterList);
+
+ // 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:
+ CImRecvConvert& iImRecvConvert;
+ CImMimeHeader* iMimeHeader;
+
+ TInt iEmptyMimeHeaderSize;
+
+ TBool isMime;
+ TBool iCorrectMimeVersion;
+ TImEncodingType iContentEncoding;
+ TMimeContentType iContentType;
+ TFileName iContentDescription;
+ TBool iVCard;
+ TBool iVCalendar;
+ TBool iICalendar;
+ 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 <imcvrecv.inl>
+
+#endif