diff -r 000000000000 -r 6a9f87576119 filemanager/Engine/src/CFileManagerActiveRename.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/Engine/src/CFileManagerActiveRename.cpp Mon Jan 18 20:09:41 2010 +0200 @@ -0,0 +1,205 @@ +/* +* Copyright (c) 2007 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: Class wraps rename operation +* +*/ + + +// INCLUDES +#include +#include "CFileManagerActiveRename.h" +#include "CFileManagerEngine.h" +#include "CFileManagerUtils.h" +#include "CFileManagerCommonDefinitions.h" +#include "FileManagerDebug.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CFileManagerActiveRename::CFileManagerActiveRename +// ----------------------------------------------------------------------------- +// +CFileManagerActiveRename::CFileManagerActiveRename( + CFileManagerEngine& aEngine, + CFileManagerUtils& aUtils ) : + iEngine( aEngine ), + iUtils( aUtils ), + iFs( aEngine.Fs() ) + { + FUNC_LOG + } + +// ----------------------------------------------------------------------------- +// CFileManagerActiveRename::~CFileManagerActiveRename +// ----------------------------------------------------------------------------- +// +CFileManagerActiveRename::~CFileManagerActiveRename() + { + FUNC_LOG + + delete iName; + delete iNewName; + } + +// ----------------------------------------------------------------------------- +// CFileManagerActiveRename::NewL +// ----------------------------------------------------------------------------- +// +CFileManagerActiveRename* CFileManagerActiveRename::NewL( + CFileManagerEngine& aEngine, + CFileManagerUtils& aUtils, + const TDesC& aName, + const TDesC& aNewName ) + { + FUNC_LOG + + CFileManagerActiveRename* self = new ( ELeave ) CFileManagerActiveRename( + aEngine, aUtils ); + CleanupStack::PushL( self ); + self->ConstructL( aName, aNewName ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CFileManagerActiveRename::ConstructL +// ----------------------------------------------------------------------------- +// +void CFileManagerActiveRename::ConstructL( + const TDesC& aName, const TDesC& aNewName ) + { + FUNC_LOG + + iName = aName.AllocL(); + iNewName = aNewName.AllocL(); + // Remove white spaces from end, file server also ignores those + iNewName->Des().TrimRight(); + iName->Des().TrimRight(); + + iIsRemoteDrive = iUtils.IsRemoteDrive( aName ); + BaseConstructL(); + } + +// ----------------------------------------------------------------------------- +// CFileManagerActiveRename::ThreadFunctionL +// ----------------------------------------------------------------------------- +// +void CFileManagerActiveRename::ThreadFunctionL( const TBool& aCanceled ) + { + FUNC_LOG + + TInt maxSubPath( 0 ); + TBool isFolder( CFileManagerUtils::HasFinalBackslash( *iName ) ); + if ( isFolder && !iIsRemoteDrive ) + { + // On local drives, solve maximum subfolder path to avoid too long paths + maxSubPath = ThreadGetMaxSubfolderPathL( aCanceled ); + } + if ( iNewName->Length() + maxSubPath > KMaxFileName ) + { + User::Leave( KErrBadName ); + } + if ( isFolder ) + { + User::LeaveIfError( iFs.Rename( *iName, *iNewName ) ); + } + else + { + // Replace the target item if exist + // if we have came here, it is already asked that + // user want's to overwrite other item + User::LeaveIfError( iFs.Replace( *iName, *iNewName ) ); + } + } + +// ----------------------------------------------------------------------------- +// CFileManagerActiveRename::ThreadGetMaxSubfolderPathL +// ----------------------------------------------------------------------------- +// +TInt CFileManagerActiveRename::ThreadGetMaxSubfolderPathL( + const TBool& aCanceled ) + { + FUNC_LOG + + CDirScan* dirScan = CDirScan::NewLC( iFs ); + + // Set scanning from current directory, + // take files and folder including the hidden and system files + // No sorting needed + dirScan->SetScanDataL( + *iName, + KEntryAttNormal | KEntryAttDir | KEntryAttHidden | KEntryAttSystem, + ESortNone ); + + TInt ret( 0 ); + CDir* dir = NULL; + dirScan->NextL( dir ); + while( dir ) + { + CleanupStack::PushL( dir ); + if ( aCanceled ) + { + User::Leave( KErrCancel ); + } + TInt count( dir->Count() ); + for ( TInt i( 0 ); i < count; ++i ) + { + if ( aCanceled ) + { + User::Leave( KErrCancel ); + } + const TEntry& entry( ( *dir )[ i ] ); + TPtrC abbrPath( dirScan->AbbreviatedPath() ); + TInt abbrPathLen( abbrPath.Length() ); + if ( abbrPathLen && abbrPath[ 0 ] == KFmgrBackslash()[ 0 ] ) + { + --abbrPathLen; // Initial backslash is already included + } + TInt pathLen( abbrPathLen + entry.iName.Length() ); + if( entry.IsDir() ) // Add space for trailing backslash + { + ++pathLen; + } + if( pathLen > ret ) + { + ret = pathLen; + } + if ( pathLen > KMaxFileName ) + { + User::Leave( KErrBadName ); + } + } + CleanupStack::PopAndDestroy( dir ); + dirScan->NextL( dir ); + } + CleanupStack::PopAndDestroy( dirScan ); + return ret; + } + +// ----------------------------------------------------------------------------- +// CFileManagerActiveRename::CancelThreadFunction +// ----------------------------------------------------------------------------- +// +void CFileManagerActiveRename::CancelThreadFunction() + { + FUNC_LOG + + if ( iName ) + { + iEngine.CancelTransfer( *iName ); + } + } + +// End of File