williamr@2: // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@4: // MIUTHDR.H williamr@2: // williamr@2: williamr@4: /** williamr@4: * @file williamr@4: * @publishedAll williamr@4: * @released williamr@4: */ williamr@4: williamr@2: #ifndef __MIUTHDR_H__ williamr@2: #define __MIUTHDR_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include // KMsvNullIndexEntryId williamr@2: #include // KUidMsvEmailTextEntryValue williamr@4: #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS williamr@4: #include "timrfc822datefield.h" williamr@4: #endif williamr@4: /** williamr@4: * IMail-specific stream type within an IMail file store for CImHeader williamr@4: * @publishedAll williamr@4: * @released williamr@4: */ williamr@2: const TUid KUidMsgFileMimeHeader = {0x1000160F}; // 268441103 decimal williamr@4: /** williamr@4: * IMail-specific stream type within an IMail file store for CImMimeHeader williamr@4: * @publishedAll williamr@4: * @released williamr@4: */ williamr@2: const TUid KUidMsgFileIMailHeader = {0x100001D8}; // 268435928 decimal williamr@2: williamr@4: /** williamr@4: * @publishedAll williamr@4: * @released williamr@4: */ williamr@2: class CMsvStore; williamr@2: class TMsvEntry; williamr@2: class RMsvReadStream; williamr@2: class RMsvWriteStream; williamr@4: /** williamr@4: * @internalTechnology williamr@4: * @released williamr@4: */ williamr@2: class CImEncodedHeader; williamr@2: williamr@2: /** Defines how emails will be encoded when they are sent. williamr@2: williamr@2: MIME standards are defined in RFC 2045, RFC 2046 and RFC 2047. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: enum TMsgOutboxBodyEncoding williamr@2: { williamr@2: /** Emails are sent with the default encoding, which is as for EMsgOutboxMIME. */ williamr@2: EMsgOutboxDefault, williamr@2: /** Emails are sent as plain text RFC822 messages. williamr@2: williamr@2: Attachments are encoded using UUEncoding algorithm. This method would not williamr@2: normally be used unless the sender was sure that the receiving mail clients williamr@2: don't support MIME. */ williamr@2: EMsgOutboxNoAlgorithm, williamr@2: /** Text is encoded using quoted-printable encoding, and all attachments are encoded williamr@2: using BASE64 encoding. williamr@2: williamr@2: This is the default setting for this option. */ williamr@2: EMsgOutboxMIME, williamr@2: /** Text parts of the message are sent as MIME TEXT/HTML parts, and are encoded williamr@2: using UTF-8 encoding system. williamr@2: williamr@2: All attachments are encoded using BASE64 encoding. Receiving mail clients williamr@2: that do no support MHTML mail will display the HTML message text to the user williamr@2: including all HTML tags, etc. */ williamr@2: EMsgOutboxMHTMLAsMIME, williamr@2: /** Each text part of the message is sent as two alternative MIME parts. williamr@2: williamr@2: The first part is sent as plain text using quoted-printable encoding, the williamr@2: second part is sent as a TEXT/HTML part which is encoded using UTF-8 encoding williamr@2: system. All attachments are encoded using BASE64 encoding. This is the standard williamr@2: encoding method if the user wishes to send MHTML mail. */ williamr@2: EMsgOutboxMHTMLAlternativeAsMIME williamr@2: }; williamr@2: williamr@2: /** Messaging encoding types. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: enum TImEncodingType williamr@2: { williamr@2: /** Unknown. */ williamr@2: EEncodingTypeUnknown, williamr@2: /** None. */ williamr@2: EEncodingTypeNone, williamr@2: /** 7-bit. */ williamr@2: EEncodingType7Bit, williamr@2: /** 8-bit. */ williamr@2: EEncodingType8Bit, // ie lines still <1000 chars and terminated by CRLF williamr@2: /** Binary. */ williamr@2: EEncodingTypeBinary, // ie any length of data, not terminated by CRLF williamr@2: /** QP. */ williamr@2: EEncodingTypeQP, williamr@2: /** Base64. */ williamr@2: EEncodingTypeBASE64, williamr@2: /** UU. */ williamr@2: EEncodingTypeUU williamr@2: }; williamr@2: williamr@2: williamr@2: // Class used for storing extracting information (to/from header).. williamr@2: // regarding the encoding in an incoming email message header. williamr@2: //---------------------------------------------------------------------------------------- williamr@2: class TImHeaderEncodingInfo williamr@2: //---------------------------------------------------------------------------------------- williamr@2: /** Stores encoding data found in message headers. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: /** Message field types. */ williamr@2: enum TFieldList williamr@2: { williamr@2: EFrom, /**< "From" field. */ williamr@2: EReplyTo, /**< "Reply To" field. */ williamr@2: ETo, /**< "To" field. */ williamr@2: ECc, /**< "Cc" field. */ williamr@2: EBcc, /**< "Bcc" field. */ williamr@2: ESubject /**< Subject field. */ williamr@2: }; williamr@2: /** Encoding types. */ williamr@2: enum TEncodingType williamr@2: { williamr@2: EBase64, /**< Base64. */ williamr@2: EQP, /**< QP. */ williamr@2: ENoEncoding, /**< No encoding */ williamr@2: EUU /**< UU. */ williamr@2: }; williamr@2: williamr@2: public: williamr@2: IMPORT_C TImHeaderEncodingInfo(); williamr@2: IMPORT_C TImHeaderEncodingInfo(const TImHeaderEncodingInfo& aFrom); williamr@2: williamr@2: IMPORT_C void ExternalizeL( RWriteStream& aWriteStream ) const; williamr@2: IMPORT_C void InternalizeL( RReadStream& aReadStream ); williamr@2: williamr@2: inline void SetField(const TFieldList aField); williamr@2: inline TFieldList Field() const; williamr@2: williamr@2: inline void SetOffset(const TInt aOffset); williamr@2: inline TInt Offset() const; williamr@2: williamr@2: inline void SetLength(const TInt aLength); williamr@2: inline TInt Length() const; williamr@2: williamr@2: inline void SetCharsetUid(const TUint aUid); williamr@2: inline TUint CharsetUid() const; williamr@2: williamr@2: inline void SetEncodingType(const TDesC8& aChar); williamr@2: inline void SetEncodingType(const TEncodingType aType); williamr@2: inline TEncodingType EncodingType() const; williamr@2: williamr@2: inline void SetArrayValue(const TInt aValue); williamr@2: inline TInt ArrayValue() const; williamr@2: williamr@2: inline void SetAddSpace(const TBool atrueFalse); williamr@2: inline TBool AddSpace() const; williamr@2: williamr@2: inline void SetEncodedLength(const TInt aLength); williamr@2: inline TInt EncodedLength() const; williamr@2: williamr@2: private: williamr@2: TFieldList iField; williamr@2: TUint16 iOffset; williamr@2: TUint16 iLength; williamr@2: TEncodingType iType; williamr@2: TUint16 iArrayValue; williamr@2: TBool iAddSpace; // A space char needs adding between two adjoining 'encoded-words' williamr@2: TUint8 iEncodedLength; // This can be used to determine space needed for buffer. williamr@2: TUint iCharsetUid; williamr@2: williamr@2: }; williamr@2: williamr@2: williamr@2: //------------------------------------------------------------------------------ williamr@2: williamr@2: williamr@2: class CImHeader : public CBase williamr@2: /** Encapsulates an Internet Mail (RFC822) header. williamr@2: williamr@2: Note that the class contains some obsolete functions that take a narrow descriptor: williamr@2: always use the equivalent wide descriptor function instead. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: /** Flags used to determine where to obtain the ReplyTo address for the header williamr@2: field of that name. */ williamr@2: enum TReplyTo williamr@2: { williamr@2: /** Get address from originator. */ williamr@2: EOriginator, williamr@2: /** Get address from sender. */ williamr@2: ESender, williamr@2: /** Get address from all sources. */ williamr@2: EAll, williamr@2: /** Get address from recipients. */ williamr@2: ERecipients williamr@2: }; williamr@2: williamr@2: IMPORT_C static CImHeader* NewLC(); williamr@2: IMPORT_C ~CImHeader(); williamr@2: IMPORT_C void Reset(); williamr@2: williamr@2: // streaming operations williamr@2: IMPORT_C void InternalizeL(RMsvReadStream& aReadStream); williamr@2: IMPORT_C void ExternalizeL(RMsvWriteStream& aWriteStream) const; williamr@2: IMPORT_C void RestoreL(CMsvStore& aMessageStore); williamr@2: IMPORT_C void StoreL (CMsvStore& aMessageStore) const; williamr@2: IMPORT_C void StoreWithoutCommitL(CMsvStore& aMessageStore) const; williamr@2: williamr@4: williamr@2: // the bulk of the member functions are accessors & mutators so we can use williamr@2: // objects of the class as data repositories during the data-marshalling stage williamr@2: // of getting imail headers to/from the internet williamr@2: IMPORT_C const TPtrC Subject() const; williamr@2: IMPORT_C void SetSubjectL(const TDesC8& aSubject); williamr@2: williamr@2: // Internet message ID williamr@2: IMPORT_C const TPtrC8 ImMsgId() const; williamr@2: /** Sets the "MessageId" header field. williamr@2: williamr@2: @param aImMsgIdL Field value */ williamr@2: IMPORT_C void SetImMsgIdL(const TDesC8& aImMsgIdL); williamr@2: williamr@2: IMPORT_C const TPtrC From() const; williamr@2: IMPORT_C void SetFromL(const TDesC8& aFrom); williamr@2: williamr@2: IMPORT_C const TPtrC ReplyTo() const; williamr@2: IMPORT_C void SetReplyToL(const TDesC8& aReplyTo); williamr@2: williamr@2: IMPORT_C const TPtrC ReceiptAddress() const; williamr@2: /** Sets the "Receipt" header field. williamr@2: williamr@2: @param aReceiptAddress Field value */ williamr@2: IMPORT_C void SetReceiptAddressL(const TDesC8& aReceiptAddress); williamr@2: williamr@2: IMPORT_C TUint Charset() const; williamr@2: IMPORT_C void SetCharset(const TUint aCharset); williamr@2: williamr@2: #if defined (_UNICODE) williamr@2: IMPORT_C void SetFromL(const TDesC16& aFrom); williamr@2: IMPORT_C void SetReplyToL(const TDesC16& aReplyTo); williamr@2: /** Sets the "Receipt" header field. williamr@2: williamr@2: @param aReceiptAddress Field value */ williamr@2: IMPORT_C void SetReceiptAddressL(const TDesC16& aReceiptAddress); williamr@2: IMPORT_C void SetSubjectL(const TDesC16& aSubject); williamr@2: #endif williamr@2: williamr@2: IMPORT_C TInt DataSize(); williamr@2: williamr@2: inline const TUint RemoteSize() const; williamr@2: inline void SetRemoteSize(TUint aSize); williamr@2: williamr@2: inline const TUint16 Version() const; williamr@2: inline void SetVersion(TUint16 aVersion); williamr@2: williamr@2: // give const access to the recipient lists williamr@2: inline const CDesCArray& ToRecipients () const; williamr@2: inline const CDesCArray& CcRecipients () const; williamr@2: inline const CDesCArray& BccRecipients() const; williamr@2: williamr@2: // give non-const access to the recipient lists williamr@2: inline CDesCArray& ToRecipients () ; williamr@2: inline CDesCArray& CcRecipients () ; williamr@2: inline CDesCArray& BccRecipients() ; williamr@2: williamr@2: inline CArrayFix& EncodingInfo() ; williamr@2: inline const CArrayFix& EncodingInfo() const; williamr@2: williamr@2: IMPORT_C void AddEncodingInfoL(TImHeaderEncodingInfo& aInfo); williamr@2: williamr@2: //------------------------------------------------------------------------------------- williamr@2: //----------------------Used for forwarding/replying to an email ---------------------- williamr@2: williamr@2: IMPORT_C const TPtrC8 ResentMsgId() const; williamr@2: IMPORT_C void SetResentMsgIdL( const TDesC8& ); williamr@2: williamr@2: IMPORT_C const TPtrC ResentFrom() const; williamr@2: IMPORT_C void SetResentFromL( const TDesC& ); williamr@2: williamr@2: // give const access to the recipient lists williamr@2: inline const CDesCArray& ResentToRecipients () const; williamr@2: inline const CDesCArray& ResentCcRecipients () const; williamr@2: inline const CDesCArray& ResentBccRecipients() const; williamr@2: williamr@2: // give non-const access to the recipient lists williamr@2: inline CDesCArray& ResentToRecipients (); williamr@2: inline CDesCArray& ResentCcRecipients (); williamr@2: inline CDesCArray& ResentBccRecipients(); williamr@2: williamr@2: IMPORT_C const TPtrC8 InReplyTo() const; williamr@2: IMPORT_C void SetInReplyToL(const TDesC8&); williamr@2: williamr@2: IMPORT_C TInt CreateForwardL(CImHeader&, TDesC&); williamr@2: IMPORT_C TInt CreateReplyL(CImHeader&, TReplyTo, TDesC&); williamr@2: IMPORT_C void CreateReceiptL(CImHeader&, TDesC&); williamr@2: williamr@2: //------------------------------------------------------------------------------------- williamr@2: //------------------------------------------------------------------------------------- williamr@2: williamr@2: // Body Encoding (charset) stored on a per message basis williamr@2: IMPORT_C TMsgOutboxBodyEncoding BodyEncoding() const; williamr@2: IMPORT_C void SetBodyEncoding(TMsgOutboxBodyEncoding aMessageBodyEncoding); williamr@2: williamr@2: IMPORT_C void ReDecodeL(RFs& aFS); williamr@2: IMPORT_C TUint OverrideCharset() const; williamr@2: IMPORT_C void SetOverrideCharset(TUint aCharset); williamr@2: IMPORT_C void SaveEncodedHeadersL(); williamr@2: williamr@2: private: williamr@2: CImHeader(); williamr@2: void ConstructL(); williamr@2: williamr@2: // these four functions keep the line count down as there are several instances williamr@2: // of streaming in/out HBufC objects. williamr@2: void ReadRecipientsL ( RReadStream&, CDesCArray* ); williamr@2: void WriteRecipientsL( RWriteStream&, const CDesCArray* ) const; williamr@2: void FormatSubjectL(CImHeader&, TDesC&); williamr@2: williamr@2: //finds the duplicate recipients in To and Cc list williamr@2: TBool IsRecipientPresent(CImHeader& aCImHeader, TPtrC16 newRecipient); williamr@2: williamr@4: #if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) williamr@4: void ReStoreDBL(CMsvStore& aMessageStore); williamr@4: void StoreDBL (CMsvStore& aMessageStore) const; williamr@4: void CreateImHeaderArrayListL(TDesC16& aStr, CDesCArray& aRecipients); williamr@4: void CreateEncodingInfoL(TDesC16& aEncodingStr); williamr@4: HBufC16* Convert8to16L(const TDesC8& aStr) const; williamr@4: void CreateBufferL( RBuf16& aBuf, CDesCArray& aRecipients)const; williamr@4: #endif williamr@2: private: williamr@2: TUint16 iVersion; williamr@2: williamr@2: HBufC16* iFrom; williamr@2: HBufC* iSubject; williamr@2: HBufC8* iImMsgId; williamr@2: HBufC16* iReplyTo; williamr@2: HBufC16* iReceipt; williamr@2: williamr@2: CDesCArray* iTo; williamr@2: CDesCArray* iCc; williamr@2: CDesCArray* iBcc; williamr@2: TUint iRemoteSize; williamr@2: williamr@2: //------------------------------------------------------------------------------------- williamr@2: //----------------------Used for forwarding/replying to an email ---------------------- williamr@2: williamr@2: HBufC* iResentFrom; williamr@2: HBufC8* iResentMsgId; williamr@2: CDesCArray* iResentTo; williamr@2: CDesCArray* iResentCc; williamr@2: CDesCArray* iResentBcc; williamr@2: HBufC8* iInReplyTo; williamr@2: williamr@2: //------------------------------------------------------------------------------------- williamr@2: //------------------------------------------------------------------------------------- williamr@2: CArrayFix* iEncodingInfo; williamr@2: TMsgOutboxBodyEncoding iBodyEncoding; williamr@2: // The character set to be when sending message. williamr@2: // Overrides the charset passed in from the settings. williamr@2: TUint i822HeaderCharset; williamr@2: williamr@2: CImEncodedHeader* iEncodedHeader; williamr@4: #if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) williamr@4: friend class CTestEmailHeaderStoreReStore; williamr@4: #endif williamr@2: }; williamr@2: williamr@2: /** Folder type flags. williamr@2: williamr@2: The flags correspond to the MIME multipart subtype. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: enum TImEmailFolderType williamr@2: { williamr@2: /** Unknown. */ williamr@2: EFolderTypeUnknown, williamr@2: /** Related. */ williamr@2: EFolderTypeRelated, williamr@2: /** Mixed. */ williamr@2: EFolderTypeMixed, williamr@2: /** Parallel. */ williamr@2: EFolderTypeParallel, williamr@2: /** Alternative. */ williamr@2: EFolderTypeAlternative, williamr@2: /** Digest. */ williamr@2: EFolderTypeDigest, williamr@2: /** RFC822. */ williamr@2: EFolderTypeRFC822, williamr@2: /** Partial. */ williamr@2: EFolderTypePartial, williamr@2: /** Directory. */ williamr@2: EFolderTypeDirectory, williamr@2: /** External. */ williamr@2: EFolderTypeExternal williamr@2: }; williamr@2: williamr@2: /** Describes the types of off-line email operations than can occur. williamr@2: williamr@2: @see TMsvEmailEntry::DisconnectedOperation() williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: enum TImDisconnectedOperationType williamr@2: { williamr@2: /** No operation. */ williamr@2: ENoDisconnectedOperations, williamr@2: /** Create operation. */ williamr@2: EDisconnectedCreateOperation, williamr@2: /** Delete operation. */ williamr@2: EDisconnectedDeleteOperation, williamr@2: /** Change operation. */ williamr@2: EDisconnectedChangeOperation, williamr@2: /** "Copy to" operation. */ williamr@2: EDisconnectedCopyToOperation, williamr@2: /** "Copy from" operation. */ williamr@2: EDisconnectedCopyFromOperation, williamr@2: /** "Copy within service" operation. */ williamr@2: EDisconnectedCopyWithinServiceOperation, williamr@2: /** "Move to" operation. */ williamr@2: EDisconnectedMoveToOperation, williamr@2: /** "Move from" operation. */ williamr@2: EDisconnectedMoveFromOperation, williamr@2: /** "Move within service" operation. */ williamr@2: EDisconnectedMoveWithinServiceOperation, williamr@2: /** Special operation. */ williamr@2: EDisconnectedSpecialOperation, williamr@2: /** Unknown operation. */ williamr@2: EDisconnectedUnknownOperation, williamr@2: /** Multiple operations. */ williamr@2: EDisconnectedMultipleOperation williamr@2: }; williamr@2: williamr@2: // Remote folder message count limited to TUint16 by using lower 16 bits of "iMtmData3". williamr@2: // Note: The upper 16 bits of "iMtmData3" are not currently used by "TMsvEmailEntry". williamr@2: const TUint KMsvRemoteFolderEntriesMask = 0x0000FFFF; williamr@2: williamr@2: class TMsvEmailEntry : public TMsvEntry williamr@2: /** Provides storage for and access to extra email specific information for a message. williamr@2: williamr@2: To get a TMsvEmailEntry, get the entry's TMsvEntry, e.g. using williamr@2: @c CMsvEntry::Entry(), and use the constructor that takes a TMsvEntry parameter. williamr@2: williamr@2: Many of the flags are only used by IMAP4 entries. These can be grouped as follows: williamr@2: williamr@2: - IMAP-specific flags, as defined by the IMAP protocol (see RFC3501, 2.3.2. Flags Message Attribute) williamr@2: - GetIMAP4Flags() and SetIMAP4Flags() handle all the flags as a group williamr@2: - \\Seen flag: SetSeenIMAP4Flag(), SeenIMAP4Flag(). williamr@2: - \\Answered flag: SetAnsweredIMAP4Flag(), AnsweredIMAP4Flag() williamr@2: - \\Flagged flag: SetFlaggedIMAP4Flag(), FlaggedIMAP4Flag() williamr@2: - \\Deleted flag: SetDeletedIMAP4Flag(), DeletedIMAP4Flag() williamr@2: - \\Draft flag: SetDraftIMAP4Flag(), DraftIMAP4Flag() williamr@2: - \\Recent flag: SetRecentIMAP4Flag(), RecentIMAP4Flag() williamr@2: - Folder subscriptions and other folder-related flags: williamr@2: - SetMailbox(), Mailbox(), williamr@2: - SetSubscribed(), Subscribed(), williamr@2: - SetLocalSubscription(), LocalSubscription() williamr@2: - SetRemoteFolderEntries(), RemoteFolderEntries() williamr@2: - Disconnected operation information: williamr@2: - SetDisconnectedOperation(), DisconnectedOperation(). williamr@2: - Partial download flags: these flags allow a client to test if a message or its body has williamr@2: been partially downloaded (see TImImap4GetPartialMailInfo) williamr@2: - SetPartialDownloaded(), PartialDownloaded() williamr@2: - SetBodyTextComplete(), BodyTextComplete() williamr@2: - UID information: IMAP messages have a unique identifier number (see williamr@2: RFC3501, 2.3.1.1. Unique Identifier (UID) Message Attribute) williamr@2: - SetValidUID(), ValidUID() williamr@2: - SetUID(), UID(). williamr@2: williamr@2: The following flags are set only by the IMAP MTM. They indicate if the williamr@2: message contains a vCard, vCalendar (http://www.imc.org), or iCalendar (RFC 2445) attachment. williamr@2: williamr@2: - VCard(), SetVCard() williamr@2: - VCalendar(), SetVCalendar() williamr@2: - ICalendar(), SetICalendar() williamr@2: williamr@2: The following flags apply to all email protocols: williamr@2: williamr@2: - Receipt requested: Receipt(), SetReceipt() williamr@2: - MHTML content: MHTMLEmail(), SetMHTMLEmail() williamr@2: williamr@2: Note that the email specific data is stored in the reserved data members @c iMtmData1, williamr@2: @c iMtmData2 and @c iMtmData3 of the TMsvEntry base class. These public data members williamr@2: must not be directly altered by clients. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: @see CImap4ClientMtm williamr@2: */ williamr@2: { williamr@2: public: // Public member functions williamr@2: IMPORT_C TMsvEmailEntry(); // default constructor williamr@2: IMPORT_C TMsvEmailEntry(const TMsvEntry& aGenericEntry); williamr@2: williamr@2: IMPORT_C TBool operator==(const TMsvEntry& aEntry) const; williamr@2: IMPORT_C TBool operator==(const TMsvEmailEntry& aEntry) const; williamr@2: williamr@2: IMPORT_C void GetIMAP4Flags(TBool& rUnread,TBool& rSeen,TBool& rAnswered,TBool& rFlagged,TBool& rDeleted,TBool& rDraft,TBool& rRecent); williamr@2: IMPORT_C void SetIMAP4Flags(TBool aUnread,TBool aSeen,TBool aAnswered,TBool aFlagged,TBool aDeleted,TBool aDraft,TBool aRecent); williamr@2: williamr@2: IMPORT_C void SetMessageFolderType(TImEmailFolderType aFolderType); williamr@2: IMPORT_C TImEmailFolderType MessageFolderType() const; williamr@2: williamr@2: IMPORT_C void SetDisconnectedOperation(TImDisconnectedOperationType aDisconnectedOperationType); williamr@2: IMPORT_C TImDisconnectedOperationType DisconnectedOperation() const; williamr@2: williamr@2: IMPORT_C void SetPartialDownloaded(TBool aPartialDownloaded); williamr@2: IMPORT_C TBool PartialDownloaded() const; williamr@2: williamr@2: // williamr@2: inline void SetEncrypted(TBool aEncrypt); williamr@2: inline TBool Encrypted() const; williamr@2: // williamr@2: inline void SetSigned(TBool aSignature); williamr@2: inline TBool Signed() const; williamr@2: // williamr@2: inline TBool VCard() const; williamr@2: inline void SetVCard(TBool aVCard); williamr@2: // williamr@2: inline TBool VCalendar() const; williamr@2: inline void SetVCalendar(TBool aVCal); williamr@2: // williamr@2: inline TBool ICalendar() const; williamr@2: inline void SetICalendar(TBool aICal); williamr@2: // williamr@2: inline TBool Receipt() const; williamr@2: inline void SetReceipt(TBool aReceipt); williamr@2: williamr@2: inline TBool MHTMLEmail() const; williamr@2: inline void SetMHTMLEmail(TBool aMhtml); williamr@2: williamr@2: inline TBool BodyTextComplete() const; williamr@2: inline void SetBodyTextComplete(TBool aFlag); williamr@2: williamr@2: // williamr@2: // IMAP4-specific flags williamr@2: // williamr@2: inline void SetUnreadIMAP4Flag(TBool aUnread); williamr@2: inline TBool UnreadIMAP4Flag() const; williamr@2: // williamr@2: inline void SetSeenIMAP4Flag(TBool aSeen); williamr@2: inline TBool SeenIMAP4Flag() const; williamr@2: // williamr@2: inline void SetAnsweredIMAP4Flag(TBool aAnswered); williamr@2: inline TBool AnsweredIMAP4Flag() const; williamr@2: // williamr@2: inline void SetFlaggedIMAP4Flag(TBool aFlagged); williamr@2: inline TBool FlaggedIMAP4Flag() const; williamr@2: // williamr@2: inline void SetDeletedIMAP4Flag(TBool aDeleted); williamr@2: inline TBool DeletedIMAP4Flag() const; williamr@2: // williamr@2: inline void SetDraftIMAP4Flag(TBool aDraft); williamr@2: inline TBool DraftIMAP4Flag() const; williamr@2: // williamr@2: inline void SetRecentIMAP4Flag(TBool aRecent); williamr@2: inline TBool RecentIMAP4Flag() const; williamr@2: // williamr@2: inline void SetMailbox(TBool aMailbox); williamr@2: inline TBool Mailbox() const; williamr@2: // williamr@2: inline TBool Orphan() const; williamr@2: williamr@2: inline void SetOrphan(TBool aOrphan); williamr@2: // williamr@2: inline void SetValidUID(TBool aValid); williamr@2: inline TBool ValidUID() const; williamr@2: // williamr@2: inline void SetSubscribed(TBool aSubscribed); williamr@2: inline TBool Subscribed() const; williamr@2: // williamr@2: inline void SetLocalSubscription(TBool aLocal); // i.e. is subscription local, or remote williamr@2: inline TBool LocalSubscription() const; williamr@2: // williamr@2: inline void SetUID(TUint32 aUid); williamr@2: inline TUint32 UID() const; williamr@2: // williamr@2: inline TInt RemoteFolderEntries() const; williamr@2: inline void SetRemoteFolderEntries(TInt aEntries); williamr@2: williamr@2: private: williamr@2: enum TMsvEmailEntryFlags williamr@2: { williamr@2: KMsvEmailEntryClearFlag =0x00, williamr@2: // Flags set on Message entries... williamr@2: KMsvEmailEntryEncryptedFlag =0x00000001, williamr@2: KMsvEmailEntrySignedFlag =0x00000002, williamr@2: KMsvEmailEntryReceiptFlag =0x00000004, williamr@2: KMsvEmailEntryOrphanFlag =0x00000008, williamr@2: williamr@2: // VCard and VCalendar entries may be set on folders or attachments williamr@2: KMsvEmailEntryVCardFlag =0x00000010, williamr@2: KMsvEmailEntryVCalendarFlag =0x00000020, williamr@2: williamr@2: // Message contains HTML data williamr@2: // (Note: HTML and not only MHTML) williamr@2: KMsvEmailEntryMHTMLFlag = 0x00000040, williamr@2: KMsvEmailEntryBodyTextCompleteFlag = 0x00000080, williamr@2: williamr@2: KMsvEmailEntryNoDisconnectedOperations = 0x00000000, williamr@2: KMsvEmailEntryDisconnectedCreateOperation = 0x00000100, williamr@2: KMsvEmailEntryDisconnectedDeleteOperation = 0x00000200, williamr@2: KMsvEmailEntryDisconnectedChangeOperation = 0x00000300, williamr@2: KMsvEmailEntryDisconnectedCopyToOperation = 0x00000400, williamr@2: KMsvEmailEntryDisconnectedCopyFromOperation = 0x00000500, williamr@2: KMsvEmailEntryDisconnectedCopyWithinServiceOperation = 0x00000600, williamr@2: KMsvEmailEntryDisconnectedMoveToOperation = 0x00000700, williamr@2: KMsvEmailEntryDisconnectedMoveFromOperation = 0x00000800, williamr@2: KMsvEmailEntryDisconnectedMoveWithinServiceOperation = 0x00000900, williamr@2: KMsvEmailEntryDisconnectedSpecialOperation = 0x00000A00, williamr@2: KMsvEmailEntryDisconnectedUnknownOperation = 0x00000B00, williamr@2: KMsvEmailEntryDisconnectedMultipleOperation = 0x00000C00, williamr@2: KMsvEmailEntryDisconnectedOperation = 0x00000F00, williamr@2: williamr@2: // IMAP4-specific masks. Can be re-used by non-IMAP4 entries (eg POP3, SMTP) williamr@2: KMsvEmailEntryIMAP4SubscribedFlag =0x00001000, williamr@2: KMsvEmailEntryIMAP4UnreadFlag =0x00002000, williamr@2: KMsvEmailEntryIMAP4SeenFlag =0x00004000, williamr@2: KMsvEmailEntryIMAP4AnsweredFlag =0x00008000, williamr@2: KMsvEmailEntryIMAP4FlaggedFlag =0x00010000, williamr@2: KMsvEmailEntryIMAP4DeletedFlag =0x00020000, williamr@2: KMsvEmailEntryIMAP4DraftFlag =0x00040000, williamr@2: KMsvEmailEntryIMAP4RecentFlag =0x00080000, williamr@2: KMsvEmailEntryIMAP4ValidUIDFlag =0x00100000, williamr@2: KMsvEmailEntryIMAP4MailboxFlag =0x00200000, williamr@2: KMsvEmailEntryIMAP4LocalSubFlag =0x00400000, williamr@2: williamr@2: // MIME "multipart" types assigned to folders. williamr@2: KMsvMimeFolderUnknownMask =0x00000000, williamr@2: KMsvMimeFolderRelatedMask =0x01000000, williamr@2: KMsvMimeFolderMixedMask =0x02000000, williamr@2: KMsvMimeFolderAlternativeMask =0x03000000, williamr@2: KMsvMimeFolderParallelMask =0x04000000, williamr@2: KMsvMimeFolderDigestMask =0x05000000, williamr@2: williamr@2: // MIME message types williamr@2: KMsvMimeFolderRFC822Mask =0x06000000, williamr@2: KMsvMimeFolderPartialMask =0x07000000, williamr@2: KMsvMimeFolderDirectoryMask =0x08000000, // for VCard, VCalendar types williamr@2: KMsvMimeFolderExternalMask =0x09000000, williamr@2: KMsvMimeFolderMask =0x0F000000, williamr@2: williamr@2: // Can be used by POP3 and IMAP4 MTMs. williamr@2: KMsvEmailEntryPartialDownloadFlag =0x10000000, williamr@2: williamr@2: KMsvEmailEntryICalendarFlag =0x20000000 williamr@2: }; williamr@2: williamr@2: }; williamr@2: williamr@2: const TUint16 KImMimeHeaderVersion = 2; // identify which version of this class has been stored williamr@2: williamr@2: class CImMimeHeader : public CBase williamr@2: /** Stores a MIME email header. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CImMimeHeader* NewLC(); williamr@2: IMPORT_C static CImMimeHeader* NewL(); williamr@2: IMPORT_C ~CImMimeHeader(); williamr@2: IMPORT_C void Reset(); williamr@2: IMPORT_C TInt Size(); // number of header fields stored in object williamr@2: williamr@2: // streaming operations williamr@2: IMPORT_C void InternalizeL( RMsvReadStream& aReadStream ); williamr@2: IMPORT_C void ExternalizeL( RMsvWriteStream& aWriteStream ) const; williamr@4: IMPORT_C void StoreWithoutCommitL(CMsvStore& aMessageStore) const; williamr@2: IMPORT_C void RestoreL( CMsvStore& aMessageStore ); williamr@2: IMPORT_C void StoreL ( CMsvStore& aMessageStore ) const; williamr@4: williamr@2: williamr@2: /** Sets the Content-Type field value (e.g. "text" in Content-Type:text/plain). williamr@2: williamr@2: The value is MIME defined and should always be 8-bit. williamr@2: williamr@2: @param aPath Field value */ williamr@2: IMPORT_C void SetContentTypeL(const TDesC8& aPath); williamr@2: IMPORT_C const TPtrC8 ContentType() const; williamr@2: williamr@2: /** Sets the Content-Type subtype field value (e.g. "plain" in Content-Type:text/plain). williamr@2: williamr@2: williamr@2: The value is MIME defined and should always be 8-bit. williamr@2: williamr@2: @param aPath Field value */ williamr@2: IMPORT_C void SetContentSubTypeL(const TDesC8& aPath); williamr@2: IMPORT_C const TPtrC8 ContentSubType() const; williamr@2: williamr@2: /** Sets the Content-Disposition field value (either inline or attachment). williamr@2: williamr@2: The value is MIME defined and should always be 8-bit. williamr@2: williamr@2: @param aPath Field value */ williamr@2: IMPORT_C void SetContentDispositionL(const TDesC8& aPath); williamr@2: IMPORT_C const TPtrC8 ContentDisposition() const; williamr@2: williamr@2: /** Sets the Content-Description field value. williamr@2: williamr@2: The value is MIME defined and should always be 8-bit. williamr@2: williamr@2: @param aPath Field value */ williamr@2: IMPORT_C void SetContentDescriptionL(const TDesC8& aPath); williamr@2: IMPORT_C const TPtrC8 ContentDescription() const; williamr@2: williamr@2: /** Sets the Content-Base field value. williamr@2: williamr@2: @param aPath Field value */ williamr@2: IMPORT_C void SetContentBaseL(const TDesC8& aPath); williamr@2: IMPORT_C const TPtrC8 ContentBase() const; williamr@2: williamr@2: /** Sets the Content-ID field value. williamr@2: williamr@2: @param aPath Field value */ williamr@2: IMPORT_C void SetContentIDL(const TDesC8& aPath); williamr@2: IMPORT_C const TPtrC8 ContentID() const; williamr@2: williamr@2: /** Sets the Content-Location field value. williamr@2: williamr@2: @param aPath Field value */ williamr@2: IMPORT_C void SetContentLocationL(const TDesC16& aPath); williamr@2: IMPORT_C const TPtrC16 ContentLocation() const; williamr@2: williamr@2: // IMAP-specific info describing relative location of entry w.r.t. parent Email message williamr@2: /** Sets IMAP-specific information for the relative location of the entry to the williamr@2: parent email message. williamr@2: williamr@2: @param aPath Relative location */ williamr@2: IMPORT_C void SetRelativePathL(const TDesC8& aPath); williamr@2: IMPORT_C const TPtrC8 RelativePath() const; williamr@2: williamr@2: /** Sets the Content-Transfer-Encoding field value. williamr@2: williamr@2: @param aType Field value */ williamr@2: IMPORT_C void SetContentTransferEncodingL(const TDesC8& aType); williamr@2: IMPORT_C TImEncodingType ContentTransferEncoding() const; williamr@2: IMPORT_C TImEncodingType ContentTransferEncoding(TDes8& rType) const; williamr@2: IMPORT_C const TPtrC8 GetContentTypeValue(const TDesC8& aContentTypeParameter) const; williamr@2: williamr@2: // inlines to access arrays williamr@2: inline const CDesC8Array& ContentTypeParams() const; williamr@2: inline const CDesC8Array& ContentDispositionParams() const; williamr@2: inline const CDesC8Array& XTypeParams() const; williamr@2: williamr@2: inline CDesC8Array& ContentTypeParams(); williamr@2: inline CDesC8Array& ContentDispositionParams(); williamr@2: inline CDesC8Array& XTypeParams(); // anything else that is in the header, but not recognised williamr@2: williamr@2: inline const TUint16 Version() const; williamr@2: inline void SetVersion( TUint16 aVersion ); williamr@2: williamr@2: IMPORT_C void SetMimeCharset(const TUint aCharset); williamr@2: IMPORT_C TUint MimeCharset() const; williamr@2: williamr@2: private: williamr@2: CImMimeHeader(); williamr@2: void ConstructL(); williamr@2: TBool ArrayEntryExists(CDesCArray& aArray, TInt aField); williamr@2: williamr@4: #if (defined SYMBIAN_MESSAGESTORE_HEADER_BODY_USING_SQLDB) williamr@4: void ReStoreMimeDBL(CMsvStore& aMessageStore); williamr@4: void StoreMimeDBL (CMsvStore& aMessageStore) const; williamr@4: void CreateMimeArrayListL(TPtrC16 astr1 ,TInt ai); williamr@4: TInt BufSize() const; williamr@4: #endif williamr@2: private: williamr@2: TUint16 iVersion; williamr@2: HBufC8* iRelativePath; williamr@2: HBufC8* iContentDescription; williamr@2: williamr@2: TImEncodingType iContentTransferEncoding; williamr@2: williamr@2: // MHTML parameters williamr@2: HBufC8* iContentBase; williamr@2: HBufC16* iContentLocation; williamr@2: HBufC8* iContentID; williamr@2: // williamr@2: HBufC8* iContentType; williamr@2: HBufC8* iContentSubType; williamr@2: HBufC8* iContentDisposition; williamr@2: // williamr@2: CDesC8Array* iContentTypeParams; // zero or more "parameter" williamr@2: CDesC8Array* iContentDispositionParams; // zero or more "parameters" williamr@2: CDesC8Array* iXTypeParams; // zero or more X-Type "parameters" williamr@2: // williamr@2: TBuf<20> iContentTransferEncodingBuffer; // must be big enough to store "quoted-printable" string williamr@2: williamr@2: // The uid value is always used in preference to the stored string. williamr@2: // Only when the uid is not set is the string used when sending. williamr@2: TUint iMimeCharset; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@4: /** williamr@4: * Convert16to8L() williamr@4: * williamr@4: * Convert the 16 bit descripter to 8 bit. williamr@4: * @param astr A descripter to be convert into 8 bit discripter. williamr@4: * @return HBufC16* A 8 bit discripter. williamr@4: */ williamr@4: static inline HBufC8* Convert16to8L(TDesC16& aStr)//const williamr@4: { williamr@4: HBufC8* newFrom1 = HBufC8::NewL(aStr.Length()); williamr@4: newFrom1->Des().Copy(aStr); williamr@4: return newFrom1; williamr@4: } williamr@4: williamr@4: williamr@4: /** williamr@4: * ConvertToTInt() williamr@4: * williamr@4: * Converts a string to an integer. williamr@4: * @param aStr A string to make Integer. williamr@4: * @return TInt A integer value williamr@4: */ williamr@4: static inline TInt ConvertToTInt(TDesC16& aStr) williamr@4: { williamr@4: TLex string(aStr); williamr@4: TInt32 stringIntValue; williamr@4: string.Val(stringIntValue); williamr@4: return stringIntValue; williamr@4: } williamr@4: williamr@4: williamr@2: #include williamr@2: williamr@2: #endif // #defined __MIUTHDR_H__