--- /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