diff -r 95243422089a -r 491b3ed49290 filemanager/Engine/src/CfilemanageractiveDelete.cpp --- a/filemanager/Engine/src/CfilemanageractiveDelete.cpp Thu Aug 19 09:42:45 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,467 +0,0 @@ -/* -* 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: Deletes files -* -*/ - - -// INCLUDE FILES -#include "Cfilemanageractivedelete.h" -#include "MFileManagerProcessObserver.h" -#include "CFileManagerEngine.h" -#include "CFileManagerCommonDefinitions.h" -#include "CFileManagerUtils.h" -#include "FileManagerDebug.h" -//#include - -// CONSTANTS -const TInt KFileManagerDeletionPerStep = 20; -const TInt64 KFileManagerMaxStepTime = 1000000; // 1s -const TInt KFileManagerNotificationArrayGranularity = 64; - - -// ============================ LOCAL FUNCTIONS ================================ -// ----------------------------------------------------------------------------- -// GetTimeStamp -// ----------------------------------------------------------------------------- -// -static TInt64 GetTimeStamp() - { - TTime time; - time.UniversalTime(); - return time.Int64(); - } - -// ----------------------------------------------------------------------------- -// IsTimedOut -// ----------------------------------------------------------------------------- -// -static TBool IsTimedOut( const TInt64& aStartTime ) - { - TInt64 time( GetTimeStamp() ); - TBool ret( time - aStartTime > KFileManagerMaxStepTime ); - if ( ret ) - { - INFO_LOG("CFileManagerActiveDelete-TimedOut"); - } - return ret; - } - - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::CFileManagerActiveDelete -// C++ default constructor can NOT contain any code, that -// might leave. -// ----------------------------------------------------------------------------- -// -CFileManagerActiveDelete::CFileManagerActiveDelete( - RFs& aFs, - CArrayFixFlat< TInt >& aIndexList, - CFileManagerEngine& aEngine, - CFileManagerUtils& aUtils ) : - iFs( aFs ), - iIndexList( aIndexList ), - iError( KErrNone ), - iEngine( aEngine ), - iUtils( aUtils ) - { - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::NewL -// Two-phased constructor. -// ----------------------------------------------------------------------------- -// -CFileManagerActiveDelete* CFileManagerActiveDelete::NewL( - CArrayFixFlat< TInt >& aIndexList, - CFileManagerEngine& aEngine, - CFileManagerUtils& aUtils ) - { - CFileManagerActiveDelete* self = new( ELeave ) CFileManagerActiveDelete( - aEngine.Fs(), aIndexList, aEngine, aUtils ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::ConstructL -// -// ----------------------------------------------------------------------------- -// -void CFileManagerActiveDelete::ConstructL() - { - iStringBuffer = HBufC::NewL( KMaxFileName ); - //MG2 notification object - //iMgxFileManager = &iEngine.MGXFileManagerL(); - iRemovedItems = new( ELeave ) CDesCArrayFlat( - KFileManagerNotificationArrayGranularity ); - iIsRemoteDrive = iUtils.IsRemoteDrive( iEngine.CurrentDirectory() ); - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::~CFileManagerActiveDelete -// Destructor -// ----------------------------------------------------------------------------- -// -EXPORT_C CFileManagerActiveDelete::~CFileManagerActiveDelete() - { - delete iStringBuffer; - delete iFullPath; - delete iDirScan; - delete iDir; - delete iRemovedItems; - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::IsProcessDone -// -// ----------------------------------------------------------------------------- -// -TBool CFileManagerActiveDelete::IsProcessDone() const - { - return iProcessDone; - } - -// ----------------------------------------------------------------------------- -// CFileManagerEngine::DeleteItemsInDirectoryL -// ----------------------------------------------------------------------------- -// -TBool CFileManagerActiveDelete::DeleteItemsInDirectoryL() - { - if ( !iDirScan ) - { - iDirScan = CDirScan::NewL( iFs ); - // Set scanning from current directory, take all files - // No sorting needed - iDirScan->SetScanDataL( *iFullPath, - KEntryAttNormal | KEntryAttHidden | KEntryAttSystem, - ESortNone ); - } - - if ( iDir && iFileIndex < iDir->Count() ) - { - // Delete file item - const TEntry& item = ( *iDir )[ iFileIndex ]; - TPtr ptr( iStringBuffer->Des() ); - CFileManagerUtils::GetFullPath( - iDirScan->FullPath(), item, ptr ); - CFileManagerUtils::RemoveReadOnlyAttribute( iFs, ptr, item ); - DeleteFileL( ptr, ETrue ); - ++iFileIndex; - } - else - { - // Fetch next directory - delete iDir; - iDir = NULL; - iDirScan->NextL( iDir ); - iFileIndex = 0; - - if ( iDir ) - { - CFileManagerUtils::RemoveReadOnlyAttribute( - iFs, iDirScan->FullPath() ); - } - } - - if ( !iDir ) - { - // Items are deleted now, report done - if ( !iNotDeletedItems ) - { - // Delete all directories - CFileMan* fileMan = CFileMan::NewL( iFs ); - SetError( fileMan->RmDir( *iFullPath ), *iFullPath ); - delete fileMan; - } - return ETrue; - } - return EFalse; // Still items left - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::StepL -// -// ----------------------------------------------------------------------------- -// -void CFileManagerActiveDelete::StepL() - { - FUNC_LOG - - TInt64 startTime( GetTimeStamp() ); - TInt indexCount( iIndexList.Count() ); - TInt i( KFileManagerDeletionPerStep ); - TBool timedOut( EFalse ); - - while ( iCurrentIndex < indexCount && i && !timedOut ) - { - TBool isItemDone( EFalse ); - - // Fetch item path if missing - if ( !iFullPath ) - { - iFullPath = iEngine.IndexToFullPathL( - iIndexList.At( iCurrentIndex ) ); - if ( IsDir( *iFullPath ) ) - { - // Ignore default folders - if ( iUtils.DefaultFolder( *iFullPath ) ) - { - SetError( KErrFmgrDefaultFolder, *iFullPath ); - isItemDone = ETrue; - } - } - } - // Delete item - if ( !isItemDone ) - { - if ( IsDir( *iFullPath ) ) - { - // Delete directory item - while ( iCurrentIndex < indexCount && i && !isItemDone && !timedOut ) - { - isItemDone = DeleteItemsInDirectoryL(); - --i; - - // Adjust amount of deleted files per step by consumed time. - // This is an attempt to avoid long periods of time, - // where the UI does not respond to user activity. - timedOut = IsTimedOut( startTime ); - } - } - else - { - // Delete file item - DeleteFileL( *iFullPath ); - isItemDone = ETrue; - --i; - - // Adjust amount of deleted files per step by consumed time. - // This is an attempt to avoid long periods of time, - // where the UI does not respond to user activity. - timedOut = IsTimedOut( startTime ); - } - } - - // Move to next item if done - if ( isItemDone ) - { - delete iFullPath; - iFullPath = NULL; - ++iCurrentIndex; - } - } - - if ( iCurrentIndex >= indexCount ) - { - iProcessDone = ETrue; - FlushNotifications(); - } - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::DialogDismissedL -// -// ----------------------------------------------------------------------------- -// -void CFileManagerActiveDelete::DialogDismissedL( TInt aButtonId ) - { - if ( aButtonId == EAknSoftkeyCancel ) - { - FlushNotifications(); - } - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::GetError -// -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CFileManagerActiveDelete::GetError( TDes& aFileName ) - { - if( iFileName.Length() > 0) - { - aFileName.Zero(); - aFileName.Append( iFileName ); - } - if ( iOpenFiles > 1 ) - { - iError = KErrFmgrSeveralFilesInUse; - } - return iError; - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::DeletedDrmItems -// -// ----------------------------------------------------------------------------- -// -EXPORT_C TInt CFileManagerActiveDelete::DeletedDrmItems(TInt& aTotalCount ) - { - aTotalCount = iDeletedItems; - return iDeletedDrmItems; - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::DeleteFileL -// -// ----------------------------------------------------------------------------- -// -void CFileManagerActiveDelete::DeleteFileL( - const TDesC& aFullPath, const TBool aReadOnlyChecked ) - { -#ifndef RD_DRM_RIGHTS_MANAGER_REMOVAL - TBool isLocalDataFile( EFalse ); - TBool isDrmProtected( EFalse ); - if ( !iIsRemoteDrive ) - { - // Check DRM protection - isDrmProtected = iUtils.IsDrmProtectedFile( aFullPath ); - if ( isDrmProtected ) - { - isLocalDataFile = iUtils.IsDrmLocalDataFile( aFullPath ); - } - } -#endif // RD_DRM_RIGHTS_MANAGER_REMOVAL - - TInt err( iFs.Delete( aFullPath ) ); - if ( err == KErrAccessDenied && !aReadOnlyChecked ) - { - // Remove readonly and retry - TEntry entry; - if( iFs.Entry( aFullPath, entry ) == KErrNone ) - { - CFileManagerUtils::RemoveReadOnlyAttribute( - iFs, aFullPath, entry ); - err = iFs.Delete( aFullPath ); - } - } - if ( !IsError( err ) ) - { - ++iDeletedItems; - // Notification is relevant only for local drives - if ( !iIsRemoteDrive ) - { - TRAPD( err2, iRemovedItems->AppendL( aFullPath ) ); - if ( err2 != KErrNone ) - { - ERROR_LOG1( - "CFileManagerActiveExecute::DeleteFileL-NotificationAppend-err=%d", - err2 ) - } - } -#ifndef RD_DRM_RIGHTS_MANAGER_REMOVAL - // Inform deletion of DRM protected files except local data files - if( isDrmProtected && !isLocalDataFile ) - { - ++iDeletedDrmItems; - SetName( aFullPath ); - } -#endif // RD_DRM_RIGHTS_MANAGER_REMOVAL - } - else - { - // Delete failed, update error info - SetError( err, aFullPath ); - if ( err == KErrInUse ) - { - ++iOpenFiles; - } - ++iNotDeletedItems; - } - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::IsDir -// -// ----------------------------------------------------------------------------- -// -TBool CFileManagerActiveDelete::IsDir( const TDesC& aFullPath ) - { - return CFileManagerUtils::HasFinalBackslash( aFullPath ); - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::SetName -// -// ----------------------------------------------------------------------------- -// -void CFileManagerActiveDelete::SetName( const TDesC& aFullPath, - TBool aOverWrite ) - { - if ( !aOverWrite && iFileName.Length() ) - { - return; - } - iFileName.Zero(); - if ( aFullPath.Length() ) - { - if ( IsDir( aFullPath ) ) - { - TParsePtrC parse( aFullPath.Left( aFullPath.Length() - 1 ) ); - iFileName.Append( parse.Name() ); - } - else - { - TParsePtrC parse( aFullPath ); - iFileName.Append( parse.NameAndExt() ); - } - } - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::IsError -// -// ----------------------------------------------------------------------------- -// -TBool CFileManagerActiveDelete::IsError( TInt aErr ) - { - return ( aErr != KErrNone && - aErr != KErrCorrupt && - aErr != KErrNotFound && - aErr != KErrPathNotFound ); - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::SetError -// -// ----------------------------------------------------------------------------- -// -void CFileManagerActiveDelete::SetError( TInt aErr, const TDesC& aFullPath ) - { - if ( iError == KErrNone && IsError( aErr ) ) - { - iError = aErr; - SetName( aFullPath, ETrue ); - } - } - -// ----------------------------------------------------------------------------- -// CFileManagerActiveDelete::FlushNotifications -// ----------------------------------------------------------------------------- -// -void CFileManagerActiveDelete::FlushNotifications() - { - if ( iRemovedItems->MdcaCount() > 0 ) - { - //TRAP_IGNORE( iMgxFileManager->UpdateL( *iRemovedItems ) ); - iRemovedItems->Reset(); - } - } - -// End of file