mmsengine/mmscodec/inc/mmsdecode.h
changeset 0 72b543305e3a
child 17 caea42e26caa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsengine/mmscodec/inc/mmsdecode.h	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,1007 @@
+/*
+* Copyright (c) 2002-2007 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:   Decoding of binary multimedia message
+*
+*/
+
+
+
+#ifndef CMMSDECODE_H
+#define CMMSDECODE_H
+
+//  INCLUDES
+#include    <mentact.h>
+#include    <cmsvattachment.h>
+
+#include    "mmsservercommon.h"
+#include    "mmscodecdatasink.h"
+
+// CONSTANTS
+// We cannot save unlimited number of attachments.
+// We use a "sanity" limit which is actually insanely high, but should be safe.
+const TInt KMmsMaxAttachments = 500;
+
+// FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+class MMmsEntryWrapper;
+class RBufReadStream;
+class CMmsHeaders;
+class CMsvMimeHeaders;
+class CMmsSettings;
+
+// CLASS DECLARATION
+
+/**
+* Decoding of binary multimedia message.
+*
+* @lib mmscodec.lib
+* @since V2.1
+*/
+class CMmsDecode :public CMsgActive, public MMmsCodecDataSink
+    {
+    
+public:
+        
+    /** Lookup for file extension */
+    typedef struct
+        {
+        const TText8* tag;
+        const TText16* extension;
+        }TMmsExtensionLookup;
+
+    /** Lookup for extension header assigned values */
+    typedef struct MmsExtensionHeaderLookup
+        {
+        const TText8* extensionHeader;
+        const TUint8* assignedValue;
+        }TMmsExtensionHeaderLookup;
+
+    /**
+     * @param aFs file system handle.
+     */
+    IMPORT_C static CMmsDecode* NewL( RFs& aFs );
+    
+    virtual ~CMmsDecode();
+
+public:
+    
+    /**
+     * Start the state machine.
+     * @param aEntryWrapper entry class for message access
+     * @param aMmsHeadders reference to CMmsHeaders class.
+     * @param aDecodeBuffer buffer holding the data to be decoded.
+     * @param aStatus status of calling active object
+     * @param aStartPosition the starting point in the buffer.
+     *     Default = 0, start from beginning.
+     * @param aLength length of the data to be decoded.
+     *     Default = 0, decode whole buffer
+     * If memory runs out before state machine is started, leaves with error code.
+     */
+    IMPORT_C void StartL(
+        MMmsEntryWrapper& aEntryWrapper,
+        CMmsHeaders& aMmsHeaders,
+        CBufFlat& aDecodeBuffer,
+        TRequestStatus& aStatus,
+        TInt aStartPosition = 0,
+        TInt aLength = 0 );
+
+    /**
+     * Synchronous decoding function.
+     * To be used for messages that have only headers and no body.
+     * For example MMS notifications and delivery reports.
+     * @param aEntryWrapper entry class for message access
+     * @param aMmsHeaders reference to CMmsHeaders class.
+     * @param aDecodeBuffer buffer holding the data to be decoded.
+     * @param aStartPosition the starting point in the buffer.
+     *     Default = 0, start from beginning.
+     * @param aLength length of the data to be decoded.
+     *     Default = 0, decode whole buffer
+     * @param aNumberofAttachments pointer to a variable that will contain
+     *     the number of attachments on return.
+     *     Default = 0, no attachment number requested
+     * @param aDataStart pointer to a variable that will contain the
+     *     starting position of data in this MMS message.
+     *     Will point to start of first multipart entry or start of
+     *     monoblock data. If data type is WSP multipart, the assigned
+     *     number of the multipart has been stored in aMmsHeaders.
+     *     Default = 0, data part start not requested.
+     * leaves with error code.
+     */
+    IMPORT_C void DecodeHeadersL(
+        MMmsEntryWrapper& aEntryWrapper,
+        CMmsHeaders& aMmsHeaders,
+        CBufFlat& aDecodeBuffer,
+        TInt aStartPosition = 0,
+        TInt aLength = 0,
+        TInt* aNumberOfAttachments = 0,
+        TInt* aDataStart = 0 );
+
+    /**
+     * Decode attachments separately
+     * @since 2.6
+     * @param aEntryWrapper entry class for message access
+     * @param aMmsHeaders reference to CMmsHeaders class.
+     * @param aDecodeBuffer buffer holding the data to be decoded.
+     * @param aNumberOfAttachments number of attachments to be decoded.
+     * @param aStartPosition start position of the data to be decoded.
+     *     On return this is updated to point to next data part.
+     *     If this was the last data part, aStartPosition will point
+     *     past the end of the buffer.
+     * @param aStatus status of calling active object.
+     * @param aDoNotUpdateParentEntry should the parent entry be updated with 
+     *     attachment info.
+     *     The parent entry should be updated only when the last attachment
+     *     has been handled.
+     *     Default EFalse = update parent entry.
+     * @param aLength length of the data to be decoded.
+     *     Default = 0, decode whole buffer.
+     * If aNumberOfAttachments is the actual number of attachments, and
+     * aDoNotUpdateParentEntry and aLength have their default values, the whole
+     * attachment buffer is decoded and the result is the same as it were
+     * if the headers and attachments had been decoded together.
+     * If the attachments are handled one by one, aDoNotUpdateParentEntry should
+     * be false only when the last attachment has been reached.
+     */
+    IMPORT_C void DecodeAttachmentsL(
+        MMmsEntryWrapper& aEntryWrapper,
+        CMmsHeaders& aMmsHeaders,
+        CBufFlat& aDecodeBuffer,
+        TInt aNumberOfAttachments,
+        TInt& aStartPosition,
+        TRequestStatus& aStatus,
+        TBool aDoNotUpdateParentEntry = EFalse,
+        TInt aLength = 0 );
+
+    /**
+     * Extract starting position and length of data content from WSP multipart
+     * @since 2.6
+     * @param aDecodeBuffer buffer holding the data to be decoded.
+     * @param aStartPosition start position of the data to be decoded.
+     *     On return this is updated to point to next data part.
+     *     If this was the last data part, aStartPosition will point
+     *     past the end of the buffer.
+     * @param aStartOfData On return start of the actual data content in multipart entry
+     * @param aLengthOfData On return the length of the data content.
+     * @return Mime headers containing content type and content type parameters
+     *     of the data part. The structure will be valid only until next call to 
+     *     some function of CMmsDecode.
+     */
+    IMPORT_C CMsvMimeHeaders& ExtractNextDataPartL(
+        CBufFlat& aDecodeBuffer,
+        TInt& aStartPosition,
+        TInt& aStartOfData,
+        TInt& aLengthOfData);
+        
+    /*
+     * Commit the store.
+     * This function must be called to commit the store if attachments are decoded
+     *     and stored individually without allowing the parent entry to be updated
+     *     after last attachment.
+     * This function can also be called to commit the store after each attachment.
+     * This function does not delete the store. The store is deleted when headers
+     *     are reseted to start decoding a new entry.
+     */            
+    IMPORT_C void CommitStoreL();
+    
+    
+    /**
+     * Initialize the decoder for work in chunked decoding mode.
+     *
+     * @since v3.1
+     * Only chunked decoding of headers or incoming messages is supported.
+     * Chunked decoding of MMBox descriptions is not supported.
+     * Needed variables are initialized.
+     * Data will be provided later through the MmsCodecDataSink API
+     * @param aEntryWrapper entry class for message access.
+     *     Must be initialized to point to created message entry to receive the data.
+     * @param aMmsHeaders reference to CMmsHeaders class.
+     * @param aDecodeBuffer buffer. Given only to ensure that the buffer is always defined.
+     *     During initialization buffer contains no data and it can be changed by NextDataPart
+     *     function. Normally the buffer given here is the same as given in NextDataPart,
+     *     only content will change.
+     *
+     */
+    IMPORT_C void InitializeChunkedMode(
+        MMmsEntryWrapper& aEntryWrapper,
+        CMmsHeaders& aMmsHeaders,
+        CBufFlat& aDecodeBuffer
+        );
+
+// from base class MMmsCodecDataSink
+
+    /**
+     * From MMmsCodecDataSink.
+     * Gives the next data part to be decoded.
+     * Decoding is synchronous. When the code returns, data can be released.
+     *
+     * @since v3.1
+     * @param aBuffer flat buffer containing the data to be decoded.
+     * @param aPosition start of data to be decoded.
+     *     Decoding will start from aPosition.
+     *     At return aPosition will point to the data that has not been
+     *     decoded yet (in case data ends with an incomplete header) or
+     *     past the end of data if everything has been decoded.
+     *     The caller can discard the beginning of data up to aPosition.
+     *     If there is data left in the buffer it must be shifted to the
+     *     beginning of buffer and new data appended to the end to allow
+     *     an incomplete header to be decoded at next round.
+     * @param aLastChunk ETrue if the data chunk in the buffer is the last one.
+     * @return error code, KErrNone if decoding succeeds
+     *     If returns some other error, transaction must be cancelled.
+     */
+    TInt NextDataPart(
+        CBufFlat& aBuffer,
+        TInt& aPosition,
+        TBool aLastDataChunk );
+        
+    /**
+     * From MMmsCodecDataSink.
+     * Release data sink and free any resources
+     * This funktion must be called after last data chunk has been processed.
+     * This funktion must also be called if the process is terminated by an error.
+     *
+     * @since v3.1
+     */
+    void RelaseDataSink();
+    
+    /**
+     * Reset data sink.
+     * Delete all attachments from current message.
+     * Reset MMS headers
+     * Start message decoding from the beginning
+     * 
+     * This function must be called if transaction is interrupted and restarted
+     *
+     * @since v3.1
+     */
+    void ResetDataSink();
+    
+          
+private:
+
+    CMmsDecode();
+
+    /**
+     * @param aFs file system handle.
+     */
+    void ConstructL( RFs& aFs );
+
+    /**
+     * Active object completion.
+     */
+    void DoRunL();
+
+    /**
+     * Cleanup
+     * @param aStatus the completion code
+     */
+    void DoComplete( TInt& aStatus );
+
+    /**
+     * Select next state for state machine.
+     */
+    void SelectNextState();
+
+    /**
+     * Switch states.
+     */
+    void ChangeStateL();
+
+    /**
+     * Initialize members to allow several entry points.
+     * We have at least one service that does not preceed
+     * in stages, but completes in one shot.
+     */
+    void Reset();
+    
+    /**
+     * Header decode stage for chunked decoding
+     * @param aLastDataChunk is the data chunk the last one
+     * @return
+     * - ETrue if more data is needed to finish decoding the headers
+     * - EFalse if no more data is needed
+     */
+    TBool SinkHeaders( TBool aLastDataChunk );
+
+    /**
+     * Attachment header decode stage for chunked decoding
+     * @param aLastDataChunk is the data chunk the last one
+     * @return
+     * - ETrue if more data is needed to finish decoding the headers
+     * - EFalse if no more data is needed
+     */
+    TBool SinkAttachmentHeaders( TBool aLastDataChunk );
+    
+    /**
+     * Attachment data start stage for chunked decoding
+     */
+    void SinkAttachmentDataStart();
+    
+    /**
+     * Attachment data stage for chunked decoding
+     */
+    void SinkAttachmentData();
+    
+    /**
+     * Attachment data finished for chunked decoding
+     * @param aLastDataChunk is the data chunk the last one
+     */
+    void FinishSinkingAttachment( TBool aLastDataChunk );
+    
+    /**
+     * Last chunk postamble for chunked decoding
+     */
+    void FinalizeSinkingLastChunk();
+    
+    /**
+     * Do headers
+     */
+    void DecodeHeadersL();
+
+    /**
+     * Save the MMS headers
+     */
+    void SaveMMSHeadersL(); 
+
+    /**
+     * Decode one header
+     */
+    void DecodeOneHeaderL();
+    
+    /**
+     * Get one header.
+     * iPosition is advanced to point to the start of value. <br>
+     *     (value coding depends on header.) <br>
+     * If header name is unknown, pointer is advanced to point
+     *     beyond parameters.
+     * MMS headers only, assigned numbers only
+     * @return -1, if unknown header assignment
+     */
+    TInt GetHeaderName();
+
+    /**
+     * Skip an unknown header name.
+     */
+// no longer used     
+/*     
+    void SkipTextString();
+*/    
+
+    /**
+     * Skip field value (needed for unknown fields).
+     */ 
+    void SkipFieldValue();
+
+    /**
+     * Skip parameter name (needed for unsupported parameters).
+     */ 
+    void SkipParameterName();
+
+    /**
+     * Get uintvar that tells how many bytes will follow.
+     * @return decoded number according to WSP uintvar specs
+     */
+    TUint32 GetUintvar();
+
+    /**
+     * Decode From field.
+     * Caller must delete returned TDes16*
+     * @return descriptor holding the address in unicode
+     * (type has been removed)
+     * from is different from rest of addresses, as there 
+     * will be the "address present" token
+     */
+    HBufC16* DecodeFromL();
+    
+    /**
+     * Decode address.
+     * Caller must delete returned TDes16*
+     * @return descriptor holding the address in unicode
+     * (type has been removed)
+     */
+    HBufC16* DecodeAddressL();
+
+    /**
+     * Get simple text string.
+     * ASCII into unicode.
+     * @param aKeepQuote retain quote in the beginning of string.
+     *      Needed only when caled from GetEncodedTextStringL.
+     * @return descriptor holding unicode version of ASCII string
+     */
+    HBufC16* GetSimpleTextStringL( TBool aKeepQuote = EFalse );
+
+    /**
+     * Get encoded text string.
+     * Convert to unicode from character set specified.
+     * @return descriptor holding unicode version of string
+     */
+    HBufC16* GetEncodedTextStringL();
+
+    /**
+     * Get a text string as bytes (no conversions).
+     * Data is not copied! The result is valid only as long as the
+     *     source stays alive. The pointer will point to our
+     *     decoding buffer, so it is valid as long as we stay alive.
+     * @return descriptor pointing to byte string
+     */
+    TPtrC8 GetByteString();
+
+    /**
+     * Get a text string as bytes (no conversions).
+     * Data is not copied! The result is valid only as long as the
+     *     source stays alive. The pointer will point to our
+     *     decoding buffer, so it is valid as long as we stay alive.
+     * Leading 0x7F is removed, but characters from 0x80 to 0x8f are valid
+     * @return descriptor pointing to byte string
+     */
+    TPtrC8 GetUtf8String();
+
+    /**
+     * Get short integer or a long integer that is no longer than 32 bits.
+     * @return 32 bit integer
+     * If the length of the integer is more than 4 bytes, the field is skipped
+     */
+    TUint32 GetLongOrShortInteger();
+
+    /**
+     * Get an integer that may be up to 64 bits long (for example date).
+     * @return 64 bit integer
+     */
+    TInt64 GetVeryLongInteger();
+
+    /**
+     * Get a well known header assignment, skip field value if unknown coding.
+     * @return token value, 0 if unknown coding (text string etc.)
+     */
+    TUint8 GetWellKnownFieldValueOrSkip();
+
+    /**
+     * Get token and date or interval value for time fields that have alternate coding.
+     * @param aTime reference to 64 bit integer that receives
+     *     the time.
+     * @return absolute or reltive token, KMmsAbsoluteToken or
+     *     KMmsRelativeToken. Returns 0, if cannot interpret field.
+     */
+    TUint8 GetRelativeOrAbsoluteTime( TInt64& aTime );
+
+    /**
+     * Get field length and skip the bytes that indicate the length.
+     * If field is one-byte token, it is skipped and 0 is returned.
+     * If field is text string, the length of the string (including 
+     * terminating zero) is returned.
+     * The field can be skipped by adding the indicated number of bytes to
+     * current postition
+     * @return the length of the value. 0 if not enough data
+     */
+    TUint GetValueLength();
+    
+    /**
+     * Check if there is enough data in the buffer to decode a whole header
+     *
+     * @since v3.1
+     * iPosition is always restored to its original value.
+     *
+     * @return ETrue if a whole header and its value is in the buffer.
+     *     EFalse if not enough data and more should be obtained from the data source
+     */
+    TBool CheckHeaderLength();
+    
+    /**
+     * Check if there is enough data in the buffer to decode a whole value
+     *
+     * @since v3.1
+     *
+     * @param aCheckUintvarData ETrue if routine must check that enough data bytes
+     *     follow uintvar.
+     *     This is needed when uintvar specifies the length of a header
+     *     EFalse if only the integrity of the uintvar itself must be checked
+     * @return ETrue if a whole value is in the buffer.
+     *     EFalse if not enough data and more should be obtained from the data source
+     */
+    TBool CheckValueLength( TBool aCheckUintvarData );
+    
+    /**
+     * See if there are enough bytes in the buffer to define a legal uintvar
+     *
+     * @since v3.1
+     *
+     * @return ETrue if a whole value is in the buffer.
+     *     EFalse if not enough data and more should be obtained from the data source
+     *     After check iPosition still points to the beginning of the Uintvar checked
+     */
+    TBool CheckUintvarLength();
+
+    /**
+     * Get attachment mime type.
+     * @return pointer (with length) to the mime type string
+     */
+    TPtrC8 GetContentTypeL();
+
+    /**
+     * Get multipart content type.
+     * Also gets parameters for the multipart type (start).
+     * Root content type parameter is discarded (not used).
+     * Start-info parameter is discarded (unless we know how to use it!).
+     * @return assigned number for multipart content type,
+     *   0 if not multipart (monoblock body)   
+     */
+    TUint8 GetMultipartContentTypeL();
+
+    /**
+     * Get content type and content type parameters for one attachment
+     */
+    void GetAttachmentContentTypeL();
+
+    /**
+     * Decode one content header from multipart headers.
+     */
+    void DecodeOneContentHeaderL();
+
+    /**
+     * Get one content header.
+     * iPosition is advanced to point to the start of value.
+     *     (value coding depends on header.)
+     * @param atextHeader pointer set to header in text form
+     * @return assigned number of header
+     *      -1, if unknown header assignment
+     *      0x7f if textual header (to handle X-type headers)
+     */
+    TInt GetContentHeaderName( TPtrC8& aTextHeader );
+
+    /**
+     * Decode one attachment.
+     */
+    void DecodeOneAttachmentL();
+    
+    /**
+     * Decode attachment headers
+     */
+    void DecodeAttachmentHeadersL();
+     
+    /**
+     * Extract parameters that are separated by semicolons.
+     * Extracted parameters are stored to MIME headers.
+     * @param aBuffer content parameter string ( actual content type string removed already)
+     *     this should be of the form:
+     *     parameter1=value1;parameter2=value2;parameter3=value3
+     */
+    void ExtractContentTypeParametersL( const TPtrC8& aBuffer );
+
+    /**
+     * Try to form filename from possibly MIME-encoded string
+     * @param aSource suggestion for filename, may be MIME encoded
+     * @param aDestination full path and filename, if aSource is valid name.
+     * @param aPath path for the file.
+     * @return ETrue if aSource forms a valid filename, EFalse if not.
+     */
+    TBool MakeFilenameL( TPtrC8& aSource, TParse& aDestination, const TFileName& aPath );
+
+    /**
+     * Cleanup (close streams etc.).
+     */
+    void FinishL();
+    /**
+    * check DRM contents.
+    */
+    TBool CheckDRMContent();
+    /**
+     * Dump binary data into file.
+     */
+    void DumpL();
+    
+    /**
+     * Dump smil part into separate file if needed
+     @param aDataLength length of smil part
+     */
+    void DumpSmil(TInt aDataLength);
+
+    /**
+     * Log value yes/no
+     * @param aTitle title text
+     * @param aValue value that maps to KMmsYes or KMmsNo
+     */
+    void LogYesNo( TRefByValue<const TDesC> aTitle, TInt aValue );
+
+    /**
+     * Decode X-Mms-MM-Flags header and store value
+     */
+    void GetKeywordL();
+    
+    /** 
+     * Get active and complete own status with error code.
+     * To be used when state machine loop must be terminated with error
+     */
+    void CompleteSelf( TInt aError );
+    
+    /**
+     * Check if string contains only US-ASCII characters.
+     * @param aString the string to be checked
+     * @return ETrue = ASCII, EFalse = contains characters >= 0x80
+     */
+    TBool IsStringSafe( const TDesC8& aString );
+    
+    /**
+    * decode FROM header
+    */
+    void DecodeFromHeaderL();
+    
+    /**
+    * decode TO header
+    */
+    void DecodeToL();
+    
+    /**
+    * decode CC header
+    */
+    void DecodeCcL();
+    
+    /**
+    * decode BCC header
+    */
+    void DecodeBccL();
+    
+    /**
+    * decode content location header
+    */
+    void DecodeContentLocationHeaderL();
+    
+    /**
+    * Decode message date header
+    */
+    void DecodeDateHeaderL();
+    
+    /**
+    * Decode delivery report wanted header
+    */
+    void DecodeDeliveryReportHeader();
+    
+    /**
+    * Decode message delivery time header
+    */
+    void DecodeDeliveryTimeL();
+    
+    /**
+    * Decode message expiration header
+    */
+    void DecodeExpiryL();
+    
+    /**
+    * Decode Message Class header
+    */
+    void DecodeMessageClass();
+    
+    /**
+    * Decode message Id header
+    */
+    void DecodeMessageIdL();
+    
+    /**
+    * Decode Message Type Header
+    */
+    void DecodeMessageType();
+    
+    /**
+    * Decode MMS encapsulation version header
+    */
+    void DecodeMmsVersion();
+    
+    /**
+    * Decode message size header
+    */
+    void DecodeMessageSize();
+    
+    /**
+    * Decode priority header
+    */
+    void DecodePriority();
+    
+    /**
+    * Decode Read Reply wanted header
+    */
+    void DecodeReadReply();
+    
+    /**
+    * Decode delivery report sending allowed header
+    */
+    void DecodeReportAllowed();
+    
+    /**
+    * decode response status or retrieve status header
+    * @param aHeader tells if this is a response status or retrieve status
+    */
+    void DecodeResponseStatusL( TInt aHeader );
+    
+    /**
+    * decode response text or retrieve text header
+    */
+    void DecodeResponseTextL( TInt aHeader );
+    
+    /**
+    * Decode sender visibility header
+    */
+    void DecodeSenderVisibility();
+    
+    /**
+    * decode message status header
+    */
+    void DecodeStatus();
+    
+    /**
+    * decode subject header
+    */
+    void DecodeSubjectL();
+    
+    /**
+    * decode Transaction ID
+    */
+    void DecodeTidL();
+    
+    /**
+    * decode content type header
+    */
+    void DecodeContentTypeL();
+    
+    /**
+    * Decode read status header
+    */
+    void DecodeReadStatus();
+    
+    /**
+    * Decode Reply charging header
+    */
+    void DecodeReplyCharging();
+    
+    /**
+    * Decode reply charging deadline header
+    */
+    void DecodeReplyChargingDeadlineL();
+    
+    /**
+    * Decode Reply charging id header
+    */
+    void DecodeReplyChargingIdL();
+    
+    /**
+    * Decode Reply charging size header
+    */
+    void DecodeReplyChargingSize();
+    
+    /**
+    * Decode Previously-sent-by header
+    */
+    void DecodePreviousSenderL();
+    
+    /**
+    * Decode Previously sent date header
+    */
+    void DecodePreviouslySentDateL();
+    
+    /**
+    * Decode store-to-MMBox header
+    */
+    void DecodeStoreHeaderL();
+    
+    /**
+    * Decode State in MMBox
+    */
+    void DecodeMMBoxStateL();
+    
+    /**
+    * Decode MMBox Store status header
+    */
+    void DecodeMMBoxStoreStatusL();
+    
+    /**
+    * Decode MMBox Store status text header
+    */
+    void DecodeMMBoxStoreStatusTextL();
+    
+    /**
+    * Decode stored in MMBox header
+    */
+    void DecodeStoredInMMBoxHeaderL();
+    
+    /**
+    * Decode attributes header in MMBox View
+    */
+    void DecodeAttributesHeaderL();
+    
+    /**
+    * Decode Totals header in MMBox view
+    */
+    void DecodeTotalsL();
+    
+    /**
+    * Decode totals header in MMBox view
+    */
+    void DecodeMboxTotalsL();
+    
+    /**
+    * Decode MMBox View Quota header
+    */
+    void DecodeQuotaHeaderL();
+    
+    /**
+    * Decode MMBox Quota header
+    */
+    void DecodeMBoxQuotasL();
+    
+    /**
+    * Decode message count header in MMBox View
+    */
+    void DecodeMessageCountL();
+    
+    /**
+    * Decode start header in MMBox View
+    */
+    void DecodeStartInMMBoxViewL();
+    
+    /**
+    * Decode Distribution Indicator header
+    */
+    void DecodeDistributionIndicator();
+    
+    /**
+    * Decode Element descriptor header
+    */
+    void DecodeElementDescriptorL();
+    
+    /**
+    * Decode the limit header in MMBox view (max number of messages)
+    */
+    void DecodeMessageLimitL();
+    
+    /**
+    * Decode the extended notification header
+    */
+    void DecodeExtNotifTextL();
+
+    /**
+    * Decode the extended notification end of string indicator
+    */
+    void DecodeExtNotifEolL();
+    
+    /**
+    * Decode Content Class header
+    */
+    void DecodeContentClass();
+    
+    /**
+    * Decode DRM Content header
+    */
+    void DecodeDrmContentHeader();
+    
+    /**
+    * Decode Adaptation allowed header
+    */
+    void DecodeAdaptationAllowed();
+    
+    /**
+    * Decode application id header
+    */
+    void DecodeApplicationIdL();
+    
+    /**
+    * Decode reply to application id header 
+    */
+    void DecodeReplyApplicationIdL();
+    
+    /**
+    * Decode application info header
+    */
+    void DecodeApplicationInfoL();
+    
+    /**
+    * Decode recommended retrieval mode
+    */
+    void DecodeRecommendedRetrievalMode();
+
+    /**
+    * Decode explanation for the recommended retrieval mode
+    */
+    void DecodeRecommendedRetrievalModeTextL();
+    
+    /**
+    * Decode id of a message to be cancelled or replaced
+    */
+    void DecodeCancelReplaceIdL( TInt aHeader );
+    
+    /**
+    * Decode status of cancel operation
+    */
+    void DecodeCancelStatus();
+
+#ifndef _NO_MMSS_LOGGING_
+    /**
+     * log date
+     * @param aDate date to be logged
+     */
+    void LogDateL( const TInt64& aDate );
+#endif
+
+private:    // Data
+    RFs                 iFs; // file system
+    TInt                iError;
+    TInt                iState;
+    MMmsEntryWrapper*   iEntryWrapper;
+    CMmsHeaders*        iMmsHeaders;
+    CMsvMimeHeaders*    iMimeHeaders;
+
+    CBufFlat*           iDecodeBuffer;
+    TUint               iPosition;  // pointer to decode buffer
+    TUint               iLength;    // total length of the message to be encoded
+    TUint               iDataStart; // starting point of multipart data
+    TUint               iNextStart; // starting point of next multipart
+    TUint               iNumberOfAttachments;
+    TUint               iTotalSize;
+    // pointer to start of first text/plain part to be used to generate
+    // a description in case actual subject is missing
+    TUint               iFakeSubject;
+    TUint               iTextPlainLength; // length of the data
+    // IANA MIBEnum value of the first text/plain part
+    TUint               iCharacterSet;
+    // Assigned number for multipart body type.
+    // If not multipart, iMultipartType will be 0.
+    TUint8              iMultipartType;
+    TPtrC8              iRootContentId;
+    HBufC8*             iRootContentIdBuffer;
+    TMsvAttachmentId    iRootAttachmentId;
+    TMsvAttachmentId    iFirstAttachmentId; // if multipart/related,
+                        // and root not defined, first attachment is root
+    // Counter to generate filenames atta1, atta2, etc.
+    // Also keeps track of total number of attachments to support audio messaging
+    TInt                iAttaNumber;
+    TInt                iSmilCount; // counts the number of SMIL parts
+    TInt                iAudioCount; // counts the number of audio(amr) parts
+    
+    TInt32              iDRMFlags;
+
+    // iLogAllDecoded is obsolete - everything is logged in debug version
+    TBool               iLogAllDecoded;
+    TBool               iDumpIncoming;
+
+    TPtrC8              iMultipartRootType; // for logging only
+    TParse              iParse;     // parse buffer stores current atta filename
+    TBufC8<18>          iTempBuffer;
+    TInt                iPlainTexts; // number of plain text attachments
+    // if caller wants to know where position is, this pointer is non-zero
+    TInt*               iUpdatedPosition;
+    TBool               iDoNotUpdateParentEntry;
+    CMsvStore*          iStore; // store kept open to save several attachments
+    
+    TInt                iDecodingStage; // stage for chunked encoding
+    TInt                iCurrentAttaLength; // data length for current attachment
+    TInt                iAttaDataWritten; // data that has already been written to atta file
+    TInt                iOldData; // the amount of data left undecoded
+    TMsvAttachmentId    iCurrentAttachment;
+    TMsvAttachmentId    iFirstTextPlain;
+    TBool               iUseForSubject;
+    TBool               iRemoveDrm; // remove DRM atta (not really an error)
+    // Emergency brake to detect when last header has been decoded
+    // Needed when receiving a message that has no attachments from a server
+    // that always sends an empty last chunk
+    TBool               iLastHeader; 
+    
+        
+#ifndef _NO_MMSS_LOGGING_
+// iFilename is only needed when logging and dumping
+    TFileName           iFileName ; // filename buffer as member to save stack space
+#endif
+
+    };
+
+#endif      // CMMSDECODE_H
+            
+// End of File