diff -r 000000000000 -r 6a9f87576119 filemanager/Engine/inc/CFileManagerActiveExecute.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/Engine/inc/CFileManagerActiveExecute.h Mon Jan 18 20:09:41 2010 +0200 @@ -0,0 +1,284 @@ +/* +* Copyright (c) 2002-2008 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: Handles the copy/move operation +* +*/ + + + +#ifndef CFILEMANAGERACTIVEEXECUTE_H +#define CFILEMANAGERACTIVEEXECUTE_H + +// INCLUDES +#include +#include +#include +#include "FileManagerEngine.hrh" +#include "MFileManagerProcessObserver.h" +#include "MFileManagerThreadFunction.h" + +// FORWARD DECLARATIONS +class CFileManagerEngine; +class MFileManagerItemIterator; +//class CMGXFileManager; +class CFileManagerThreadWrapper; + +/** +* CFileManagerActiveExecute +* +* Handles the copy and move operations. +* +* @lib FileManagerEngine.lib +* @since 2.0 +*/ +NONSHARABLE_CLASS(CFileManagerActiveExecute) : public CActive, + public MFileManagerThreadFunction + + { + + public: + + /** + * Overwrite file switch + */ + enum TFileManagerSwitch + { + ENoOverWrite = 1, + EOverWrite + }; + + /** + * Two-phased constructor. + * @since 2.0 + * @param aEngine reference to CFileManagerEngine instance + * @param aOperation defines type of operation copy or move + * @param aObserver reference to MFileManagerProcess implemented + * instance + * @param aIndexList list of indexes from current view which needs operation + * @param aToFolder folder where items are moved or copied + * @return Newly constructed CFileManagerActiveExecute + */ + IMPORT_C static CFileManagerActiveExecute* NewL( + CFileManagerEngine& aEngine, + MFileManagerProcessObserver::TFileManagerProcess aOperation, + MFileManagerProcessObserver& aObserver, + CArrayFixFlat& aIndexList, + const TDesC& aToFolder ); + + /** + * Destructor + */ + IMPORT_C ~CFileManagerActiveExecute(); + + /** + * Executes one operation at time, one file copy/move or directory creation + * @since 2.0 + * @param aOverWrite Over write the file or not + */ + IMPORT_C void ExecuteL( TFileManagerSwitch aOverWrite ); + + /** + * Cancel the operation + * @since 2.0 + */ + IMPORT_C void CancelExecution(); + + /** + * Gets destination folder + * @since 3.2 + */ + IMPORT_C TPtrC ToFolder(); + + private: + + // From CActive + void DoCancel(); + void RunL(); + TInt RunError(TInt aError); + + private: + /** + * C++ default constructor. + */ + CFileManagerActiveExecute( CFileManagerEngine& aEngine, + MFileManagerProcessObserver::TFileManagerProcess aOperation, + MFileManagerProcessObserver& aObserver ); + + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL( CArrayFixFlat& aIndexList, + const TDesC& aToFolder ); + + private: + + /** + * Item operation was succesfully carried on, move to next item + */ + void KErrNoneActionL(); + + /** + * Item operation was not succesful because there was target item already + * This function deals that situation + */ + void KErrAlreadyExistsActionL(); + + /** + * Takes last folder name on other string and appends it to other + * @param aResult Stores the result as full path + * @param aSrc source full path which last folder name is taken + * @param aDst target path where source last path is appended + */ + void AddLastFolder( TDes& aResult, const TDesC& aSrc, const TDesC& aDst ); + + /** + * Performs a copy or move operation + * + * @param aSwitch indicate destination file to be overwritten or not + * @return system wide error code + */ + TInt DoOperation( TInt aSwitch ); + + /** + * Checks if directory is empty + * + * @param aDir Full path of the directory + * @return ETrue if directory is empty, otherwise EFalse + */ + TBool IsEmptyDir( const TDesC& aDir ); + + /** + * Completes operation + * + * @param aError Operation result + */ + void CompleteL( TInt aError ); + + /** + * Updates MG2 notifications + * + * @param aForceFlush Indicates if notications are flushed + * @param aError Indicates the result + */ + void UpdateNotifications( TBool aFlush, TInt aError ); + + static void AppendArrayIfNotFound( + CDesCArray& aArray, const TDesC& aFullPath ); + + void FlushArray( CDesCArray& aArray ); + + void ThreadCopyOrMoveStepL(); + + void ThreadFinalizeMoveStepL(); + + private: // From MFileManagerThreadFunction + + void ThreadStepL(); + + TBool IsThreadDone(); + + void NotifyThreadClientL( TNotifyType aType, TInt aValue ); + + private: + + // index to current CDir array + TInt iCurrentIndex; + + // Own: Source item with full path + HBufC* iFullPath; + + // Own: Destination item with full path + HBufC* iDestination; + + // Has user cancelled the operation + TBool iCancelled; + + // Source directory is empty so special operations are needed + TBool iEmptyDir; + + // Needed to get the item locations behind given index(es) + CFileManagerEngine& iEngine; + + // Ref: Shareable file server session + RFs& iFs; + + // Move or copy operation + MFileManagerProcessObserver::TFileManagerProcess iOperation; + + // Own: Array of user selected items to be copied/moved + CArrayFixFlat< TInt >* iIndexList; + + // Own: user given destination folder + HBufC* iToFolder; + + // Own: This is either CFileManagerIndexIterator or CFileManagerFileSystemIterator + // depending of source item type, file or folder + MFileManagerItemIterator* iItemIterator; + + // Ref: File operation phases are signaled through this interface + MFileManagerProcessObserver& iObserver; + + // Ref: Current source item with full path + // Needed for file already exist situations. + HBufC* iSrc; + + // Ref: Current destination item with full path + // Needed for file already exist situations. + HBufC* iDst; + + // Total transferred bytes, used for progress note + // except in same drive move operation + TUint iBytesTransferredTotal; + + // Total transferred files, used for progress note + // This is used if move operation is done inside drive + TInt iFilesTransferredTotal; + + // Current error + TInt iError; + + // Ref: MG2 update notification object + //CMGXFileManager* iMgxFileManager; + + // Own: Thread wrapper for the operation + CFileManagerThreadWrapper* iThreadWrapper; + + // Indicates the used operation switches + TInt iSwitch; + + // Own: Buffer for storing changed items for MG2 notifications + CDesCArray* iChangedSrcItems; + + // Own: Buffer for storing changed items for MG2 notifications + CDesCArray* iChangedDstItems; + + // Indicates that the operation is done inside same drive + TBool iOperationOnSameDrive; + + // Indicates that move operation is finalizing + TBool iFinalizeMove; + + // Indicates that source of the operation is on remote drive + TBool iIsSrcRemoteDrive; + + // Indicates that destination of the operation is on remote drive + TBool iIsDstRemoteDrive; + + // Stores type of the current item + TFileManagerTypeOfItem iItemType; + }; + +#endif // CFILEMANAGERACTIVEEXECUTE_H + + // End of File