--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgutils/unidatautils/unidatamodel/src/UniMimeInfo.cpp Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,338 @@
+/*
+* Copyright (c) 2005 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:
+* CUniMimeInfo, Storage for objects mime headers.
+*
+*
+*/
+
+
+// ========== INCLUDE FILES ================================
+
+#include <e32def.h> // for basic types
+#include <eikenv.h> // for CBase
+#include <msvstd.h> // for TMsvId
+#include <msvids.h> // for KMsvTempIndexEntryId
+
+#include <mmsvattachmentmanager.h>
+#include <cmsvattachment.h>
+#include <cmsvmimeheaders.h>
+
+#include "msgtextutils.h"
+#include "UniModelConst.h"
+#include "UniDataUtils.h"
+#include "UniMimeInfo.h"
+
+// ========== EXTERNAL DATA STRUCTURES =====================
+
+// ========== EXTERNAL FUNCTION PROTOTYPES =================
+
+// ========== CONSTANTS ====================================
+
+// Maximum num of characters for descriptors stored in HBufC members
+const TInt KMaxMimeFieldLength = 260;
+const TInt KMaxContentLocation = 100; // Max byte size for content location
+
+// From RFC2183. Content-Disposition filename max length.
+// Does not need special handling.
+//const TInt KMaxMimeFieldParamLength = 78;
+
+// ========== MACROS =======================================
+
+// ========== LOCAL CONSTANTS AND MACROS ===================
+
+// ========== MODULE DATA STRUCTURES =======================
+
+
+// ========== LOCAL FUNCTION PROTOTYPES ====================
+
+// ========== LOCAL FUNCTIONS ==============================
+
+// ========== MEMBER FUNCTIONS =============================
+
+
+// ---------------------------------------------------------
+// CUniMimeInfo
+//
+// Constructor
+// ---------------------------------------------------------
+//
+CUniMimeInfo::CUniMimeInfo() : iContentTypeCharset(0)
+ {
+ }
+
+// ---------------------------------------------------------
+// CUniMimeInfo
+//
+// Destructor.
+// ---------------------------------------------------------
+//
+CUniMimeInfo::~CUniMimeInfo()
+ {
+ delete iContentDescription;
+ delete iContentBase;
+ delete iContentLocation;
+ delete iContentId;
+ delete iContentType;
+ delete iContentDisposition;
+ }
+
+
+// ---------------------------------------------------------
+// Accessors/Mutators
+// ---------------------------------------------------------
+
+// ---------------------------------------------------------
+// SetContentTypeL
+// NOTE: 8 bit.
+// ---------------------------------------------------------
+void CUniMimeInfo::SetContentTypeL( const TDesC8& aSourceDesc )
+ {
+ if ( aSourceDesc.Length() > KMaxMimeFieldLength )
+ User::Leave( KErrArgument );
+
+ HBufC8* buf = aSourceDesc.AllocL();
+ delete iContentType;
+ iContentType = buf;
+ }
+
+// ---------------------------------------------------------
+// SetContentLocationL
+// NOTE: 16 bit.
+// ---------------------------------------------------------
+void CUniMimeInfo::SetContentLocationL( const TDesC& aSourceDesc )
+ {
+ TInt copyLen = aSourceDesc.Length();
+ if ( copyLen > KMaxContentLocation )
+ {
+ copyLen = KMaxContentLocation;
+ }
+
+ HBufC* buf = HBufC::NewL( copyLen );
+ *buf = aSourceDesc.Left( copyLen );
+ delete iContentLocation;
+ iContentLocation = buf;
+ }
+
+// ---------------------------------------------------------
+// SetContentIdL
+// NOTE: 8 bit.
+// ---------------------------------------------------------
+void CUniMimeInfo::SetContentIdL( const TDesC8& aSourceDesc )
+ {
+ if ( aSourceDesc.Length() > KMaxMimeFieldLength )
+ User::Leave( KErrArgument );
+
+ HBufC8* buf = aSourceDesc.AllocL();
+ delete iContentId;
+ iContentId = buf;
+ }
+
+// ---------------------------------------------------------
+// SetContentBaseL
+// NOTE: 8 bit.
+// ---------------------------------------------------------
+void CUniMimeInfo::SetContentBaseL( const TDesC8& aSourceDesc )
+ {
+ if ( aSourceDesc.Length() > KMaxMimeFieldLength )
+ User::Leave( KErrArgument );
+
+ HBufC8* buf = aSourceDesc.AllocL();
+ delete iContentBase;
+ iContentBase = buf;
+ }
+
+// ---------------------------------------------------------
+// SetContentDescriptionL
+// NOTE: 8 bit.
+// ---------------------------------------------------------
+void CUniMimeInfo::SetContentDescriptionL( const TDesC8& aSourceDesc )
+ {
+ if ( aSourceDesc.Length() > KMaxMimeFieldLength )
+ User::Leave( KErrArgument );
+
+ HBufC8* buf = aSourceDesc.AllocL();
+ delete iContentDescription;
+ iContentDescription = buf;
+ }
+
+// ---------------------------------------------------------
+// SetContentDispositionL
+// NOTE: 8 bit.
+// ---------------------------------------------------------
+void CUniMimeInfo::SetContentDispositionL( const TDesC8& aSourceDesc )
+ {
+ if ( aSourceDesc.Length() > KMaxMimeFieldLength )
+ User::Leave( KErrArgument );
+
+ HBufC8* buf = aSourceDesc.AllocL();
+ delete iContentDisposition;
+ iContentDisposition = buf;
+ }
+
+// ---------------------------------------------------------
+// Size
+// ---------------------------------------------------------
+TInt CUniMimeInfo::Size() const
+ {
+ // TODO: Check that MIME info size matches to the actual
+ // MIME header size
+ //TInt size = sizeof( iContentTypeCharset );
+ TInt size = sizeof( TUint32 ); // mmsengine uses this
+
+ if ( iContentDescription ) size += iContentDescription->Size();
+
+ if ( iContentBase ) size += iContentBase->Size();
+
+ if ( iContentLocation ) size += iContentLocation->Size();
+
+ if ( iContentId ) size += iContentId->Size();
+
+ if ( iContentType ) size += iContentType->Size();
+
+ if ( iContentDisposition ) size += iContentDisposition->Size();
+
+ return size;
+ }
+
+// ---------------------------------------------------------
+// CUniMimeInfo::SaveMimeInfoL
+//
+// Save MIME info
+// ---------------------------------------------------------
+//
+void CUniMimeInfo::SaveMimeInfoL( MMsvAttachmentManager& aManager, CMsvAttachment& aAttachment )
+ {
+ // Content-Location.
+ HBufC* safeContentLocation = CMsgTextUtils::GetSafeAttachmentNameLC(
+ aManager,
+ ContentLocation(),
+ aAttachment.Id(),
+ ETrue );
+ SetContentLocationL( *safeContentLocation );
+ CleanupStack::PopAndDestroy( safeContentLocation );
+
+ CMsvMimeHeaders* msvMime = CMsvMimeHeaders::NewLC();
+ msvMime->RestoreL( aAttachment );
+
+ msvMime->SetContentLocationL( *iContentLocation );
+
+ // Content-type
+ if ( iContentType )
+ {
+ TInt slash = iContentType->Locate( '/' );
+ if ( slash != KErrNotFound )
+ {
+ msvMime->SetContentTypeL( iContentType->Left( slash ) );
+ msvMime->SetContentSubTypeL( iContentType->Mid( slash + 1 ) );
+ }
+ }
+
+ // Character set
+ if ( iContentTypeCharset )
+ {
+ msvMime->SetMimeCharset( iContentTypeCharset );
+ }
+ // Content-Id
+ if ( iContentId && iContentId->Length() )
+ {
+ msvMime->SetContentIdL( *iContentId );
+ }
+ // Content-Description
+ if ( iContentDescription && iContentDescription->Length() )
+ {
+ msvMime->SetContentDescriptionL( *iContentDescription );
+ }
+ // Content-Base
+ if ( iContentBase && iContentBase->Length() )
+ {
+ msvMime->SetContentBaseL( *iContentBase );
+ }
+ // Content-Disposition
+ if ( iContentDisposition && iContentDisposition->Length() )
+ {
+ msvMime->SetContentDispositionL( *iContentDisposition );
+ }
+ msvMime->StoreL( aAttachment );
+ CleanupStack::PopAndDestroy( msvMime );
+ }
+
+// ---------------------------------------------------------
+// CUniMimeInfo::DoReadMimeInfoL
+//
+// Reads mime info from clientMtm to aMimeInfo.
+// If function leaves whole MimeInfo object should be considered
+// invalid.
+// ---------------------------------------------------------
+//
+
+void CUniMimeInfo::ReadMimeInfoL( CMsvAttachment& aAttachment )
+ {
+ CMsvMimeHeaders* msvMime = CMsvMimeHeaders::NewLC();
+ msvMime->RestoreL( aAttachment );
+
+ // Content-Location
+ SetContentLocationL( msvMime->ContentLocation() );
+
+ // Content-ID
+ SetContentIdL( msvMime->ContentId() );
+
+ TBuf8<KMaxDataTypeLength> contentType;
+ contentType.Copy( msvMime->ContentType() );
+ contentType.Append( _L8("/") );
+ contentType.Append( msvMime->ContentSubType() );
+ // Content-type
+ SetContentTypeL( contentType );
+
+ // Character set
+ SetCharset( msvMime->MimeCharset() );
+
+ // Content-Description
+ SetContentDescriptionL( msvMime->ContentDescription() );
+
+ // Content-Base
+ SetContentBaseL( msvMime->ContentBase() );
+
+ // Content-Disposition
+ SetContentDispositionL( msvMime->ContentDisposition() );
+
+ CleanupStack::PopAndDestroy( msvMime );
+ }
+
+// ---------------------------------------------------------
+// EnsureContentLocationL
+// ---------------------------------------------------------
+void CUniMimeInfo::EnsureContentLocationL(
+ MMsvAttachmentManager& aManager,
+ CMsvAttachment& aAttachment,
+ TDesC& aPlainFileName )
+ {
+ if ( !ContentLocation().Length() && aPlainFileName.Length() )
+ {
+ // Generate safe content location from file name
+ HBufC* contLoc = CMsgTextUtils::GetSafeAttachmentNameLC(
+ aManager,
+ aPlainFileName,
+ aAttachment.Id(),
+ ETrue );
+ SetContentLocationL( *contLoc );
+
+ CleanupStack::PopAndDestroy( contLoc );
+
+ // Save ContentLocation.
+ SaveMimeInfoL( aManager, aAttachment );
+ }
+ }
+
+// EOF