mmsengine/mmsmessage/src/mmscliententry.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsengine/mmsmessage/src/mmscliententry.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,472 @@
+/*
+* Copyright (c) 2004 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:  
+*      Entry wrapper implementing MMmsEntry for client side.
+*      Hides difference between CMscEntry and CMsvServerEntry
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include    <e32std.h>
+
+#include    <msventry.h>
+#include    <msvstd.h>
+#include    <msvapi.h> //Message Server
+#include    <badesca.h>
+#include    <cmsvmimeheaders.h>
+#include    <mmsvattachmentmanager.h>
+#include    <mmsvattachmentmanagersync.h>
+#include    <centralrepository.h>
+
+#include    "mmscliententry.h"
+#include    "MmsEnginePrivateCRKeys.h"
+#include    "mmsheaders.h"
+#include    "mmsattachmenthandler.h"
+#include    "mmsgenutils.h"
+
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ==================== LOCAL FUNCTIONS ====================
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CMmsClientEntry::CMmsClientEntry( RFs& aFs, CMsvEntry& aEntry ):
+    iFs ( aFs ),
+    iCMsvEntry ( aEntry )
+    {
+    }
+
+// EPOC default constructor can leave.
+void CMmsClientEntry::ConstructL( TMsvId aServiceId  )
+    {
+    iServiceId = aServiceId;
+    iMessageEntry = iCMsvEntry.EntryId();
+    if ( iMessageEntry == iServiceId )
+        {
+        iMessageEntry = KMsvNullIndexEntryId;
+        }
+    iMessageDrive = iCMsvEntry.Session().CurrentDriveL();
+    
+    TMmsGenUtils::GetLoggingSettings( iLogAllDecoded, iDump );
+    
+    }
+
+// Two-phased constructor.
+EXPORT_C CMmsClientEntry* CMmsClientEntry::NewL( RFs& aFs, CMsvEntry& aEntry, TMsvId aServiceId )
+    {
+    CMmsClientEntry* self = new (ELeave) CMmsClientEntry(aFs, aEntry );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL( aServiceId );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+    
+// Destructor
+CMmsClientEntry::~CMmsClientEntry()
+    {
+    if ( iFileOpen )
+        {
+        iAttaFile.Close();
+        iFileOpen = EFalse;
+        }
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::EditStoreL
+// ---------------------------------------------------------
+//
+CMsvStore* CMmsClientEntry::EditStoreL()
+    {
+    return iCMsvEntry.EditStoreL();
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::ReadStoreL
+// ---------------------------------------------------------
+//
+CMsvStore* CMmsClientEntry::ReadStoreL()
+    {
+    return iCMsvEntry.ReadStoreL();
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::GetIndexEntry
+// ---------------------------------------------------------
+//
+TInt CMmsClientEntry::GetIndexEntry( TMsvEntry& aTMsvEntry )
+    {
+    if ( iMessageEntry == KMsvNullIndexEntryId )
+        {
+        return KErrNotFound;
+        }
+    aTMsvEntry = iCMsvEntry.Entry();
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::ChangeIndexEntry
+// ---------------------------------------------------------
+//
+TInt CMmsClientEntry::ChangeIndexEntry( TMsvEntry& aTMsvEntry )
+    {
+    if ( iMessageEntry == KMsvNullIndexEntryId )
+        {
+        return KErrNotFound;
+        }
+    TRAPD( error, iCMsvEntry.ChangeL( aTMsvEntry ) );
+    return error;
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::SetContext
+// ---------------------------------------------------------
+//
+TInt CMmsClientEntry::SetCurrentEntry( TMsvId aEntryId )
+    {
+    if ( iMessageEntry == aEntryId && iCMsvEntry.Entry().Id() == aEntryId )
+        {
+        // we already have the context
+        return KErrNone;
+        }
+    TRAPD( error, iCMsvEntry.SetEntryL( aEntryId ) );
+    if ( error == KErrNone )
+        {
+        iMessageEntry = aEntryId;
+        }
+    else
+        {
+        iMessageEntry = KMsvNullIndexEntryId;
+        }
+        
+    return error;
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::AttachmentsSize
+// ---------------------------------------------------------
+//
+TInt CMmsClientEntry::AttachmentsSizeL( CMsvStore& aStore )
+    {
+    return CMmsAttachmentHandler::AttachmentsSizeL( aStore );
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::DiskSpaceBelowCriticalLevelL
+// ---------------------------------------------------------
+//
+TInt CMmsClientEntry::DiskSpaceBelowCriticalLevelL( TInt aDataSize )
+    {
+    TInt error = KErrNone;
+
+    if ( TMmsGenUtils::DiskSpaceBelowCriticalLevelL(
+        &iFs, aDataSize, iMessageDrive ) )
+        {
+        error = KErrDiskFull;
+        }
+
+    return error;
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::
+// ---------------------------------------------------------
+//
+TInt CMmsClientEntry::StoreMmsHeadersL( CMmsHeaders& aMmsHeaders, CMsvStore* aStore )
+    {
+    TInt error = KErrNone;
+    if ( DiskSpaceBelowCriticalLevelL( aMmsHeaders.Size() ) )
+        {
+        error = KErrDiskFull;
+        }
+        
+    if ( error == KErrNone )
+        {
+        CMsvStore* store = aStore;
+        if ( !aStore )
+            {
+            store = iCMsvEntry.EditStoreL();
+            CleanupStack::PushL( store );
+            }
+        aMmsHeaders.StoreL( *store );
+        if ( !aStore )
+            {
+            store->CommitL();
+            CleanupStack::PopAndDestroy( store );
+            }
+        }
+
+    return error;
+   }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::
+// ---------------------------------------------------------
+//
+void CMmsClientEntry::RestoreMmsHeadersL( CMmsHeaders& aMmsHeaders, CMsvStore* aStore )
+    {
+    // The entry must be kept pointing to the message entry
+    // As all attachment are stored to the message enrty, it is
+    // no longer necessary to switch the context between message
+    // entry and attachment entry.
+    CMsvStore* store = aStore;
+    if ( !aStore )
+        {
+        store = iCMsvEntry.ReadStoreL();
+        CleanupStack::PushL( store );
+        }
+    aMmsHeaders.RestoreL( *store );
+    if ( !aStore )
+        {
+        CleanupStack::PopAndDestroy( store );
+        }
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::
+// ---------------------------------------------------------
+//
+TInt CMmsClientEntry::CreateFileAttachmentL(
+            CMsvStore& aStore,
+            const TDesC& aFileName,
+            const TPtrC8& aAttachmentData,
+            CMsvMimeHeaders& aMimeHeaders,
+            TMsvAttachmentId& aAttachment,
+            TInt& aAttachmentSize,
+            TInt32& aDRMFlags )
+    {
+    TInt error = KErrNone;
+    CreateEmptyFileAttachmentL(
+        aStore,
+        aFileName,
+        aMimeHeaders,
+        aAttachment );
+        
+    error = ProcessAttachmentDataL( aAttachmentData, aDRMFlags );
+       
+    TInt error2 = KErrNone;
+    error2 = FinalizeAttachmentL( aStore, aAttachmentSize, aDRMFlags );
+    
+    if ( error == KErrNone )
+        {
+        error = error2;
+        }
+
+    return error;
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::
+// ---------------------------------------------------------
+//
+TInt CMmsClientEntry::DeleteEntry( TMsvId aEntryIndex )
+    {
+    TInt error = KErrNone;
+    TRAP( error,
+        {
+        iCMsvEntry.SetEntryL( aEntryIndex );
+        iCMsvEntry.SetEntryL( iCMsvEntry.Entry().Parent() );
+        iCMsvEntry.DeleteL( aEntryIndex );
+        } )
+    
+    if ( error == KErrNotFound )
+        {
+        error = KErrNone;
+        }
+        
+    iMessageEntry = KMsvNullIndexEntryId;
+        
+    return error;
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::
+// ---------------------------------------------------------
+//
+TBool CMmsClientEntry::IsValidFilename(
+            const TPtrC& aFileName )
+    {
+    return CMmsAttachmentHandler::IsValidFilename( iFs, aFileName );
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::
+// ---------------------------------------------------------
+//
+TBool CMmsClientEntry::GetDecodingFlag()
+    {
+    return iLogAllDecoded;
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::
+// ---------------------------------------------------------
+//
+TBool CMmsClientEntry::GetDumpFlag()
+    {
+    return iDump;
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::
+// ---------------------------------------------------------
+//
+void CMmsClientEntry::CreateEmptyFileAttachmentL(
+    CMsvStore& aStore,
+    const TDesC& aFileName,
+    CMsvMimeHeaders& aMimeHeaders,
+    TMsvAttachmentId& aAttachment)
+    {
+    
+    iAttaId = 0;
+    if ( iFileOpen )
+        {
+        iAttaFile.Close();
+        iFileOpen = EFalse;
+        }
+    
+    // store must be created before attachmentInfo because attachment info ownership
+    // will be transferred to attachment manager
+    
+    CMsvAttachment* attachmentInfo = CMsvAttachment::NewL( CMsvAttachment::EMsvFile );
+    CleanupStack::PushL( attachmentInfo );
+    
+    attachmentInfo->SetAttachmentNameL( aFileName );
+    // We must set size after the data has been saved
+    attachmentInfo->SetComplete( ETrue );
+    
+    // take type from mime headers
+    HBufC8* tempContentType = HBufC8::NewL( aMimeHeaders.ContentType().Length() +
+       aMimeHeaders.ContentSubType().Length() + 1 );
+    CleanupStack::PushL( tempContentType );
+    tempContentType->Des().Copy( aMimeHeaders.ContentType() );
+    tempContentType->Des().Append( KMmsSlash8 );
+    tempContentType->Des().Append( aMimeHeaders.ContentSubType() );
+    attachmentInfo->SetMimeTypeL( tempContentType->Des() );
+    CleanupStack::PopAndDestroy( tempContentType );
+
+    aMimeHeaders.StoreL( *attachmentInfo ); // Mime headers are streamed into atta info
+    
+    if ( DiskSpaceBelowCriticalLevelL( aMimeHeaders.Size() ) )
+        {
+        // attachmentInfo ownership was not transferred - it must be destroyed
+        CleanupStack::PopAndDestroy( attachmentInfo );
+        User::Leave( KErrDiskFull );
+        }
+        
+    MMsvAttachmentManagerSync& attaMan = aStore.AttachmentManagerExtensionsL();
+    attaMan.CreateAttachmentL( aFileName, iAttaFile, attachmentInfo );
+    CleanupStack::Pop( attachmentInfo ); // attachmentInfo ownership was transferred.
+    aAttachment = attachmentInfo->Id();
+    iAttaId = aAttachment;
+    iFileOpen = ETrue;
+        
+    }
+
+// ---------------------------------------------------------
+// CMmsClientEntry::
+// ---------------------------------------------------------
+//
+TInt CMmsClientEntry::ProcessAttachmentDataL(
+    const TPtrC8& aAttachmentData,
+    TInt32& /*aDRMFlags*/ )
+    {
+    if ( DiskSpaceBelowCriticalLevelL( aAttachmentData.Size() ) )
+        {
+        return KErrDiskFull;
+        }
+    else
+        {
+        return iAttaFile.Write( aAttachmentData );
+        }
+    }
+    
+// ---------------------------------------------------------
+// CMmsClientEntry::
+// ---------------------------------------------------------
+//
+TInt CMmsClientEntry::FinalizeAttachmentL(
+    CMsvStore& aStore,
+    TInt& aAttachmentSize,
+    TInt32& /*aDRMFlags*/ )
+    {
+    TInt error = KErrNone;
+    
+    TInt size = 0;
+    if ( iFileOpen )
+        {
+        error = iAttaFile.Flush();
+        iAttaFile.Size( size );
+        }
+    aAttachmentSize = size;
+    
+    if ( iFileOpen )
+        {
+        iAttaFile.Close();
+        iFileOpen = EFalse;
+        }
+    
+    MMsvAttachmentManager& attaMan = aStore.AttachmentManagerL();
+    MMsvAttachmentManagerSync& attaManSync = aStore.AttachmentManagerExtensionsL();
+    
+    if ( size == 0 )
+        {
+        // if file was not open, open it and get the size
+        RFile handle = attaMan.GetAttachmentFileL( iAttaId );
+        handle.Size( size );            
+        handle.Close();
+        }
+    CMsvAttachment* attachmentInfo = attaMan.GetAttachmentInfoL( iAttaId );
+    CleanupStack::PushL( attachmentInfo );
+    attachmentInfo->SetSize( size );
+    TRAPD( error2, attaManSync.ModifyAttachmentInfoL( attachmentInfo ) );
+    if ( error2 == KErrNone )
+        {
+        CleanupStack::Pop( attachmentInfo ); // attachmentInfo ownership was transferred.
+        }
+    else
+        {
+        // if error, attachmentinfo ownership was not transferred
+        CleanupStack::PopAndDestroy( attachmentInfo );
+        }
+    // Error about unsuccessful attachment info modification is not returned to caller.
+    // The attachment size info is unreliable anyway, actual file size should always be called
+        
+    return error;
+    }
+
+// ================= OTHER EXPORTED FUNCTIONS ==============
+
+//  End of File