diff -r 000000000000 -r ccd0fd43f247 harvesterplugins/file/src/cfolderrenamedharvester.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvesterplugins/file/src/cfolderrenamedharvester.cpp Mon Apr 19 14:40:05 2010 +0300 @@ -0,0 +1,377 @@ +/* +* Copyright (c) 2010 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: +* +*/ + + +// INCLUDES +#include +#include +#include + +// For Logging +#include "harvesterserverlogger.h" + +#include "cfileplugin.h" +#include "cfolderrenamedharvester.h" + +// CONSTANTS +_LIT( KFileMask, "*.*" ); +const TInt KItemsPerRun = 1; + +namespace { + +void AppendBackslash( TDes& aDirectory ) + { + const TChar KBackslashChar( '\\' ); + const TInt lastChar = aDirectory.Length() - 1; + + // If it is directory which not contain backslash. + if ( KBackslashChar != aDirectory[lastChar] ) + { + aDirectory.Append( KBackslashChar ); + } + } + +} // namespace + +// ============================ MEMBER FUNCTIONS =============================== + + +// --------------------------------------------------------------------------- +// CFolderRenamedItem::NewL +// --------------------------------------------------------------------------- +// +CFolderRenamedItem * CFolderRenamedItem::NewL(const TDesC &aOldName, const TDesC &aNewName) + { + CFolderRenamedItem *self = new (ELeave) CFolderRenamedItem(); + CleanupStack::PushL( self ); + self->ConstructL( aOldName, aNewName ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CFolderRenamedItem::~CFolderRenamedItem +// --------------------------------------------------------------------------- +// +CFolderRenamedItem::~CFolderRenamedItem() + { + delete iOldName; + delete iNewName; + } + +// --------------------------------------------------------------------------- +// CFolderRenamedItem::CFolderRenamedItem +// --------------------------------------------------------------------------- +// +CFolderRenamedItem::CFolderRenamedItem() + { + } + + +// --------------------------------------------------------------------------- +// CFolderRenamedItem::ConstructL +// --------------------------------------------------------------------------- +// +void CFolderRenamedItem::ConstructL(const TDesC &aOldName, const TDesC &aNewName) + { + iOldName = aOldName.AllocL(); + iNewName = aNewName.AllocL(); + } + + +// --------------------------------------------------------------------------- +// CFolderRenamedItem::OldName +// --------------------------------------------------------------------------- +// +const TDesC& CFolderRenamedItem::OldName() + { + return *iOldName; + } + + +// --------------------------------------------------------------------------- +// CFolderRenamedItem::NewName +// --------------------------------------------------------------------------- +// +const TDesC& CFolderRenamedItem::NewName() + { + return *iNewName; + } + +// --------------------------------------------------------------------------- +// CFolderRenamedHarvester::NewL +// --------------------------------------------------------------------------- +// +CFolderRenamedHarvester* CFolderRenamedHarvester::NewL( CFilePlugin& aFilePlugin, RFs& aFs ) + { + CFolderRenamedHarvester* self = new (ELeave) CFolderRenamedHarvester( aFilePlugin, aFs ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// CFolderRenamedHarvester::~CFolderRenamedHarvester +// --------------------------------------------------------------------------- +// +CFolderRenamedHarvester::~CFolderRenamedHarvester() + { + delete iDir; + delete iDirscan; + iRenamedFolders.ResetAndDestroy(); + iRenamedFolders.Close(); + Cancel(); + } + +// --------------------------------------------------------------------------- +// CFolderRenamedHarvester::CFolderRenamedHarvester + +// --------------------------------------------------------------------------- +// +CFolderRenamedHarvester::CFolderRenamedHarvester( CFilePlugin& aFilePlugin, RFs& aFs ) + : CActive( CActive::EPriorityIdle ), + iFilePlugin( aFilePlugin ), + iFs( aFs ) + { + CPIXLOGSTRING("ENTER CFolderRenamedHarvester::CFolderRenamedHarvester"); + CActiveScheduler::Add( this ); + CPIXLOGSTRING("END CFolderRenamedHarvester::CFolderRenamedHarvester"); + } + + +// --------------------------------------------------------------------------- +// CFolderRenamedHarvester::ConstructL +// --------------------------------------------------------------------------- +// +void CFolderRenamedHarvester::ConstructL() + { + iDirscan = CDirScan::NewL( iFs ); + } + +// --------------------------------------------------------------------------- +// CFolderRenamedHarvester::StartL +// --------------------------------------------------------------------------- +// +TBool CFolderRenamedHarvester::StartL( const TFileName& aOldDirectoryName, + const TFileName& aNewDirectoryName ) + { + CPIXLOGSTRING("ENTER CFolderRenamedHarvester::Start"); + + // Append trailing backslash if required + TFileName oldName ( aOldDirectoryName ); + AppendBackslash( oldName ); + TFileName newName ( aNewDirectoryName ); + AppendBackslash( newName ); + + CFolderRenamedItem *renameItem = CFolderRenamedItem::NewL( oldName, newName ); + iRenamedFolders.AppendL( renameItem ); + + SetNextRequest( EFolderRenamedIdleState ); + CPIXLOGSTRING("END CFolderRenamedHarvester::Start"); + return ETrue; + } + +// --------------------------------------------------------------------------- +// CFolderRenamedHarvester::GetNextFolderL +// --------------------------------------------------------------------------- +// +void CFolderRenamedHarvester::GetNextFolderL() + { + CPIXLOGSTRING("ENTER CFolderRenamedHarvester::GetNextFolderL"); + + delete iDir; + iDir = NULL; + // Documentation: CDirScan::NextL() The caller of this function + // is responsible for deleting iDir after the function has returned. + iDirscan->NextL(iDir); + + if( iDir ) + { + CPIXLOGSTRING("CFolderRenamedHarvester::GetNextFolderL - IF EHarvesterGetFileId"); + SetNextRequest( EFolderRenamedGetFileId ); + } + else + { + CPIXLOGSTRING("CFolderRenamedHarvester::GetNextFolderL - IF EHarvesterIdle"); + + // finished folder rename, delete the folder from the array. + CFolderRenamedItem *item = iRenamedFolders[0]; + iRenamedFolders.Remove(0); + delete item; + + SetNextRequest( EFolderRenamedIdleState ); + } + CPIXLOGSTRING("END CFolderRenamedHarvester::GetNextFolderL"); + } + +// --------------------------------------------------------------------------- +// CFolderRenamedHarvester::GetFileIdL +// +// --------------------------------------------------------------------------- +// +void CFolderRenamedHarvester::GetFileIdL() + { + CPIXLOGSTRING("ENTER CFolderRenamedHarvester::GetFileId"); + + if( iCurrentIndex == 0 ) + { + TParse parse; + parse.Set(KFileMask(), &iDirscan->FullPath(), NULL); + + // FindWildByPath assigns iDir = NULL, then allocates the memory for it. + // Therefore must delete iDir first. + delete iDir; + iDir = NULL; + + TFindFile find( iFs ); + find.FindWildByPath(parse.FullName(), NULL, iDir); + } + + if( iDir ) + { + const TInt count(iDir->Count()); + while( ( iCurrentIndex < count ) && ( iStepNumber < KItemsPerRun ) ) + { + TEntry entry = (*iDir)[iCurrentIndex]; + // Check if entry is a hidden or system file + // if true -> continue until find something to index or have checked whole directory + if( !entry.IsHidden() && !entry.IsSystem() && !entry.IsDir() ) + { + TParse fileParser; + fileParser.Set( iDirscan->FullPath(), &(*iDir)[iCurrentIndex].iName, NULL ); + + TPtrC fileNamePtr = fileParser.FullName(); + TPtrC leaf( fileNamePtr.Right( fileNamePtr.Length() - iNewFolderName.Length() ) ); + TFileName oldFileName( iOldFolderName ); + oldFileName.Append( leaf ); + + iFilePlugin.CreateFileIndexItemL( oldFileName, ECPixRemoveAction ); + iFilePlugin.CreateFileIndexItemL( fileParser.FullName(), ECPixAddAction ); + // TODO: If this is not TRAPPED, state machine breaks + iStepNumber++; + } + iCurrentIndex++; + } + + iStepNumber = 0; + + if( iCurrentIndex >= count ) + { + iCurrentIndex = 0; + SetNextRequest( EFolderRenamedStartHarvest ); + } + else + { + SetNextRequest( EFolderRenamedGetFileId ); + } + } + else + { + SetNextRequest( EFolderRenamedStartHarvest ); + } + CPIXLOGSTRING("END CFolderRenamedHarvester::GetFileId"); + } + + +// ----------------------------------------------------------------------------- +// CFolderRenamedHarvester::DoCancel +// ----------------------------------------------------------------------------- +// +void CFolderRenamedHarvester::DoCancel() + { + CPIXLOGSTRING("CFolderRenamedHarvester::DoCancel"); + } + +// ----------------------------------------------------------------------------- +// CFolderRenamedHarvester::RunL +// ----------------------------------------------------------------------------- +// +void CFolderRenamedHarvester::RunL() + { + CPIXLOGSTRING("ENTER CFolderRenamedHarvester::RunL"); + // Simple Round-Robin scheduling. + Deque(); + CActiveScheduler::Add( this ); + + switch ( iHarvestState ) + { + case EFolderRenamedIdleState: + { + if ( iRenamedFolders.Count() == 0 ) + { + return; // Nothing to do. + } + + // Some rename folder action to perform + iOldFolderName.Copy( iRenamedFolders[0]->OldName() ); + iNewFolderName.Copy( iRenamedFolders[0]->NewName() ); + + iDirscan->SetScanDataL( iRenamedFolders[0]->NewName(), + KEntryAttMatchExclusive|KEntryAttNormal, + ESortNone, // No need to sort data + CDirScan::EScanDownTree ); + // No break, fall through to EFolderRenamedStartHarvest case + } + case EFolderRenamedStartHarvest: + { + GetNextFolderL(); + break; + } + case EFolderRenamedGetFileId: + { + GetFileIdL(); + break; + } + default: + break; + } + CPIXLOGSTRING("END CFolderRenamedHarvester::RunL"); + } + +// ----------------------------------------------------------------------------- +// CFolderRenamedHarvester::RunError +// ----------------------------------------------------------------------------- +// +TInt CFolderRenamedHarvester::RunError(TInt aError) + { + CPIXLOGSTRING2("CFolderRenamedHarvester::RunError - aError: %d", aError ); + iRenamedFolders.ResetAndDestroy(); + iHarvestState = EFolderRenamedIdleState; + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// SetNextRequest +// --------------------------------------------------------------------------- +// +void CFolderRenamedHarvester::SetNextRequest( TFileHarvesterState aState ) + { + CPIXLOGSTRING("CFolderRenamedHarvester::SetNextRequest"); + if ( !IsActive() ) + { + iHarvestState = aState; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + } + } + + +// End of File