filesystemuis/memscaneng/serversrc/mseng.cpp
branchRCL_3
changeset 38 491b3ed49290
parent 36 95243422089a
child 39 65326cf895ed
--- a/filesystemuis/memscaneng/serversrc/mseng.cpp	Thu Aug 19 09:42:45 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,589 +0,0 @@
-/*
-* 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: 
-*     The actual "engine". 
-*
-*
-*/
-
-
-// INCLUDE FILES
-
-
-// SYSTEM INCLUDES
-#include    <mseng.rsg>
-#include    <bautils.h>
-#include    <driveinfo.h>
-
-// USER INCLUDES
-#include    "mseng.h"
-#include    "mseng.hrh"
-#include    "msengscanner.h"
-
-// ========================= MEMBER FUNCTIONS ================================
-
-// ---------------------------------------------------------------------------
-// CMseng::CMseng()
-//
-// C++ default constructor. Can NOT contain any code, that might leave.
-// ---------------------------------------------------------------------------
-
-
-    
-CMseng::CMseng( MMsengUIHandler& aUIHandler ) :
-    iUIHandler(aUIHandler),
-    iFreeMemory(0)
-    {
-    }    
-
-// ---------------------------------------------------------------------------
-// CMseng::NewL()
-//
-// Two-phased constructor.
-// ---------------------------------------------------------------------------
-
-EXPORT_C CMseng* CMseng::NewL(MMsengUIHandler& aUIHandler)
-    {
-    CMseng* self = new (ELeave) CMseng(aUIHandler);
-       
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// CMseng::ConstructL()
-//
-// Symbian OS default constructor can leave.
-// ---------------------------------------------------------------------------
-
-void CMseng::ConstructL()
-    {
-    #ifdef __SHOW_RDEBUG_PRINT_
-    RDebug::Print(_L("** CMseng::ConstructL()... starting **"));
-    #endif // __SHOW_RDEBUG_PRINT_
-
-    // Connect to File Server
-    User::LeaveIfError(iFsSession.Connect());
-
-    // Open the resource file
-    TParse* fp = new(ELeave) TParse(); 
-    fp->Set(KMsengRscFilePath, &KDC_RESOURCE_FILES_DIR, NULL); 
-    TFileName fileName( fp->FullName() );
-    delete fp;
-
-
-    BaflUtils::NearestLanguageFile( iFsSession, fileName );
-    //
-    TEntry entry;
-    User::LeaveIfError( iFsSession.Entry( fileName, entry ) );
-    // if file does not exist, leaves with KErrNotFound
-
-    iResFile = CResourceFile::NewL( iFsSession, fileName, 0, entry.FileSize() );
-    
-    iResFile->ConfirmSignatureL();
-    
-
-    /////////////////////////////////////////////////////////
-    //create data structures and initialize them from resource file
-
-    TInt index = -1; // index used in for-loops
-    TInt subindex = -1; // index used in for-loops inside another for-loop
-    TInt length = -1; // length of resource array being read
-    TInt sublength = -1; // length of sub-array inside array resource
-
-    RResourceReader theReader;
-    theReader.OpenLC( iResFile, DATAGROUPNAMEARRAY );
-    
-
-    //the first WORD contains the number of elements in the resource
-    iNumberOfDataGroups = theReader.ReadInt16L();
-    
-    CleanupStack::PopAndDestroy( &theReader );
-    
-    
-
-    /////////////////////////////////////////////////////////
-    // Read the resource containing the data needed to create
-    // mapping between data groups and UIDs
-    //
-    theReader.OpenLC( iResFile, DATAGROUPUIDARRAY );  
-   
-    //the first WORD contains the number of elements in the resource
-    length = theReader.ReadInt16L();
-
-   
-    // Create array with such granularity that reallocation is unnecessary
-    // initialize array to contain null pointers 
-    iDataGroupUidArray = new (ELeave) CArrayPtrFlat<CIntArray>(iNumberOfDataGroups);
-    for(index=0; index<iNumberOfDataGroups; index++)
-        {
-        iDataGroupUidArray->AppendL(NULL);
-        }
-    TInt groupindex; // value from enum TDataGroups
-    // Read the array resource
-    for(index=0; index<length; index++)
-        {
-        // Read one enum TDataGroups value
-        groupindex = theReader.ReadInt8L();
-        
-        // Read the sub-array. First WORD contains array length.
-        sublength = theReader.ReadInt16L();
-        
-        // Create new CUidArray with appropriate granularity
-        // and insert it into the main array
-        CIntArray* subarray = new (ELeave) CIntArray(iNumberOfDataGroups);
-        CleanupStack::PushL(subarray);
-        if( groupindex < iDataGroupUidArray->Count() )
-            {
-            iDataGroupUidArray->At(groupindex) = subarray;
-            }
-        
-        // Read the subarray resource
-        for(subindex=0; subindex<sublength; subindex++)
-            {
-            // uidtype matches one value fron enum TUidTypes
-            TInt uidtype = theReader.ReadInt8L(); 
-            if( groupindex < iDataGroupUidArray->Count() )
-                {
-                iDataGroupUidArray->At(groupindex)->InsertL(subindex,uidtype);
-                }
-            }
-        CleanupStack::Pop( subarray );
-        }
-    CleanupStack::PopAndDestroy( &theReader );
-
-    /////////////////////////////////////////////////////////
-    // Read the resource containing the data needed to create
-    // mapping between data groups and extensions 
-    //
-    theReader.OpenLC( iResFile, DATAGROUPEXTARRAY );
-
-    //the first WORD contains the number of elements in the resource
-    length = theReader.ReadInt16L();
-    // Create array with such granularity that reallocation is unnecessary
-    // Initialize it to contain null pointers, since some cells can leave empty
-    iDataGroupExtArray = new (ELeave) CArrayPtrFlat<CIntArray>(iNumberOfDataGroups);
-    for(index=0; index<iNumberOfDataGroups; index++)
-        {
-        iDataGroupExtArray->AppendL(NULL);
-        }
-    // Read the array resource
-    for(index=0; index<length; index++)
-        {
-        // Read one enum TDataGroups value
-        groupindex = theReader.ReadInt8L();
-        // Read the sub-array. First WORD contains array length.
-        sublength = theReader.ReadInt16L();
-        // Create new CIntArray with appropriate granularity
-        // and insert it into the main array
-        CIntArray* subarray = new (ELeave) CIntArray(sublength);
-        CleanupStack::PushL(subarray);
-        if( groupindex < iDataGroupExtArray->Count() )
-            {
-            iDataGroupExtArray->At(groupindex) = subarray;
-            }
-        
-        // Read the subarray resource
-        for(subindex=0; subindex<sublength; subindex++)
-            {
-            // exttype matches one value fron enum TUidTypes
-            TInt exttype = theReader.ReadInt8L();
-            if( groupindex < iDataGroupExtArray->Count() )
-                {
-                iDataGroupExtArray->At(groupindex)->InsertL(subindex,exttype);
-                }
-            }
-        CleanupStack::Pop( subarray );
-        }
-
-    CleanupStack::PopAndDestroy( &theReader );
-    
-    //instantiate scanner
-    iScanner = new (ELeave) CMsengScanner(iUIHandler, *iResFile);
-    }
-    
-
-// ---------------------------------------------------------------------------
-// CMseng::~CMseng()
-// 
-// Destructor.
-// ---------------------------------------------------------------------------
-
-EXPORT_C CMseng::~CMseng()
-    {
-#ifdef __SHOW_RDEBUG_PRINT_
-    RDebug::Print(_L("** CMseng::~CMseng(). Finished. **"));
-#endif // __SHOW_RDEBUG_PRINT_
-
-    delete iScanner;
-    
-    // Pointer arrays: elements must be deleted before deleting array
-    if(iDataGroupUidArray)
-        {
-        iDataGroupUidArray->ResetAndDestroy();
-        }
-    delete iDataGroupUidArray;
-    
-    
-    if(iDataGroupExtArray)
-        {
-        iDataGroupExtArray->ResetAndDestroy();
-        }
-    delete iDataGroupExtArray;
-  
-        
-    delete iResFile;
-    
-    iFsSession.Close();       
-    }
-
-
-
-// ---------------------------------------------------------------------------
-// CMseng::DataGroupsL()
-//
-// Get a descriptor array containing the names of the data groups.
-// ---------------------------------------------------------------------------
-
-EXPORT_C CDesCArray* CMseng::DataGroupsL() const
-    {
-#ifdef __SHOW_RDEBUG_PRINT_
-    RDebug::Print(_L("CMseng::GetDataGroupsL() called."));
-#endif // __SHOW_RDEBUG_PRINT_
-
-
-    // Create the array for the data group names with appropriate granularity
-    CDesCArray* dataGroupNameArray = new (ELeave) CDesCArrayFlat(iNumberOfDataGroups);
-    CleanupStack::PushL(dataGroupNameArray);
-
-    // Read the resource containing data group names 
-    // and put them to resultArray
-    
-    RResourceReader theReader;
-    theReader.OpenLC( iResFile, DATAGROUPNAMEARRAY );
-    
-    
-    // The first WORD contains the number of elements in the resource
-    // (actually this is already in iNumberOfDataGroups)
-
-    TInt length = theReader.ReadInt16L();
-    __ASSERT_DEBUG(iNumberOfDataGroups == length, User::Panic(_L("CMseng::DataGroupsL"), KErrGeneral));
-    
-    // Read the data group names from resource file and insert to array
-    TInt groupindex; // value from enum TDataGroups
-    for(TInt index=0; index<length; index++)
-        {
-        groupindex = theReader.ReadInt8L();
-        TPtrC name = theReader.ReadTPtrCL();
-        // Copy the name to the right place in the array
-        dataGroupNameArray->InsertL(groupindex, name);
-        }
-    CleanupStack::PopAndDestroy( &theReader );
-
-    // Return the array of data groups
-    CleanupStack::Pop( dataGroupNameArray );
-
-#ifdef __SHOW_RDEBUG_PRINT_
-// print the data group array
-    RDebug::Print(_L("Printing the Data Groups:"));
-    for(TInt k = 0; k < dataGroupNameArray->Count(); k++)
-        {
-        HBufC* groupName = dataGroupNameArray->MdcaPoint(k).AllocL();
-        RDebug::Print( _L("    %d: %S"), k, groupName);
-        delete groupName;
-        }
-#endif // __SHOW_RDEBUG_PRINT_
-
-    return dataGroupNameArray;
-    
-    }
-
-// ---------------------------------------------------------------------------
-// CMseng::ScanResultL()
-//
-// Returns an array of scan results
-// ---------------------------------------------------------------------------
-
-EXPORT_C CArrayFix<TInt64>* CMseng::ScanResultL() const
-    {
-#ifdef __SHOW_RDEBUG_PRINT_
-    RDebug::Print(_L("CMseng::ScanResultL() called. Starting to calculate result..."));
-#endif // __SHOW_RDEBUG_PRINT_
-
-    // Create the result array (with such granularity that reallocations do not happen)
-    CArrayFix<TInt64>* resultArray = new (ELeave) CArrayFixFlat<TInt64>(iNumberOfDataGroups);
-    CleanupStack::PushL(resultArray);
-
-    // Get result arrays from scanner 
-    const CArrayFix<TInt64>* extResultArray = iScanner->ExtResults();
-    const CArrayFix<TInt64>* uidResultArray = iScanner->UidResults();
-    const CArrayFix<TInt64>* groupResultArray = iScanner->GroupResults();
-
-    // Initialize the result array from the array of initial result
-    for (TInt i = 0; i < iNumberOfDataGroups; i++)
-        {
-        if( i < groupResultArray->Count() )
-            {
-            resultArray->AppendL(groupResultArray->At(i));
-            }
-        }
-
-    //Calculate the results and put them to the array
-    
-    // Find results for each data group
-    for(TInt groupindex = 0; groupindex < iNumberOfDataGroups; groupindex++)
-        {
-        // For one data group, the UIDs belonging to this group are listed in 
-        // iDataGroupExtArray. For each of these UIDs, add the result to the total result.
-
-        // If the examined data group does not have associated UIDs, 
-        // iDataGroupUidArray->At(groupindex) is a NULL pointer.
-        if(iDataGroupUidArray->At(groupindex))
-            {
-            TInt count = iDataGroupUidArray->At(groupindex)->Count();
-            for(TInt uidindex = 0; uidindex < count; uidindex++)
-                {
-                resultArray->At(groupindex) += 
-                    uidResultArray->At( iDataGroupUidArray->At(groupindex)->At(uidindex) );
-                }
-            }
-
-        // The extension results are collected in a similar manner
-
-        // If the examined data group does not have associated UIDs, 
-        // iDataGroupUidArray->At(groupindex) is a NULL pointer
-        if(iDataGroupExtArray->At(groupindex))
-            {
-            TInt count = iDataGroupExtArray->At(groupindex)->Count();
-            for(TInt extindex = 0; extindex < count; extindex++)
-                {
-                resultArray->At(groupindex) += 
-                    extResultArray->At( iDataGroupExtArray->At(groupindex)->At(extindex) );
-                }
-            }
-        }
-    // Calculate "Free memory" and "All device data"
-    TInt64 totalMemory;
-    TInt64 freeMemory;
-    DiskInfoL(totalMemory, freeMemory, iScanner->CurrentDrive());
-#ifdef __SHOW_RDEBUG_PRINT_
-    RDebug::Print(_L("CMseng::ScanresultL(): iFreeMemory %d, freeMemory %d"), (TUint32)iFreeMemory, (TUint32)freeMemory);
-#endif
-    // For some reason there is sometimes 16 kB difference in free memory when scanning started
-    // vs. scanning ended (16 kB more at the end of scanning) and latter one is incorrect.
-    // That is why free memory detected in the beginning of scanning taken into account. 
-    if(iFreeMemory)
-        {
-        freeMemory = iFreeMemory;
-        }
-    else
-        {
-        iFreeMemory = freeMemory;
-        }
-    
-    // "Free memory" is the memory currently available
-    resultArray->At(EGroupFreeMemory) = freeMemory;
-    // "All Device Data" is all memory used
-    resultArray->At(EGroupAllDeviceData) = (totalMemory - freeMemory);
-    
-    // Calculate how much files not falling to any predefined category consume
-    TInt64 others( 0 );
-    for( TInt i = EGroupCalendar; i < iNumberOfDataGroups; i++ )
-        {
-        others += resultArray->At( i );
-        }
-    
-    // This should never happen, but just in case check that negative count is not established.
-    if( resultArray->At(EGroupAllDeviceData) - others < 0 )
-        {
-        resultArray->At( EGroupOthers ) = 0;
-        }
-    else
-        {
-        resultArray->At( EGroupOthers ) = resultArray->At(EGroupAllDeviceData) - others;
-        }
-
-// write the result array to log file
-#ifdef __SHOW_RDEBUG_PRINT_
-    RDebug::Print(_L("CMseng::ScanresultL(): current result array -"));
-    // note that the log macros cannot handle TInt64
-    for(TInt k = 0; k < resultArray->Count(); k++)
-        {
-        const TInt KMaxChars = 32;
-        TBuf<KMaxChars> num;
-        num.Num(resultArray->At(k));
-        RDebug::Print(num);
-        }
-#endif // __SHOW_RDEBUG_PRINT_
-
-    CleanupStack::Pop( resultArray );
-    return resultArray;
-    }
-
-// ---------------------------------------------------------------------------
-// CMseng::ScanInProgress()
-//
-// Return ETrue if there is scanning going on, otherwise EFalse.
-// ---------------------------------------------------------------------------
-//
-EXPORT_C TBool CMseng::ScanInProgress() const
-    {
-    if(iScanner) 
-        {
-        return iScanner->HaveActiveScanners();
-        }
-    else
-        {
-        return EFalse;
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CMseng::DiskInfoL
-//
-// Retrieves information about disk usage.
-// ---------------------------------------------------------------------------
-//
-EXPORT_C void CMseng::DiskInfoL(TInt64& aTotal, TInt64& aFree, const TDriveNumber aVolume) const
-    {
-
-    TVolumeInfo vinfo;
-    User::LeaveIfError(iFsSession.Volume(vinfo, aVolume));
-    aTotal = TInt64(vinfo.iSize);
-    aFree = TInt64(vinfo.iFree);
-
-	}
-
-// ---------------------------------------------------------------------------
-// CMseng::MemInfoL
-//
-// Retrieves information about RAM usage.
-// ---------------------------------------------------------------------------
-//
-EXPORT_C void CMseng::MemInfoL(TInt64& aTotal, TInt64& aFree)
-    {
-    TMemoryInfoV1Buf membuf;
-    User::LeaveIfError(UserHal::MemoryInfo(membuf));
-    TMemoryInfoV1 minfo = membuf();
-    aTotal = minfo.iTotalRamInBytes;
-    aFree = minfo.iFreeRamInBytes;
-    }
-
-// ---------------------------------------------------------------------------
-// CMseng::ScanL()
-//
-// First scan the specific data files.
-// Then scan directories that are scanned for the 
-// size of all files. Then call scanner's ScanL.
-// ---------------------------------------------------------------------------
-//
-EXPORT_C void CMseng::ScanL(TDriveNumber aDrive)
-    {
-    __ASSERT_ALWAYS( (CMseng::IsInternalDrive(iFsSession, aDrive)
-        || CMseng::IsRemovableDrive(iFsSession, aDrive)), User::Leave(KErrNotSupported) );
-
-    // Scanning started.
-    iUIHandler.StartL();
-    
-    // Start scanning memory, check that not already doing it
-    TInt err = iScanner->ScanL(aDrive, iNumberOfDataGroups, iFsSession);
-    if(err != KErrNone) // can be only KErrNone or KErrInUse
-        {
-        iUIHandler.ErrorL(KErrInUse);
-        }        
-    }
-
-// ---------------------------------------------------------------------------
-// CMseng::Cancel()
-// 
-// ---------------------------------------------------------------------------
-//
-EXPORT_C void CMseng::Cancel()
-    {
-#ifdef __SHOW_RDEBUG_PRINT_
-    RDebug::Print(_L("CMseng::Cancel() called. canceling scanning..."));
-#endif // __SHOW_RDEBUG_PRINT_
-    
-    iScanner->Cancel();
-    }
-
-// -----------------------------------------------------------------------------
-// CMseng::IsInternalDrive
-// -----------------------------------------------------------------------------
-//
-TBool CMseng::IsInternalDrive( RFs& aFs, TInt aDrv )
-    {
-    TDriveInfo drvInfo;
-    if ( aFs.Drive( drvInfo, aDrv ) == KErrNone )
-        {
-         if ( !( drvInfo.iDriveAtt & KDriveAttInternal ) &&
-              drvInfo.iDriveAtt & ( KDriveAttRemovable | KDriveAttRemote ) )
-            {
-            return EFalse;
-            }
-        }
-    else
-        {
-        return EFalse;
-        }
-    return ETrue;
-    }
-
-// -----------------------------------------------------------------------------
-// CMseng::IsRemovableDrive
-// -----------------------------------------------------------------------------
-//
-TBool CMseng::IsRemovableDrive( RFs& aFs, TInt aDrv )
-    {
-    TDriveInfo drvInfo;
-    if ( aFs.Drive( drvInfo, aDrv ) == KErrNone )
-        {
-         if ( !( drvInfo.iDriveAtt & KDriveAttRemovable ) )
-            {
-            return EFalse;
-            }
-        }
-    else
-        {
-        return EFalse;
-        }
-    return ETrue;
-    }
-
-// -----------------------------------------------------------------------------
-// CMseng::IsMassStorageDrive
-// -----------------------------------------------------------------------------
-//
-TBool CMseng::IsMassStorageDrive( RFs& aFs, TInt aDrv )
-    {
-    
-    TUint drvStatus( 0 );
-    TInt err( DriveInfo::GetDriveStatus( aFs, aDrv, drvStatus ) );
-    if ( err != KErrNone )
-        {
-        return EFalse;
-        }
-    
-    if ( ( drvStatus & DriveInfo::EDriveInternal ) &&
-        ( drvStatus & DriveInfo::EDriveExternallyMountable ) )
-        {
-        return ETrue;
-        }
-    return EFalse;
-    }
-
-//  End of File