diff -r 491b3ed49290 -r 65326cf895ed filemanager/src/filemanager/src/operationservice/fmoperationremove.cpp --- a/filemanager/src/filemanager/src/operationservice/fmoperationremove.cpp Tue Aug 31 15:06:05 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,203 +0,0 @@ -/* -* 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: -* -*/ - -#include "fmoperationremove.h" -#include "fmcommon.h" -#include "fmoperationbase.h" -#include "fmdrivedetailstype.h" -#include "fmutils.h" - -#include -#include -#include -#include - -/* \fn void driveSpaceChanged() - * This signal is emitted when copy or move is completed, and used to update the drive size. - */ - -/* - * Constructs a remove operation with - * \a parent parent - * \a pathList the file or path to be removed. - */ -FmOperationRemove::FmOperationRemove(QObject *parent, const QStringList &pathList ) : - FmOperationBase( parent, FmOperationService::EOperationTypeRemove ), - mPathList( pathList ), - mStop( 0 ), - mTotalCount( 0 ), mRemovedCount( 0 ), mTotalSteps( 100 ), mCurrentStep( 0 ) -{ - connect( this, SIGNAL( driveSpaceChanged() ), - parent, SLOT( on_operation_driveSpaceChanged() ) ); -} - -/* - * Destructs the operation. - */ -FmOperationRemove::~FmOperationRemove() -{ -} - -/* - * Returns the path list - */ -QStringList FmOperationRemove::pathList() -{ - return mPathList; -} - -/* - * Starts the operation. - * \a isStopped flag the outside stop operation - */ -void FmOperationRemove::start( volatile bool *isStopped ) -{ - mStop = isStopped; - mTotalCount = 0; - mRemovedCount = 0; - mCurrentStep = 0; - - if( mPathList.empty() ) { - emit notifyError( FmErrWrongParam, mErrString ); - return ; - } - - emit notifyPreparing( true ); - - quint64 totalSize= 0; - int numofFolders = 0; - int numofFiles = 0; - - int ret = FmFolderDetails::queryDetailOfContentList( mPathList, numofFolders, - numofFiles, totalSize, mStop, true ); - if( ret != FmErrNone ) { - emit notifyError( ret, mErrString ); - return; - } - mTotalCount = numofFolders + numofFiles; - - emit notifyStart( true, mTotalSteps ); - - foreach( const QString& srcPath, mPathList ) { - int ret = remove( srcPath ); - if( ret != FmErrNone ) { - emit notifyError( ret, mErrString ); - // refresh drive space no care if cancel, error or finished. - // as filemanger cannot notify drive space changed - // do not refresh path as QFileSystemModel will do auto-refresh - emit driveSpaceChanged(); - return; - } - } - emit notifyFinish(); - emit driveSpaceChanged(); -} - -/* - * Removes the file or dir with name \a fileName - */ -int FmOperationRemove::remove( const QString &fileName ) -{ - if( *mStop ) { - return FmErrCancel; - } - - int ret = FmErrNone; - QFileInfo fi( fileName ); - if (fi.isFile()) { - if( !QFile::remove( fileName ) ) { - mErrString = fileName; - ret = FmErrCannotRemove; - } - IncreaseProgressOnce(); - } else if (fi.isDir()) { - if( FmUtils::isDefaultFolder( fileName ) ){ - ret = FmErrRemoveDefaultFolder; - } - else{ - ret = recursiveRemoveDir( fileName ); - } - - - } else { - qWarning( "Things other than file and directory are not copied" ); - ret = FmErrIsNotFileOrFolder; - } - return ret; -} - -/* - * Remove the dir with name \a pathName - */ -int FmOperationRemove::recursiveRemoveDir( const QString &pathName ) -{ - QFileInfo fi( pathName ); - if (!fi.exists() || !fi.isDir()) - return FmErrSrcPathDoNotExist; - - QStack dirs; - dirs.push( QDir( pathName ) ); - - while (!dirs.isEmpty()) { - QFileInfoList infoList = dirs.top().entryInfoList( QDir::NoDotAndDotDot | QDir::AllEntries | QDir::Hidden | QDir::System ); - if (infoList.size() == 0) { - QDir dirToRemove( dirs.pop() ); - if ( !dirToRemove.rmdir( dirToRemove.absolutePath() ) ) { - mErrString = dirToRemove.absolutePath(); - return FmErrCannotRemove; - } - IncreaseProgressOnce(); - - } else { - QList dirList; - for (QFileInfoList::Iterator it = infoList.begin(); it != infoList.end(); ++it) { - if( *mStop ) { - return FmErrCancel; - } - - if (it->isDir()) { - dirList.push_front( QDir( it->absoluteFilePath() ) ); - } else { - if ( !QFile::remove( it->absoluteFilePath() ) ) { - mErrString = it->absoluteFilePath(); - return FmErrCannotRemove; - } - IncreaseProgressOnce(); - } - } - foreach( const QDir& dir, dirList ) { - dirs.push( dir ); - } - } - } - return FmErrNone; -} - -/* - * Increase the progress bar - */ -void FmOperationRemove::IncreaseProgressOnce() -{ - if( mTotalCount <= 0 ) - return; - mRemovedCount++; - int step = ( mRemovedCount * 100 ) / mTotalCount; - if( step > mCurrentStep ) { - mCurrentStep = step; - emit notifyProgress( mCurrentStep ); - } -}