diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrgui/mrfieldbuildercommon/src/cmrfilemanager.cpp --- /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 + +/// 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 +