--- /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;
+ }
+
+
+