diff -r 000000000000 -r 6a9f87576119 filesystemuis/memscaneng/serversrc/msengfileextscanner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filesystemuis/memscaneng/serversrc/msengfileextscanner.cpp Mon Jan 18 20:09:41 2010 +0200 @@ -0,0 +1,208 @@ +/* +* Copyright (c) 2006-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: +* Scanner class used to scan file system by filename extensions. +* +*/ + + +// USER INCLUDES +#include "msengfileextscanner.h" +#include "msenguihandler.h" + + +// ================= MEMBER FUNCTIONS ======================================== + +// --------------------------------------------------------------------------- +// CMsengFileExtScanner::CMsengFileExtScanner() +// +// C++ default constructor. Can NOT contain any code, that might leave. +// --------------------------------------------------------------------------- +CMsengFileExtScanner::CMsengFileExtScanner(MMsengScannerObserver& aObserver, + CMsengInfoArray& aScanArray, + RFs& aFsSession) +: CMsengFileScanner(aObserver, aScanArray, aFsSession), iMoveToNextDirectory(ETrue) + { + } + +// --------------------------------------------------------------------------- +// CMsengFileExtScanner::NewL() +// +// Two-phased constructor +// --------------------------------------------------------------------------- +CMsengFileExtScanner* CMsengFileExtScanner::NewL(MMsengScannerObserver& aObserver, + CMsengInfoArray& aScanArray, + RFs& aFsSession) + { + CMsengFileExtScanner* self = + new (ELeave) CMsengFileExtScanner(aObserver, aScanArray, aFsSession); + return self; + } + +// --------------------------------------------------------------------------- +// CMsengFileExtScanner::~CMsengFileExtScanner() +// +// Destructor +// --------------------------------------------------------------------------- +CMsengFileExtScanner::~CMsengFileExtScanner() + { + } + + + + +// --------------------------------------------------------------------------- +// CMsengFileExtScanner::FindFilesL() +// +// --------------------------------------------------------------------------- +// +CDir* CMsengFileExtScanner::FindFilesL(const TDesC& aDirectory, TBool& aMoveToNextDirectory) + { + + // iMoveToNextDirectory is true only when starting to handle the + // current directory. Reset iCurrentExtensionIndex. + if(iMoveToNextDirectory) + { + iCurrentExtensionIndex = -1; + iMoveToNextDirectory = EFalse; +#ifdef __SHOW_RDEBUG_PRINT_ + RDebug::Print(_L("Entering directory:")); + RDebug::Print(_L("%S"), &aDirectory); +#endif // __SHOW_RDEBUG_PRINT_ + } + + // This function performs a search for each file in the directory by extension. + iCurrentExtensionIndex++; + const TPtrC pCurrentExtension(InfoArray().Exts()[iCurrentExtensionIndex]); + +#ifdef __SHOW_RDEBUG_PRINT_ + RDebug::Print(_L("Searching files with extension %d"), iCurrentExtensionIndex); +#endif // __SHOW_RDEBUG_PRINT_ + + // Get a list of results for this directory + CDir* results = NULL; + TParse parse; + TInt error; + + const TInt pathlength = pCurrentExtension.Length() + aDirectory.Length(); + if ( pathlength > KMaxFileName ) + { + error = KErrNotFound; +#ifdef __SHOW_RDEBUG_PRINT_ + RDebug::Print(_L("Path too long, files with extension %d do not fit to directory"), + iCurrentExtensionIndex); +#endif // __SHOW_RDEBUG_PRINT_ + } + + else + { + FsSession().Parse(pCurrentExtension, aDirectory, parse); + error = FsSession().GetDir(parse.FullName(), KEntryAttMaskSupported|KEntryAttAllowUid, + ESortNone, results); + } + + if (error == KErrNotFound) + { + results = NULL; + } + + // Should we move onto searching the next directory + // Yes, if this was the last extension. + const TInt extensionCount = InfoArray().Exts().Count(); + iMoveToNextDirectory = (iCurrentExtensionIndex >= extensionCount-1); + aMoveToNextDirectory = iMoveToNextDirectory; + + // Return populated (or potentially NULL) list. + return results; + } + +// --------------------------------------------------------------------------- +// CMsengFileExtScanner::HandleLocatedEntryL() +// +// +// --------------------------------------------------------------------------- +// +CMsengFileScanner::TLocationResponse CMsengFileExtScanner::HandleLocatedEntryL( + const TDesC& aFullFileNameAndPath, const TEntry& aEntry) + { + TLocationResponse response = EEntryWasDiscarded; + const TInt KUidLocation = 2; + TUid fileUid = aEntry[KUidLocation]; + + if ( fileUid == KNullUid ) + { + // Check whether extension found in special data dir + TBool addSize( ETrue ); + TInt dataDirCount = InfoArray().DataDirs().Count(); + for(TInt i=0; i < dataDirCount; i++) + { + TPtrC dataDirPath = InfoArray().DataDirs().MdcaPoint(i); + + if(aFullFileNameAndPath.Length() >= dataDirPath.Length()) + { + TFileName currentPath; + currentPath.Copy(aFullFileNameAndPath.Left(dataDirPath.Length())); + + // Compare whether folder matches + if(!currentPath.CompareF(dataDirPath)) + { + addSize = EFalse; + break; + } + } + } + + if( addSize ) + { + // Add size of object + InfoArray().AddSizeByExtL(iCurrentExtensionIndex, aEntry.iSize); + +#ifdef __SHOW_RDEBUG_PRINT_ + const TInt pathlength = aFullFileNameAndPath.Length(); + + if ( pathlength < KMaxFileName ) + { + RDebug::Print(_L("File: %S, extension number: %d, size: %d"), + &aFullFileNameAndPath, iCurrentExtensionIndex, aEntry.iSize); + } + else + { + RDebug::Print(_L("File: see next line, extension number: %d, size: %d"), + iCurrentExtensionIndex, aEntry.iSize ); + RDebug::Print(_L("Can not print %d characters long file name"), pathlength ); + } +#endif // __SHOW_RDEBUG_PRINT_ + + // We processed this one + response = EEntryWasProcessed; + } + } + else + { +#ifdef __SHOW_RDEBUG_PRINT_ + RDebug::Print(_L("Handling file: %S, file Uid: 0x%x"), + &aFullFileNameAndPath, fileUid.iUid); +#endif // __SHOW_RDEBUG_PRINT_ + + // Make sure other than native applications are not calculated + if( iCurrentExtensionIndex == EExtSis || iCurrentExtensionIndex == EExtSisx ) + { + InfoArray().AddSizeByExtL(iCurrentExtensionIndex, aEntry.iSize); + } + } + + return response; + } + +// End of File