messagingapp/msgutils/unidatautils/unidatamodel/src/UniMimeInfo.cpp
changeset 25 84d9eb65b26f
--- /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