diff -r 000000000000 -r 8e480a14352b messagingfw/msgsrvnstore/server/src/CMsvMimeHeaders.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgsrvnstore/server/src/CMsvMimeHeaders.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,736 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include + +#include +#include + +const TUid KUidMimeHeaders = {0x10204281}; +const TInt KDesCArrayGranularity = 8; +const TInt KStreamBufferGranularity = 512; + +_LIT8(KTxtWildcardBase64, "*base64*"); +_LIT8(KTxtWildcardQP, "*quoted-printable*"); +_LIT8(KTxtWildcard7Bit, "*7bit*"); +_LIT8(KTxtWildcard8Bit, "*8bit*"); +_LIT8(KTxtWildcardBinary, "*binary*"); +_LIT8(KTxtWildcardUU, "*uu*"); + +/** +Standard 2-phase construction, creates the mime headers object. + +Creates and initailises the mime headers with no data. + +@return Pointer to the created mime headers object. +*/ +EXPORT_C CMsvMimeHeaders* CMsvMimeHeaders::NewL() + { + CMsvMimeHeaders* self = NewLC(); + CleanupStack::Pop(self); + return self; + } + +/** +Standard 2-phase construction, creates the mime headers object. + +Creates and initailises the mime headers with no data. Leaves a pointer on the +cleanup stack. + +@return Pointer to the created mime headers object. +*/ +EXPORT_C CMsvMimeHeaders* CMsvMimeHeaders::NewLC() + { + CMsvMimeHeaders* self = new(ELeave) CMsvMimeHeaders(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CMsvMimeHeaders::CMsvMimeHeaders() + { + } + +void CMsvMimeHeaders::ConstructL() + { + iContentTypeParams = new(ELeave) CDesC8ArrayFlat(KDesCArrayGranularity); + iContentDispositionParams = new(ELeave) CDesC8ArrayFlat(KDesCArrayGranularity); + iXTypeParams = new(ELeave) CDesC8ArrayFlat(KDesCArrayGranularity); + } + +/** +Standard destructor. +*/ +EXPORT_C CMsvMimeHeaders::~CMsvMimeHeaders() + { + Reset(); + delete iContentTypeParams; + delete iContentDispositionParams; + delete iXTypeParams; + } + +/** +Resets the mime headers. + +Resets and removes all the mime headers and data that has been set. +*/ +EXPORT_C void CMsvMimeHeaders::Reset() + { + delete iContentDescription; + iContentDescription = NULL; + delete iContentBase; + iContentBase = NULL; + delete iContentLocation; + iContentLocation = NULL; + delete iContentId; + iContentId = NULL; + delete iContentType; + iContentType = NULL; + delete iContentSubType; + iContentSubType = NULL; + delete iContentDisposition; + iContentDisposition = NULL; + iContentTypeParams->Reset(); + iContentDispositionParams->Reset(); + iXTypeParams->Reset(); + iMimeCharset = 0; + delete iSuggestedFilename; + iSuggestedFilename = NULL; + delete iRelativePath; + iRelativePath = NULL; + iContentTransferEncoding = EEncodingTypeUnknown; + } + +/** +Returns the size of all the mime header data. + +Returns the approximate size in bytes of all the mime header data +stored by this object. The returned value is a sum of the lengths +of all the string data and the size of an integer for each integer +type data. + +@return The size in bytes of all the mime header data. +*/ +EXPORT_C TInt CMsvMimeHeaders::Size() const + { + TInt size = 0; + size += ContentDescription().Length(); + size += ContentBase().Length(); + size += ContentLocation().Length(); + size += ContentId().Length(); + size += ContentType().Length(); + size += ContentSubType().Length(); + size += ContentDisposition().Length(); + + TInt ii; + for( ii=0; iiPtr(0)); + CleanupStack::PopAndDestroy(streamBuffer); + } + +/** +Restores the mime header data. + +Restores all the mime header data from an existing attachment object. This +restores mime headers that was stored using the StoreL method. If the +attachment does not contain any mime headers, this object is reset. + +@param aAttachment The attachment object to restore the mime header data from. + +*/ +EXPORT_C void CMsvMimeHeaders::RestoreL(CMsvAttachment& aAttachment) + { + Reset(); + + TPtrC8 bufferPtr; + TInt err = aAttachment.GetDesC8Attribute(KUidMimeHeaders, bufferPtr); + if( err == KErrNone ) + { + RDesReadStream readStream(bufferPtr); + readStream.PushL(); + + iContentDescription = HBufC8::NewL(readStream, KMaxTInt); + iContentBase = HBufC8::NewL(readStream, KMaxTInt); + iContentLocation = HBufC16::NewL(readStream, KMaxTInt); + iContentId = HBufC8::NewL(readStream, KMaxTInt); + iContentType = HBufC8::NewL(readStream, KMaxTInt); + iContentSubType = HBufC8::NewL(readStream, KMaxTInt); + iContentDisposition = HBufC8::NewL(readStream, KMaxTInt); + + TInt count = readStream.ReadInt32L(); + TInt ii; + HBufC8* desBuffer; + for( ii=0; ii(readStream.ReadUint32L()); + + readStream.Close(); + CleanupStack::PopAndDestroy(&readStream); + } + // else do nothing if not found + } + +/** +Sets the Content-Description mime header. + +Over-writes any existing data. + +@param aContentDescription Descriptor conatining the Content-Description mime header. +*/ +EXPORT_C void CMsvMimeHeaders::SetContentDescriptionL(const TDesC8& aContentDescription) + { + delete iContentDescription; + iContentDescription = aContentDescription.AllocL(); + } + +/** +Gets the Content-Description mime header. + +Returns a zero length descriptor if mime header not set. + +@return Descriptor containing the Content-Description mime header. Zero length + if the mime header not set. +*/ +EXPORT_C const TDesC8& CMsvMimeHeaders::ContentDescription() const + { + if( iContentDescription==NULL ) + return KNullDesC8(); + + return *iContentDescription; + } + +/** +Sets the Content-Base mime header. + +Over-writes any existing data. + +@param aContentBase Descriptor conatining the Content-Base mime header. +*/ +EXPORT_C void CMsvMimeHeaders::SetContentBaseL(const TDesC8& aContentBase) + { + delete iContentBase; + iContentBase = aContentBase.AllocL(); + } + +/** +Gets the Content-Base mime header. + +Returns a zero length descriptor if mime header not set. + +@return Descriptor containing the Content-Base mime header. Zero length + if the mime header not set. +*/ +EXPORT_C const TDesC8& CMsvMimeHeaders::ContentBase() const + { + if( iContentBase==NULL) + return KNullDesC8(); + + return *iContentBase; + } + +/** +Sets the Content-Location mime header. + +Over-writes any existing data. + +@param aContentLocation Descriptor conatining the Content-Base mime header. +*/ +EXPORT_C void CMsvMimeHeaders::SetContentLocationL(const TDesC16& aContentLocation) + { + delete iContentLocation; + iContentLocation = aContentLocation.AllocL(); + } + +/** +Gets the Content-Location mime header. + +Returns a zero length descriptor if mime header not set. + +@return Descriptor containing the Content-Location mime header. Zero length + if the mime header not set. +*/ +EXPORT_C const TDesC16& CMsvMimeHeaders::ContentLocation() const + { + if( iContentLocation==NULL ) + return KNullDesC(); + + return *iContentLocation; + } + +/** +Sets the Content-Id mime header. + +Over-writes any existing data. + +@param aContentId Descriptor conatining the Content-Id mime header. +*/ +EXPORT_C void CMsvMimeHeaders::SetContentIdL(const TDesC8& aContentId) + { + delete iContentId; + iContentId = aContentId.AllocL(); + } + +/** +Gets the Content-Id mime header. + +Returns a zero length descriptor if mime header not set. + +@return Descriptor containing the Content-Id mime header. Zero length + if the mime header not set. +*/ +EXPORT_C const TDesC8& CMsvMimeHeaders::ContentId() const + { + if( iContentId==NULL ) + return KNullDesC8(); + + return *iContentId; + } + +/** +Sets the Content-Type mime header. + +Over-writes any existing data. This mime header contains the beginning part of the +mime-type, eg. the 'text' part of 'text/plain'. + +@param aContentType Descriptor conatining the Content-Type mime header. +*/ +EXPORT_C void CMsvMimeHeaders::SetContentTypeL(const TDesC8& aContentType) + { + delete iContentType; + iContentType = aContentType.AllocL(); + } + +/** +Gets the Content-Type mime header. + +Returns a zero length descriptor if mime header not set. This mime header contains +the beginning part of the mime-type, eg. the 'text' part of 'text/plain'. + +@return Descriptor containing the Content-Type mime header. Zero length + if the mime header not set. +*/ +EXPORT_C const TDesC8& CMsvMimeHeaders::ContentType() const + { + if( iContentType==NULL ) + return KNullDesC8(); + + return *iContentType; + } + +/** +Sets the Content-SubType mime header. + +Over-writes any existing data. This mime header contains the end part of the +mime-type, eg. the 'plain' part of 'text/plain'. + +@param aContentSubType Descriptor conatining the Content-SubType mime header. +*/ +EXPORT_C void CMsvMimeHeaders::SetContentSubTypeL(const TDesC8& aContentSubType) + { + delete iContentSubType; + iContentSubType = aContentSubType.AllocL(); + } + +/** +Gets the Content-SubType mime header. + +Returns a zero length descriptor if mime header not set. This mime header contains +the end part of the mime-type, eg. the 'plain' part of 'text/plain'. + +@return Descriptor containing the Content-SubType mime header. Zero length + if the mime header not set. +*/ +EXPORT_C const TDesC8& CMsvMimeHeaders::ContentSubType() const + { + if( iContentSubType==NULL ) + return KNullDesC8(); + + return *iContentSubType; + } + +/** +Sets the Content-Disposition mime header. + +Over-writes any existing data. + +@param aContentId Descriptor conatining the Content-Disposition mime header. +*/ +EXPORT_C void CMsvMimeHeaders::SetContentDispositionL(const TDesC8& aContentDisposition) + { + delete iContentDisposition; + iContentDisposition = aContentDisposition.AllocL(); + } + +/** +Gets the Content-Disposition mime header. + +Returns a zero length descriptor if mime header not set. + +@return Descriptor containing the Content-Disposition mime header. Zero length + if the mime header not set. +*/ +EXPORT_C const TDesC8& CMsvMimeHeaders::ContentDisposition() const + { + if( iContentDisposition==NULL ) + return KNullDesC8(); + + return *iContentDisposition; + } + +/** +Returns a modifiable descriptor array containing the Content-Type parameters. + +@return A modifiable descriptor array. +*/ +EXPORT_C CDesC8Array& CMsvMimeHeaders::ContentTypeParams() + { + return *iContentTypeParams; + } + +/** +Returns a modifiable descriptor array containing the Content-Disposition parameters. + +@return A modifiable descriptor array. +*/ +EXPORT_C CDesC8Array& CMsvMimeHeaders::ContentDispositionParams() + { + return *iContentDispositionParams; + } + +/** +Returns a modifiable descriptor array containing the X-Type parameters. + +@return A modifiable descriptor array. +*/ +EXPORT_C const CDesC8Array& CMsvMimeHeaders::XTypeParams() const + { + return *iXTypeParams; + } + +/** +Returns a non-modifiable descriptor array containing the Content-Type parameters. + +@return A non-modifiable descriptor array. +*/ +EXPORT_C const CDesC8Array& CMsvMimeHeaders::ContentTypeParams() const + { + return *iContentTypeParams; + } + +/** +Returns a non-modifiable descriptor array containing the Content-Disposition parameters. + +@return A non-modifiable descriptor array. +*/ +EXPORT_C const CDesC8Array& CMsvMimeHeaders::ContentDispositionParams() const + { + return *iContentDispositionParams; + } + +/** +Returns a non-modifiable descriptor array containing the X-Type parameters. + +@return A non-modifiable descriptor array. +*/ +EXPORT_C CDesC8Array& CMsvMimeHeaders::XTypeParams() + { + return *iXTypeParams; + } + +/** +Sets the mime charset header. + +Over-writes any existing data. + +@param Integer representing the mime charset. +*/ +EXPORT_C void CMsvMimeHeaders::SetMimeCharset(TUint aMimeCharset) + { + iMimeCharset = aMimeCharset; + } + +/** +Gets the mime charset header. + +@return An integer representing the mime charset. +*/ +EXPORT_C TUint CMsvMimeHeaders::MimeCharset() const + { + return iMimeCharset; + } + +/** +Sets the suggested filename mime header. + +Over-writes any existing data. + +@param aSuggestedFilename Descriptor containing the suggested filename mime header data. +*/ +EXPORT_C void CMsvMimeHeaders::SetSuggestedFilenameL(const TDesC16& aSuggestedFilename) + { + delete iSuggestedFilename; + iSuggestedFilename = aSuggestedFilename.AllocL(); + } + +/** +Gets the suggested filename mime header. + +Returns a zero length descriptor if header is not set. + +@return Descriptor containing the suggested filename mime header. Zero length + if the header not set. +*/ +EXPORT_C const TDesC16& CMsvMimeHeaders::SuggestedFilename() const + { + if( iSuggestedFilename==NULL ) + return KNullDesC(); + + return *iSuggestedFilename; + } + +/** +Sets the relative path header. + +Over-writes any existing data. + +@param aSuggestedFilename Descriptor containing the suggested filename header data. +*/ +EXPORT_C void CMsvMimeHeaders::SetRelativePathL(const TDesC8& aRelativePath) + { + delete iRelativePath; + iRelativePath = aRelativePath.AllocL(); + } + +/** +Gets the relative path mime header. + +Returns a zero length descriptor if header is not set. + +@return Descriptor containing the relative path mime header. Zero length + if the header not set. +*/ +EXPORT_C const TDesC8& CMsvMimeHeaders::RelativePath() const + { + if( iRelativePath==NULL ) + return KNullDesC8(); + + return *iRelativePath; + } + +/** +Sets the Content-Transfer Encoding mime header. + +Over-writes any existing data. + +@param aEncodingType Descriptor conatining the Content-Transfer Encoding mime header. +*/ +EXPORT_C void CMsvMimeHeaders::SetContentTransferEncoding(const TDesC8& aEncodingType) + { + iContentTransferEncoding = EEncodingTypeUnknown; + + if (KErrNone==aEncodingType.MatchF(KTxtWildcardBase64)) + iContentTransferEncoding = EEncodingTypeBASE64; + else if (KErrNone==aEncodingType.MatchF(KTxtWildcardQP)) + iContentTransferEncoding = EEncodingTypeQP; + else if (KErrNone==aEncodingType.MatchF(KTxtWildcard7Bit)) + iContentTransferEncoding = EEncodingType7Bit; + else if (KErrNone==aEncodingType.MatchF(KTxtWildcard8Bit)) + iContentTransferEncoding = EEncodingType8Bit; + else if (KErrNone==aEncodingType.MatchF(KTxtWildcardBinary)) + iContentTransferEncoding = EEncodingTypeBinary; + else if (KErrNone==aEncodingType.MatchF(KTxtWildcardUU)) // can't be right - there's no MIME standard text to describe UU is there?? + iContentTransferEncoding = EEncodingTypeUU; + } + +/** +Gets the Content-Transfer Encoding mime header. + +@return An enumeration of the Content-Transfer Encoding header. Returns EEncodingTypeUnknown if not set. +@see TMsvEncodingType +*/ +EXPORT_C CMsvMimeHeaders::TMsvEncodingType CMsvMimeHeaders::ContentTransferEncoding() const + { + return iContentTransferEncoding; + } + +/** +Gets the Content-Transfer Encoding mime header. + +Also provides a descriptor that contains a textual representation of the content-transfer +encoding header. + +@param aEncodingType This desriptor is set to a textual representation of the mime header. + Returns a zero-length +@return An enumeration of the Content-Transfer Encoding header. Returns EEncodingTypeUnknown if not set. +@see TMsvEncodingType +*/ +EXPORT_C CMsvMimeHeaders::TMsvEncodingType CMsvMimeHeaders::ContentTransferEncoding(TPtrC8& aEncodingType) const + { + switch (iContentTransferEncoding) + { + case EEncodingTypeBASE64: + aEncodingType.Set(KMsvBase64String); + break; + case EEncodingTypeQP: + aEncodingType.Set(KMsvQPString); + break; + case EEncodingType7Bit: + aEncodingType.Set(KMsv7BitString); + break; + case EEncodingType8Bit: + aEncodingType.Set(KMsv8BitString); + break; + case EEncodingTypeBinary: + aEncodingType.Set(KMsvBinaryString); + break; + case EEncodingTypeUU: + aEncodingType.Set(KMsvUUString); + break; + case EEncodingTypeNone: + case EEncodingTypeUnknown: + default: + aEncodingType.Set(KNullDesC8()); + break; + } + return iContentTransferEncoding; + } + +/** +Gets the Content-Type mime header parameter value. + +This method finds the specifed parameter and extracts the value for it. + +@param aContentTypeParameter The Content-Type parameter to get the value for. +@return The Content-Type parameter value requested. Returns a zero-length if + the paramter cannot be found. +*/ +EXPORT_C const TPtrC8 CMsvMimeHeaders::GetContentTypeValue(const TDesC8& aContentTypeParameter) const + { + __ASSERT_DEBUG (!(iContentTypeParams->Count()&1), User::Invariant()); // Should not have odd number of elements + + TInt result; + if (KErrNone==iContentTypeParams->Find(aContentTypeParameter,result,ECmpFolded8)) + { + ++result; + if ((result&1) && result <= iContentTypeParams->Count()) // check result+1 is odd & entry exists + { + return ContentTypeParams()[result]; + } + } + return KNullDesC8(); // couldn't find match so return an empty descriptor + } + +/** +Enquire whether a CMsvAttachment has MIME headers without restoring all the headers. + +@param aAttachment The attachment. +@return True if there is an MIME headers +*/ +EXPORT_C TBool CMsvMimeHeaders::ContainsMimeHeaders(const CMsvAttachment& aAttachment) + { + TPtrC8 bufferPtr; + return (aAttachment.GetDesC8Attribute(KUidMimeHeaders, bufferPtr) == KErrNone); + } +