--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrgui/mrfieldbuildercommon/src/cmrfilemanager.cpp Wed Mar 31 21:08:33 2010 +0300
@@ -0,0 +1,368 @@
+/*
+* Copyright (c) 2009 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: File manager for managing file copy op
+*
+*/
+
+#include "cmrfilemanager.h"
+#include "esmrhelper.h"
+#include <f32file.h>
+
+/// LOCAL NAMESPACE
+namespace
+ {
+// File copying block size
+const TInt KWriteBlockSize( 1024 );
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::NewL
+// ---------------------------------------------------------------------------
+//
+CMRFileManager* CMRFileManager::NewL( RFs& aFs )
+ {
+ CMRFileManager* self = new ( ELeave ) CMRFileManager( aFs );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::~CMRFileManager
+// ---------------------------------------------------------------------------
+//
+CMRFileManager::~CMRFileManager()
+ {
+ delete iFileArray;
+ delete iCurrentFilename;
+ delete iTempFilename;
+ delete iOutputFileArray;
+ iReadStream.Close();
+ iWriteStream.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::CMRFileManager
+// ---------------------------------------------------------------------------
+//
+CMRFileManager::CMRFileManager( RFs& aFs )
+: CActive( CActive::EPriorityStandard ), iFs( aFs )
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::ConstructL()
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::CopyFilesL
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::CopyFilesL( MDesC16Array& aFilenameArray )
+ {
+ // Take copy of the original filename array
+ TInt count( aFilenameArray.MdcaCount() );
+ if( iFileArray )
+ {
+ delete iFileArray;
+ iFileArray = NULL;
+ }
+ iFileArray = new (ELeave) CDesCArrayFlat( count );
+ for( TInt i = 0; i < count; ++i )
+ {
+ iFileArray->AppendL( aFilenameArray.MdcaPoint( i ) );
+ }
+
+ if( iOutputFileArray )
+ {
+ delete iOutputFileArray;
+ iOutputFileArray = NULL;
+ }
+ iOutputFileArray = new (ELeave) CDesCArrayFlat( count );
+ if( iCurrentFilename )
+ {
+ delete iCurrentFilename;
+ iCurrentFilename = NULL;
+ }
+
+ PrepareNextFileL();
+
+ iState = ECopyFile;
+ AsyncOp();
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::CopyFileL
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::CopyFileL(
+ const TDesC& aSourceFilename,
+ const TDesC& aDestFilename )
+ {
+ Cancel();
+
+ iReadStream.Close();
+ iWriteStream.Close();
+ iReadStream.Open( iFs, aSourceFilename, EFileShareReadersOnly );
+ iWriteStream.Open( iFs, aDestFilename, EFileWrite|EFileShareAny );
+
+ if ( iObserver )
+ {
+ iObserver->NotifyStartL( aSourceFilename );
+ }
+
+ iState = ECopyFile;
+
+ AsyncOp();
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::CopyFileL
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::CopyFileL( RFile& aSource, RFile& aDest )
+ {
+ Cancel();
+
+ iReadStream.Close();
+ iWriteStream.Close();
+ iReadStream.Attach( aSource );
+ iWriteStream.Attach( aDest );
+
+ if ( iObserver )
+ {
+ TFileName name;
+
+ if ( KErrNone == aSource.Name( name ) )
+ {
+ iObserver->NotifyStartL( name );
+ }
+ }
+
+ iState = ECopyFile;
+ AsyncOp();
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::CancelOp
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::CancelOp()
+ {
+ iState = ECancelled;
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::PrepareNextFileL
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::PrepareNextFileL()
+ {
+ // Take first item as current
+ if( iCurrentFilename )
+ {
+ delete iCurrentFilename;
+ iCurrentFilename = NULL;
+ }
+ iCurrentFilename = (*iFileArray)[ 0 ].AllocL();
+
+
+ TParse parser;
+ parser.Set( *iCurrentFilename , NULL, NULL );
+ TFileName attachmentName( parser.NameAndExt() );
+
+ User::LeaveIfError( ESMRHelper::CreateAndAppendPrivateDirToFileName( attachmentName ) );
+
+ iReadStream.Close();
+ iWriteStream.Close();
+ User::LeaveIfError( iWriteStream.Replace( iFs, attachmentName, EFileWrite|EFileShareAny ) );
+ iReadStream.Open( iFs, *iCurrentFilename, EFileRead );
+ iOutputFileArray->AppendL( attachmentName );
+
+ delete iTempFilename;
+ iTempFilename = NULL;
+ iTempFilename = attachmentName.AllocL();
+
+ if( iObserver )
+ {
+ iObserver->NotifyStartL( *iCurrentFilename );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::SetObserver
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::SetObserver( MMRFileManObserver& aObserver )
+ {
+ iObserver = &aObserver;
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::RunL
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::RunL()
+ {
+ if( iStatus.Int() != KErrNone )
+ {
+ iReadStream.Close();
+ iWriteStream.Close();
+
+ if( iObserver )
+ {
+ iObserver->NotifyError( iStatus.Int() );
+ }
+ return;
+ }
+ switch( iState )
+ {
+ case ECopyFile:
+ {
+ CopyFileL();
+
+ if( iObserver )
+ {
+ iObserver->NotifyProgress( KWriteBlockSize );
+ }
+ AsyncOp();
+ break;
+ }
+ case ECancelled:
+ {
+ if( iObserver )
+ {
+ iReadStream.Close();
+ iWriteStream.Close();
+ // Delete last because it was cancelled
+ if ( iOutputFileArray )
+ {
+ iOutputFileArray->Delete( iOutputFileArray->Count() - 1 );
+ }
+ iObserver->NotifyEnd();
+ iState = EDone;
+ }
+ break;
+ }
+ case EDone:
+ {
+ break;
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::RunError
+// ---------------------------------------------------------------------------
+//
+TInt CMRFileManager::RunError( TInt aError )
+ {
+ if ( aError == KErrEof ) // File has been copied fully
+ {
+ aError = KErrNone;
+ if( iFileArray && iFileArray->Count() > 1 )
+ {
+ iFileArray->Delete( 0 );
+
+ // Start new file copy op
+ TRAP( aError,
+ {
+ PrepareNextFileL();
+ AsyncOp();
+ } )
+ }
+ else
+ {
+ if( iObserver )
+ {
+ iReadStream.Close();
+ iWriteStream.Close();
+
+ iObserver->NotifyEnd();
+ iState = EDone;
+ }
+ }
+ }
+
+ if ( aError )
+ {
+ iReadStream.Close();
+ iWriteStream.Close();
+
+ if( iObserver )
+ {
+ iObserver->NotifyError( aError );
+ iState = EDone;
+ }
+ }
+
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::DoCancel
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::DoCancel()
+ {
+ iReadStream.Close();
+ iWriteStream.Close();
+ delete iFileArray;
+ iFileArray = NULL;
+ delete iOutputFileArray;
+ iOutputFileArray = NULL;
+ iFileIndex = KErrNotFound;
+ delete iCurrentFilename;
+ iCurrentFilename = NULL;
+ delete iTempFilename;
+ iTempFilename = NULL;
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::AsyncOp
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::AsyncOp()
+ {
+ SetActive();
+ TRequestStatus *stat = &iStatus;
+ User::RequestComplete( stat, KErrNone );
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::CopyFileL
+// ---------------------------------------------------------------------------
+//
+void CMRFileManager::CopyFileL()
+ {
+ iWriteStream.WriteL( iReadStream, KWriteBlockSize );
+ }
+
+// ---------------------------------------------------------------------------
+// CMRFileManager::CopiedFiles
+// ---------------------------------------------------------------------------
+//
+MDesC16Array& CMRFileManager::CopiedFiles() const
+ {
+ return *iOutputFileArray;
+ }
+// End of file
+