diff -r 000000000000 -r 6a9f87576119 filesystemuis/memscaneng/serversrc/msengscanner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filesystemuis/memscaneng/serversrc/msengscanner.cpp Mon Jan 18 20:09:41 2010 +0200 @@ -0,0 +1,230 @@ +/* +* Copyright (c) 2006 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: +* This is the class that is in control most of the time. +* It instantiates CMsengScannerBase derived scanner classes +* to do the job. +* +*/ + + +// SYSTEM INCLUDES +#include +#include + +// USER INCLUDES +#include "msengscanner.h" +#include "msengfileextscanner.h" +#include "msengfindallscanner.h" +#include "msengregistryscanner.h" +#include "msenguihandler.h" +#include "mseng.h" + + +// LOCAL CONSTANTS AND MACROS +#ifdef _DEBUG +_LIT(KClassName, "CMsengScanner"); +#endif + +// ================= MEMBER FUNCTIONS ======================================== + +// --------------------------------------------------------------------------- +// CMsengScanner::CMsengScanner() +// +// C++ default constructor. Can NOT contain any code, that might leave. +// --------------------------------------------------------------------------- +CMsengScanner::CMsengScanner(MMsengUIHandler& aUIHandler, CResourceFile& aResFile) : +iUIHandler(aUIHandler), iResFile(aResFile) + { + } + +// --------------------------------------------------------------------------- +// CMsengScanner::~CMsengScanner() +// +// Destructor +// --------------------------------------------------------------------------- +CMsengScanner::~CMsengScanner() + { + delete iScanArray; + delete iFileExtScanner; + delete iFindAllScanner; + delete iRegistryScanner; + } + + + +// --------------------------------------------------------------------------- +// CMsengScanner::Cancel() +// +// --------------------------------------------------------------------------- +// +void CMsengScanner::Cancel() + { + iFileExtScanner->Cancel(); + iFindAllScanner->Cancel(); + iRegistryScanner->Cancel(); + TRAP_IGNORE( iUIHandler.QuitL(KErrCancel) ); + } + +// --------------------------------------------------------------------------- +// CMsengScanner::HaveActiveScanners() +// +// --------------------------------------------------------------------------- +// +TBool CMsengScanner::HaveActiveScanners() const + { + const TBool isActive = + (iFileExtScanner && iFileExtScanner->IsActive()) + || (iFindAllScanner && iFindAllScanner->IsActive()) + || (iRegistryScanner && iRegistryScanner->IsActive()) + ; + return isActive; + } + +// --------------------------------------------------------------------------- +// CMsengScanner::ScanL() +// +// --------------------------------------------------------------------------- +// +TInt CMsengScanner::ScanL(TDriveNumber aDrive, TInt aNumberOfDataGroups, RFs& aFsSession) + { + if(HaveActiveScanners()) + { + return KErrInUse; + } + + // Create data structures; delete the old ones + CMsengInfoArray* infoArray = CMsengInfoArray::NewL( aDrive, + aNumberOfDataGroups, + aFsSession, iResFile ); + + delete iScanArray; + iScanArray = infoArray; + + // Do some scanning tasks not include in ScanL + PreScanL(aDrive, aFsSession); + + // Start the scan by filename extension + iFileExtScanner = CMsengFileExtScanner::NewL(*this, *iScanArray, aFsSession); + iFileExtScanner->ScanL(iScanArray->Dirs()); + + // Start scanning data dirs (including messages) + iFindAllScanner = CMsengFindAllScanner::NewL(*this, *iScanArray, aFsSession); + iFindAllScanner->ScanL(iScanArray->DataDirs()); + + // Start the scan from registries + iRegistryScanner = CMsengRegistryScanner::NewL( aDrive, *this, *iScanArray, aFsSession ); + iRegistryScanner->Scan(); + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// MsengScanner::HandleScannerEventL() +// +// Handle the events from scanning +// --------------------------------------------------------------------------- +// +void CMsengScanner::HandleScannerEventL(TScannerEvent aEvent, + const CMsengScannerBase& /*aScanner*/, + TInt aError) + { +#ifdef __SHOW_RDEBUG_PRINT_ + RDebug::Print(_L("CMsengScanner::HandleScannerEventL() called with event: %d"), aEvent); +#endif // __SHOW_RDEBUG_PRINT_ + + switch(aEvent) + { + case MMsengScannerObserver::EScannerEventScanComplete: + // This scanner object has finished all of its scanning. + // If all the others are finished too, + // then we tell the UI that scanning is complete. + if (!HaveActiveScanners()) + { + iUIHandler.QuitL(KErrNone); + } + break; + + case MMsengScannerObserver::EScannerEventScanError: + // An error has happened + iUIHandler.ErrorL(aError); + break; + + default: + // should never happen + __ASSERT_DEBUG(EFalse,User::Panic(KClassName, KErrGeneral)); + break; + } + } + +// --------------------------------------------------------------------------- +// CMsengScanner::PreScanL() +// +// --------------------------------------------------------------------------- +// +void CMsengScanner::PreScanL(TDriveNumber aDrive, RFs& aFsSession) + { + // Before actual scanning, check the sizes of the few extra + // data files that are not scanned in normal way. + + RResourceReader theReader; + + TBool somethingToDo = EFalse; + if(CMseng::IsInternalDrive(aFsSession, aDrive)) + { + theReader.OpenLC( &iResFile, C_EXTRADATAFILES ); + somethingToDo = ETrue; + } + else if(CMseng::IsRemovableDrive(aFsSession, aDrive)) + { + theReader.OpenLC( &iResFile, E_EXTRADATAFILES ); + somethingToDo = ETrue; + } + if(somethingToDo) + { + //the first WORD contains the number of elements in the resource + const TInt length = theReader.ReadInt16L(); + + // Read the array resource, + TInt groupindex; // value from enum TDataGroups + for(TInt i=0; iDes(); + TBuf<1> drive; + drive.Append(ch); + ptrName.Replace(0, drive.Length(), drive); + + // check the size of the file whose path was in the resource. + TEntry file; + TInt err = aFsSession.Entry(ptrName, file); + if (err == KErrNone) + { + TInt size = file.iSize; + iScanArray->AddSizeByGroupL(groupindex, size); + } + + CleanupStack::PopAndDestroy(name); + } + } + } + CleanupStack::PopAndDestroy(&theReader); + } + +// End of File