--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/mcesettings/src/MceSettingsMovemsgs.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,318 @@
+/*
+* Copyright (c) 2002 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:
+* Copies/Moves message store from source drive to target drive
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <eikenv.h>
+#include "MceSettingsMovemsgs.h"
+#include "MceSettingsUtils.h"
+
+#include <systemwarninglevels.hrh>
+
+#include <msvapi.h>
+#include <e32cmn.h>
+#include <msvipc.h>
+
+#include <StringLoader.h>
+#include <MceSettings.rsg>
+#include <aknnotewrappers.h>
+
+// CONSTANTS
+
+#ifdef _DEBUG
+_LIT( KPanicText, "MceSettings.dll" );
+enum TMcesettingsPanic
+ {
+ EMceSingleOpWatcherAlreadyActive = 1,
+ EMceSingleOpWatcherOperationAlreadySet,
+ EMceSingleOpWatcherOperationNull
+ };
+#endif
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------
+// CMceMessageTransHandler::Constructor
+//
+//
+// ----------------------------------------------------
+CMceMessageTransHandler::CMceMessageTransHandler(
+ MMceMsgTransHandlerObserver& aOwner, CMsvSession* aSession, TInt aTargetDrive,
+ TInt aSourceDrive, TBool aDeleteCopiedStore )
+: CActive( KMsgTransHndlrPriority ), iOwner( aOwner ), iSession( aSession ),
+ iTargetDrive(aTargetDrive ), iSourceDrive( aSourceDrive ),
+ iDeleteCopiedStore( aDeleteCopiedStore ),
+ iState( EStateCopying )
+ {
+ __DECLARE_NAME(_S("CMceMessageTransHandler") );
+ CActiveScheduler::Add( this );
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageTransHandler::Constructor
+//
+//
+// ----------------------------------------------------
+CMceMessageTransHandler *CMceMessageTransHandler::NewL(
+ MMceMsgTransHandlerObserver& aOwner, CMsvSession* aSession,
+ TInt aTargetDrive, TInt aSourceDrive, TBool aDeleteCopiedStore )
+ {
+ CMceMessageTransHandler* self=new ( ELeave ) CMceMessageTransHandler(
+ aOwner,aSession,aTargetDrive,aSourceDrive,aDeleteCopiedStore);
+ CleanupStack::PushL( self );
+ self->ConstructL(); // should be consts in next release
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ----------------------------------------------------
+// CMceMessageTransHandler::ConstructL
+// Creates delete thread and transfer thread
+//
+// ----------------------------------------------------
+void CMceMessageTransHandler::ConstructL()
+ {
+ /* Nothing */;
+ }
+
+// ----------------------------------------------------
+// CMceMessageTransHandler::Destructor
+//
+//
+// ----------------------------------------------------
+CMceMessageTransHandler::~CMceMessageTransHandler()
+ {
+ Cancel();
+ delete iOperation;
+ iOperation = NULL;
+ }
+
+
+// ---------------------------------------------------------
+// CMceMessageTransHandler::SetOperation
+// --- Setter ---
+// Must only be called once during the lifetime of a CMsvSingleOpWatcher object.
+// ---------------------------------------------------------
+void CMceMessageTransHandler::SetOperation( CMsvOperation* aOperation )
+ {
+ __ASSERT_DEBUG( !IsActive(), User::Panic( KPanicText, EMceSingleOpWatcherAlreadyActive ) );
+ __ASSERT_DEBUG( !iOperation, User::Panic( KPanicText, EMceSingleOpWatcherOperationAlreadySet ) );
+ __ASSERT_DEBUG( aOperation, User::Panic( KPanicText, EMceSingleOpWatcherOperationNull ) );
+
+ // Delete the old operation
+ delete iOperation;
+ iOperation = NULL;
+
+ // Take ownership of operation and set our active status so we're handled
+ // by the active scheduler.
+ iOperation = aOperation;
+ SetActive();
+ }
+
+
+// ---------------------------------------------------------
+// CMsvSingleOpWatcher::Operation
+// --- Accessor ---
+// ---------------------------------------------------------
+//
+CMsvOperation& CMceMessageTransHandler::Operation() const
+ {
+ __ASSERT_DEBUG( iOperation, User::Panic( KPanicText, EMceSingleOpWatcherOperationNull ) );
+ return *iOperation;
+ }
+
+
+// ---------------------------------------------------------
+// CMceMessageTransHandler::DoCancel
+// --- From CActive ---
+// ---------------------------------------------------------
+//
+void CMceMessageTransHandler::DoCancel()
+ {
+ // Pass on cancel
+ iOperation->Cancel();
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageTransHandler::RunL
+// Calls TransferCompleteL and
+// sets message store drive on the message server
+// ----------------------------------------------------
+void CMceMessageTransHandler::RunL()
+ {
+ TInt err = iStatus.Int();
+ if (err == KErrNone)
+ {
+ err = ProgressErrorL();
+ }
+
+ if ( err != KErrNone )
+ {
+ // Copy operation did not succeed
+ HBufC* text = StringLoader::LoadLC( R_MCE_SETTINGS_CANNOT_MOVE_STORE,
+ CCoeEnv::Static() );
+ CAknErrorNote* note = new ( ELeave ) CAknErrorNote();
+ note->ExecuteLD( *text );
+ CleanupStack::PopAndDestroy( text );
+ }
+
+ switch ( iState )
+ {
+ case EStateCopying:
+ // Inform client of watcher that the operation has completed
+ iOwner.CopyCompleteL( err );
+ if ( err == KErrNone && iDeleteCopiedStore )
+ {
+ // Only delete if there is no error copying
+ delete iOperation;
+ iOperation = NULL;
+ // Delete the old store
+ iOperation = iSession->DeleteStoreL( iSourceDrive, iStatus );
+ iState = EStateDeleting;
+ SetActive();
+ }
+ else
+ iOwner.TransferCompleteL( err );
+ break;
+ case EStateDeleting:
+ // Check whether operation worked OK
+ iOwner.TransferCompleteL( err );
+ break;
+ default:
+ break;
+ }
+ }
+
+
+// ----------------------------------------------------
+// CMceMessageTransHandler::Progress
+// return % copied so far
+//
+// ----------------------------------------------------
+TInt CMceMessageTransHandler::ProgressL() const
+ {
+ // Let's say everything up to the actual copy is the first 1%,
+ // the copying is the next 98% and everything else the last 1%.
+ const TInt KPreCopyPercentage = 1;
+ const TInt KPostCopyPercentage = 1;
+ const TInt KHundredPercentage = 100;
+ const TInt KCopyPercentage = KHundredPercentage - KPreCopyPercentage - KPostCopyPercentage;
+
+ if ( iState == EStateCopying )
+ {
+ // Get the progress
+ TMsvCopyProgress copyProgress;
+ TPckgC<TMsvCopyProgress> progressPackage( copyProgress );
+ progressPackage.Set( iOperation->ProgressL() );
+ copyProgress = progressPackage();
+ if ( copyProgress.iError == KErrNone )
+ {
+ if ( copyProgress.iState == TMsvCopyProgress::ENotYetStarted )
+ {
+ return 0; // Nothing done yet
+ }
+ else if ( copyProgress.iState < TMsvCopyProgress::ECopyStore )
+ {
+ return KPreCopyPercentage; // Started, but not yet copying
+ }
+ else if ( copyProgress.iState == TMsvCopyProgress::ECopyStore )
+ {
+ // Copying, so return percentage of copy done + pre-copy percentage
+ return ( ( ( copyProgress.iCurrent + 1 ) * KCopyPercentage )
+ / copyProgress.iTotal ) + KPreCopyPercentage;
+ }
+ else if ( copyProgress.iState == TMsvCopyProgress::ECompleted && !iDeleteCopiedStore )
+ {
+ // Finished copying and no delete to do - All done!
+ return KHundredPercentage;
+ }
+ else
+ {
+ // Copy is done but there's still more to do
+ return KHundredPercentage - KPostCopyPercentage;
+ }
+ }
+ else
+ {
+ return 0; // Error
+ }
+ }
+ else // EStateDeleting
+ {
+ TMsvDeleteProgress deleteProgress;
+ TPckgC<TMsvDeleteProgress> progressPackage( deleteProgress );
+ progressPackage.Set( iOperation->ProgressL() );
+ deleteProgress = progressPackage();
+ if ( deleteProgress.iError != KErrNone )
+ {
+ if ( deleteProgress.iState == TMsvDeleteProgress::ECompleted )
+ {
+ // Finsihed copying and deleting - All done!
+ return KHundredPercentage;
+ }
+ else
+ {
+ // Still deleting
+ return KHundredPercentage - KPostCopyPercentage;
+ }
+ }
+ else
+ {
+ return 0; // Error
+ }
+ }
+ }
+
+// ----------------------------------------------------
+// TInt CMceMessageTransHandler::ProgressErrorL() const
+//
+// ----------------------------------------------------
+TInt CMceMessageTransHandler::ProgressErrorL() const
+ {
+ if ( iState == EStateCopying )
+ {
+ TMsvCopyProgress copyProgress;
+ TPckgC<TMsvCopyProgress> copyProgressPckg( copyProgress );
+ copyProgressPckg.Set( iOperation->ProgressL() );
+ return copyProgressPckg().iError;
+ }
+ else // EStateDeleting
+ {
+ TMsvDeleteProgress deleteProgress;
+ TPckgC<TMsvDeleteProgress> deleteProgressPckg( deleteProgress );
+ deleteProgressPckg.Set( iOperation->ProgressL() );
+ return deleteProgressPckg().iError;
+ }
+ }
+
+
+// ----------------------------------------------------
+// Called by the framework if RunL leaves
+//
+// ----------------------------------------------------
+TInt CMceMessageTransHandler::RunError( TInt )
+ {
+ return KErrNone;
+ }
+
+// End of file