diff -r e8c1ea2c6496 -r 8758140453c0 email/email/smtp/inc/Local_imcvrecv.h --- /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 +#include // required for CBufSeg +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// 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 iInputLine; + TBuf8 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 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 iPrecedence; // {bulk-low, list-normal,first class,special delivery-0} + TBuf8 iImportance; // {high, low, normal} + TMsvPriority iImPriority; + + TMsvId iEmailServiceId; + TBool iPopulateMessage; + CImcvUtils* iImcvUtils; + + TBuf8 iLeftOver; + + TMsvId iSavedEntryId; + CArrayFixFlat* 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