--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videocollection/hgmyvideos/src/vcxhgmyvideosvideocopier.cpp Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,354 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: Class for handling move/copy related notes and operations.*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <CAknMemorySelectionDialogMultiDrive.h>
+#include <AknWaitDialog.h>
+#include <AknCommonDialogsDynMem.h>
+#include <aknnotewrappers.h>
+#include <StringLoader.h>
+#include <vcxmyvideosdefs.h>
+#include <vcxhgmyvideos.rsg>
+#include "IptvDebug.h"
+#include "vcxhgmyvideoscollectionclient.h"
+#include "vcxhgmyvideosvideomodelhandler.h"
+#include "vcxhgmyvideosmodel.h"
+#include "vcxhgmyvideosvideocopier.h"
+#include "CIptvDriveMonitor.h"
+
+// =========================== MEMBER FUNCTIONS ==============================
+
+// ---------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::CVcxHgMyVideosVideoCopier()
+// ---------------------------------------------------------------------------
+//
+CVcxHgMyVideosVideoCopier::CVcxHgMyVideosVideoCopier(
+ CVcxHgMyVideosVideoListImpl& aVideoList,
+ CVcxHgMyVideosVideoModelHandler& aVideoModel,
+ CVcxHgMyVideosModel& aModel )
+ : iVideoList( aVideoList ),
+ iVideoModel( aVideoModel ),
+ iModel( aModel )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoCopier::ConstructL()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::NewL()
+// ---------------------------------------------------------------------------
+//
+CVcxHgMyVideosVideoCopier* CVcxHgMyVideosVideoCopier::NewL(
+ CVcxHgMyVideosVideoListImpl& aVideoList,
+ CVcxHgMyVideosVideoModelHandler& aVideoModel,
+ CVcxHgMyVideosModel& aModel )
+ {
+ CVcxHgMyVideosVideoCopier* self =
+ new( ELeave ) CVcxHgMyVideosVideoCopier( aVideoList, aVideoModel, aModel );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::~CVcxHgMyVideosVideoCopier()
+// ---------------------------------------------------------------------------
+//
+CVcxHgMyVideosVideoCopier::~CVcxHgMyVideosVideoCopier()
+ {
+ CloseMoveCopyWaitNote();
+ }
+
+// ---------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::ShowMenuItemsL()
+// ---------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoCopier::ShowMenuItemsL(
+ const RArray<TInt>& aOperationTargets,
+ TBool& aShowMoveAndCopySubmenu,
+ TBool& aShowCopy,
+ TBool& aShowMove )
+ {
+ TVcxMyVideosDownloadState dlState( EVcxMyVideosDlStateNone );
+ CIptvDriveMonitor& driveMonitor = iModel.DriveMonitorL();
+ HBufC* videoUri = NULL;
+ TInt drive( 0 );
+
+ TUint32 flags;
+
+ for ( TInt i = 0; i < aOperationTargets.Count(); i++ )
+ {
+ dlState = iVideoModel.VideoDownloadState( aOperationTargets[i] );
+
+ // If video is not under download, there is source file that can be moved/copied.
+ if ( dlState == EVcxMyVideosDlStateNone )
+ {
+ // When we found source file that can be moved/copied, we need
+ // to also check that there is target drive that we can use.
+ videoUri = iVideoModel.GetVideoUri( aOperationTargets[i] ).AllocLC();
+ if ( videoUri->Length() > 0 )
+ {
+ if ( iModel.FileServerSessionL().CharToDrive( videoUri->Des()[0], drive )
+ == KErrNone )
+ {
+ for ( TInt j = 0; j < driveMonitor.iAvailableDrives.Count(); j++ )
+ {
+ flags = driveMonitor.iAvailableDrives[j].iFlags;
+
+ if ( driveMonitor.iAvailableDrives[j].iDrive != drive &&
+ !(flags & TIptvDriveInfo::ELocked) && !(flags & TIptvDriveInfo::EMediaNotPresent) )
+ {
+ aShowMoveAndCopySubmenu = aShowCopy = aShowMove = ETrue;
+
+ // No need to continue, we know that menu can be shown.
+ CleanupStack::PopAndDestroy( videoUri );
+ return;
+ }
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy( videoUri );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::MoveOrCopyL()
+// ---------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoCopier::MoveOrCopyL(
+ const RArray<TInt>& aOperationTargets,
+ TBool aCopy )
+ {
+ TInt targetDrive( EDriveC );
+
+ if ( QueryTargetDriveL( aCopy, targetDrive ) )
+ {
+ // Wait note is closed in destructor (CloseMoveCopyWaitNote()),
+ // in DialogDismissedL() or in VideoMoveOrCopyCompletedL().
+ OpenMoveCopyWaitNoteL( aOperationTargets, aCopy );
+
+ iVideoModel.MoveOrCopyVideosL( aOperationTargets, targetDrive, aCopy );
+ iCopy = aCopy;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::QueryTargetDriveL()
+// ---------------------------------------------------------------------------
+//
+TBool CVcxHgMyVideosVideoCopier::QueryTargetDriveL( TBool aCopy, TInt& aTargetDrive )
+ {
+ TCommonDialogType dialogType;
+ TBool driveSelected( EFalse );
+ TDriveNumber selectedMem( EDriveC );
+ TInt includedMedias( 0 );
+
+ if ( aCopy )
+ {
+ dialogType = ECFDDialogTypeCopy;
+ }
+ else
+ {
+ dialogType = ECFDDialogTypeMove;
+ }
+
+ if ( iModel.DriveMonitorL().MassStorageDrive() != KErrNotFound )
+ {
+ includedMedias |= AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage;
+ }
+ if ( iModel.DriveMonitorL().MemoryCardDrive() != KErrNotFound )
+ {
+ includedMedias |= AknCommonDialogsDynMem::EMemoryTypeMMCExternal;
+ }
+ if ( iModel.DriveMonitorL().FixedDrive( EFalse ) == EDriveC )
+ {
+ includedMedias |= AknCommonDialogsDynMem::EMemoryTypePhone;
+ }
+ // If CIptvDriveMonitor does not publish C-drive, it means that product
+ // has (at least) two other usable memories, and therefore there is no
+ // need to allow user to move / copy items to (small) C-drive.
+ if ( iModel.DriveMonitorL().PhoneMemoryDrive() == KErrNotFound )
+ {
+ includedMedias &= ~AknCommonDialogsDynMem::EMemoryTypePhone;
+ }
+
+// Skip the dialog in emulator as ASSERT_DEBUG macro does not allow single memory dialog.
+#if !defined(__WINS__) && !defined(__WINSCW__)
+ CAknMemorySelectionDialogMultiDrive* dlg =
+ CAknMemorySelectionDialogMultiDrive::NewL(
+ dialogType,
+ R_VCXHGMYVIDEOS_MEMORY_SELECTION_DIALOG,
+ EFalse,
+ includedMedias );
+ CleanupStack::PushL( dlg );
+ driveSelected = dlg->ExecuteL( selectedMem );
+ CleanupStack::PopAndDestroy(); // dlg
+#else
+ driveSelected = ETrue;
+ selectedMem = EDriveE;
+#endif // !defined(__WINS__) && !defined(__WINSCW__)
+
+ if ( driveSelected )
+ {
+ aTargetDrive = static_cast<TInt>( selectedMem );
+ return ETrue;
+ }
+
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::OpenMoveCopyWaitNoteL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoCopier::OpenMoveCopyWaitNoteL(
+ const RArray<TInt>& aOperationTargets,
+ TBool aCopy )
+ {
+ CloseMoveCopyWaitNote();
+
+ HBufC* note = NULL;
+
+ if ( aOperationTargets.Count() == 1 )
+ {
+ HBufC* name = iVideoModel.GetVideoName( aOperationTargets[0] ).AllocLC();
+ if ( aCopy )
+ {
+ note = StringLoader::LoadL( R_VCXHGMYVIDEOS_COPYING_ONE, *name );
+ }
+ else
+ {
+ note = StringLoader::LoadL( R_VCXHGMYVIDEOS_MOVING_ONE, *name );
+ }
+ CleanupStack::PopAndDestroy( name );
+ CleanupStack::PushL( note );
+ }
+ else
+ {
+ if ( aCopy )
+ {
+ note = StringLoader::LoadLC( R_VCXHGMYVIDEOS_COPYING_MANY );
+ }
+ else
+ {
+ note = StringLoader::LoadLC( R_VCXHGMYVIDEOS_MOVING_MANY );
+ }
+ }
+
+ iMoveCopyWaitDialog = new (ELeave)
+ CAknWaitDialog( ( REINTERPRET_CAST( CEikDialog**, &iMoveCopyWaitDialog ) ), ETrue );
+ iMoveCopyWaitDialog->SetCallback( this );
+ iMoveCopyWaitDialog->SetTextL( *note );
+
+ if ( aCopy )
+ {
+ iMoveCopyWaitDialog->ExecuteLD( R_VCXHGMYVIDEOS_COPY_WAIT_NOTE );
+ }
+ else
+ {
+ iMoveCopyWaitDialog->ExecuteLD( R_VCXHGMYVIDEOS_MOVE_WAIT_NOTE );
+ }
+
+ CleanupStack::PopAndDestroy( note );
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::CloseMoveCopyWaitNote()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoCopier::CloseMoveCopyWaitNote()
+ {
+ if ( iMoveCopyWaitDialog )
+ {
+ TRAPD( error, iMoveCopyWaitDialog->ProcessFinishedL() );
+ if ( error != KErrNone )
+ {
+ delete iMoveCopyWaitDialog;
+ }
+ iMoveCopyWaitDialog = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::DialogDismissedL()
+// Callback about (move/copy) wait note dismissal.
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoCopier::DialogDismissedL( TInt aButtonId )
+ {
+ if ( aButtonId == EAknSoftkeyCancel )
+ {
+ iModel.CollectionClient().CancelMoveOrCopyVideosL();
+ }
+ iMoveCopyWaitDialog = NULL;
+ }
+
+// -----------------------------------------------------------------------------
+// CVcxHgMyVideosVideoCopier::VideoMoveOrCopyCompletedL()
+// -----------------------------------------------------------------------------
+//
+void CVcxHgMyVideosVideoCopier::VideoMoveOrCopyCompletedL( TInt aFailedCount,
+ const TDesC& aFailedName )
+ {
+ CloseMoveCopyWaitNote();
+
+ if ( aFailedCount > 0 )
+ {
+ HBufC* text = NULL;
+
+ if ( aFailedCount == 1 )
+ {
+ if ( iCopy )
+ {
+ text = StringLoader::LoadLC( R_VCXHGMYVIDEOS_FLDR_ITEM_CANNOT_BE_COPIED,
+ aFailedName );
+ }
+ else
+ {
+ text = StringLoader::LoadLC( R_VCXHGMYVIDEOS_FLDR_ITEM_CANNOT_BE_MOVED,
+ aFailedName );
+ }
+ }
+ else
+ {
+ if ( iCopy )
+ {
+ text = StringLoader::LoadLC( R_VCXHGMYVIDEOS_FLDR_SOME_ITEMS_CANT_COPY,
+ aFailedCount );
+ }
+ else
+ {
+ text = StringLoader::LoadLC( R_VCXHGMYVIDEOS_FLDR_SOME_ITEMS_CANT_MOVE,
+ aFailedCount );
+ }
+ }
+
+ CAknErrorNote* note = new ( ELeave ) CAknErrorNote( ETrue );
+ note->ExecuteLD( *text );
+ CleanupStack::PopAndDestroy( text );
+ }
+ }