filesystemuis/memscaneng/serversrc/msengscanner.cpp
changeset 0 6a9f87576119
child 20 efe289f793e7
--- /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 <bautils.h>
+#include <mseng.rsg>
+
+// 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; i<length; i++)
+            {
+            groupindex = theReader.ReadInt8L();
+            HBufC* name = theReader.ReadHBufCL();
+            TChar ch;
+            if ( RFs::DriveToChar( aDrive, ch ) == KErrNone )
+                {
+                CleanupStack::PushL(name);
+                TPtr ptrName = name->Des();
+                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