messagingapp/msgutils/unidatautils/unidatamodel/src/UniSmilList.cpp
changeset 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgutils/unidatautils/unidatamodel/src/UniSmilList.cpp	Mon May 03 12:29:07 2010 +0300
@@ -0,0 +1,295 @@
+/*
+* 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: 
+*       CUniSmilList, List of attachments.
+*
+*
+*/
+
+
+// ========== INCLUDE FILES ================================
+
+#include <e32std.h>
+#include <e32def.h>     // for basic types
+#include <eikenv.h>     // for CBase
+#include <mtclbase.h>   // for CBaseMtm
+#include <msvstd.h>     // for TMsvId
+#include <msvids.h>     // for KMsvTempIndexEntryId
+#include <msvstore.h>
+#include <mmsvattachmentmanager.h>
+#include <mmsvattachmentmanagersync.h>
+#include <cmsvattachment.h>
+#include <cmsvmimeheaders.h>
+
+#include "msgtextutils.h"
+#include "UniSmilList.h"
+#include "MsgMimeTypes.h"
+#include "MuiuOperationWait.h"
+
+// ========== EXTERNAL DATA STRUCTURES =====================
+
+// ========== EXTERNAL FUNCTION PROTOTYPES =================
+
+// ========== CONSTANTS ====================================
+
+// ========== MACROS =======================================
+
+// ========== LOCAL CONSTANTS AND MACROS ===================
+
+_LIT16( KPresentationFileName, "pres.smil" );
+
+// ========== MODULE DATA STRUCTURES =======================
+
+// ========== LOCAL FUNCTION PROTOTYPES ====================
+
+// ========== LOCAL FUNCTIONS ==============================
+
+// ========== MEMBER FUNCTIONS =============================
+
+// ---------------------------------------------------------
+// CUniSmilList::NewLC
+//
+// Factory method.
+// ---------------------------------------------------------
+//
+EXPORT_C CUniSmilList* CUniSmilList::NewL( CBaseMtm& aMtm )
+    {
+    CUniSmilList* self = new(ELeave) CUniSmilList( aMtm );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------
+// CUniSmilList::CUniSmilList
+//
+// Constructor.
+// ---------------------------------------------------------
+//
+CUniSmilList::CUniSmilList( CBaseMtm& aMtm ) :
+    CActive( EPriorityStandard ),
+    iMtm( aMtm ),
+    iSmilAttachmentArray( NULL )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+
+// ---------------------------------------------------------
+// CUniSmilList::CUniSmilList
+//
+// Destructor.
+// ---------------------------------------------------------
+//
+CUniSmilList::~CUniSmilList()
+    {
+    Cancel();
+
+    delete iSmilAttachmentArray;
+    delete iComposer;
+
+    if ( iEditFile )
+        {
+        iEditFile->Close();
+        delete iEditFile;
+        }
+    }
+
+// ---------------------------------------------------------
+// CUniSmilList::AddSmilAttachmentL
+//
+// Add SMIL attachment
+// ---------------------------------------------------------
+//
+EXPORT_C void CUniSmilList::AddSmilAttachmentL(
+    MMsvAttachmentManager& aManager,
+    TMsvAttachmentId aAttachmentId )
+    {
+    RFile file = aManager.GetAttachmentFileL( aAttachmentId );
+    CleanupClosePushL( file );
+    TInt size( 0 );
+    User::LeaveIfError( file.Size( size ) );
+    CleanupStack::PopAndDestroy( &file );
+    iSmilAttachmentArray->AppendL( aAttachmentId );
+    iSmilSize += size;
+    }
+
+// ---------------------------------------------------------
+// CUniSmilList::CreateSmilAttachmentL
+//
+// Create SMIL from DOM
+// ---------------------------------------------------------
+//
+EXPORT_C void CUniSmilList::CreateSmilAttachmentL(
+        MUniSmilComposeObserver& aObserver,
+        CMsvStore& aEditStore,
+        CMDXMLDocument* aDom )
+    {
+    iDom = aDom;
+    iObserver = &aObserver;
+    //iSmilAttaId = KMsvNullIndexEntryId;
+    //iSmilAttaFullpath.Zero();
+
+    iManager = &( aEditStore.AttachmentManagerL() );
+    CMsvAttachment* attachment = CMsvAttachment::NewL( CMsvAttachment::EMsvFile );
+    CleanupStack::PushL( attachment );
+
+    //TODO: Set size(?) & complete flag(?)
+    //attachment->SetSize()
+    //attachment->SetComplete( EFalse );
+
+    iEditFile = new ( ELeave ) RFile;
+    CMuiuOperationWait* wait = CMuiuOperationWait::NewLC();
+    iManager->CreateAttachmentL( KPresentationFileName, *iEditFile, attachment, wait->iStatus );
+    wait->Start();
+    //manager.AddAttachmentL( aPath, attachment, iStatus );
+    CleanupStack::PopAndDestroy( wait );	
+
+    CleanupStack::Pop( attachment );
+    iAttachment = attachment;
+
+    //Do self complete to trigger runL 
+    RunL();
+    }
+
+// ---------------------------------------------------------
+// CUniSmilList::GetSmilAttachmentByIndex
+//
+// GetSmilAttachmentByIndex.
+// ---------------------------------------------------------
+//
+EXPORT_C TMsvAttachmentId CUniSmilList::GetSmilAttachmentByIndex( TInt aIndex )
+    {
+    if ( aIndex < 0 || aIndex >= iSmilAttachmentArray->Count() )
+        {
+        return KMsvNullIndexEntryId;
+        }
+    return iSmilAttachmentArray->At( aIndex );
+    }
+
+// ---------------------------------------------------------
+// CUniSmilList::GetSmilFullPathByIndex
+//
+// GetSmilFullPathByIndex.
+// ---------------------------------------------------------
+//
+EXPORT_C RFile CUniSmilList::GetSmilFileByIndexL(
+    TInt aIndex )
+    {
+    if ( aIndex < 0 || aIndex >= iSmilAttachmentArray->Count() )
+        {
+        User::Leave( KErrArgument );
+        }
+    CMsvStore* store = iMtm.Entry().ReadStoreL();
+    CleanupStack::PushL( store );
+    MMsvAttachmentManager& manager = store->AttachmentManagerL();
+    RFile file = manager.GetAttachmentFileL( iSmilAttachmentArray->At( aIndex ) );
+    CleanupStack::PopAndDestroy( store );
+    return file;
+    }
+
+// ---------------------------------------------------------
+// CUniSmilList::ConstructL
+//
+// 2nd phase constructor.
+// ---------------------------------------------------------
+//
+void CUniSmilList::ConstructL()
+    {
+    iSmilAttachmentArray = new ( ELeave ) CArrayFixFlat<TMsvAttachmentId>( 2 );
+    }
+
+// ---------------------------------------------------------
+// CUniSmilList::ComposeFileCompleteL
+// ---------------------------------------------------------
+//
+void CUniSmilList::ComposeFileCompleteL()
+    {
+    CMsvMimeHeaders* msvMime = CMsvMimeHeaders::NewLC();
+
+    TInt slash = KMsgMimeSmil().Locate( '/' );
+    msvMime->SetSuggestedFilenameL( KPresentationFileName );
+    msvMime->SetContentTypeL( KMsgMimeSmil().Left( slash ) );
+    msvMime->SetContentSubTypeL( KMsgMimeSmil().Mid( slash + 1 ) );
+    msvMime->SetMimeCharset( KCharacterSetMIBEnumUtf8 );
+    msvMime->StoreL( *iAttachment );
+    CleanupStack::PopAndDestroy( msvMime );
+
+    iAttachment->SetMimeTypeL( KMsgMimeSmil );
+    // TODO: iEditFile is already closed? How to get the file size?
+    //iAttachment->SetSize( 0 );
+    TMsvAttachmentId smilId = iAttachment->Id();
+    AddSmilAttachmentL( *iManager, smilId );
+
+    // TODO: Cleanup attachment in some cases?
+    //       -> Just do use Revert() instead of CommitL()?
+    iManager = NULL;
+    iAttachment = NULL;
+
+    iObserver->SmilComposeEvent( KErrNone );
+    
+    if ( iObjWait.IsStarted() )
+    {
+    iObjWait.AsyncStop();
+    }    
+
+    }
+
+// ---------------------------------------------------------
+// CUniSmilList::DoCancel
+//
+// ---------------------------------------------------------
+//
+void CUniSmilList::DoCancel()
+    {
+    if ( iManager )
+        {
+        iManager->CancelRequest();
+        }
+    }
+
+// ---------------------------------------------------------
+// CUniSmilList::RunL
+//
+// ---------------------------------------------------------
+//
+void CUniSmilList::RunL()
+    {
+    if ( !iComposer )
+        {
+        iComposer = CMDXMLComposer::NewL( this, EFalse );
+        }
+    iComposer->ComposeFile( *iEditFile, iDom, EAscii );
+    if( !iObjWait.IsStarted() )
+    {
+    iObjWait.Start();
+    }
+    delete iEditFile;
+    iEditFile = NULL; // Ownership transferred.
+    }
+
+// ---------------------------------------------------------
+// CUniSmilList::RunError
+//
+// ---------------------------------------------------------
+//
+TInt CUniSmilList::RunError( TInt /*aError*/ )
+    {
+    return KErrNone;
+    }
+
+
+