meetingrequest/mrgui/mrfieldbuildercommon/src/cmrfilemanager.cpp
branchRCL_3
changeset 12 4ce476e64c59
--- /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
+