diff -r 000000000000 -r 72b543305e3a mmsengine/mmscodec/inc/mmsdecode.h --- /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 +#include + +#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.
+ * (value coding depends on header.)
+ * 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 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