filemanager/Engine/src/CfilemanagerActiveCount.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 18 Jan 2010 20:09:41 +0200
changeset 0 6a9f87576119
permissions -rw-r--r--
Revision: 201001 Kit: 201003

/*
* Copyright (c) 2002-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:  Calculates given folder size
*
*/


// INCLUDE FILES
#include "CFilemanagerActiveCount.h"

// CONSTANTS
const TInt KFileManagerProcessFilesPerCycle = 20;

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CFileManagerActiveCount::CFileManagerActiveCount
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CFileManagerActiveCount::CFileManagerActiveCount( RFs& aFs ) :
    iFs( aFs ),
    iFolders( KErrNotFound ),
    iFiles( KErrNotFound),
    iOpenFiles( KErrNotFound )
    {
    }

// -----------------------------------------------------------------------------
// CFileManagerActiveCount::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CFileManagerActiveCount* CFileManagerActiveCount::NewL( 
    RFs& aFs,
    const TDesC& aRootFolder,
    const CFileManagerItemProperties::TFileManagerFileType aType
    )
    {
    CFileManagerActiveCount* self = new( ELeave ) CFileManagerActiveCount( 
        aFs );
    CleanupStack::PushL( self );
    self->ConstructL( aRootFolder, aType );
    CleanupStack::Pop( self );
    return self;
    }

// -----------------------------------------------------------------------------
// CFileManagerActiveCount::ConstructL
// 
// -----------------------------------------------------------------------------
// 
void CFileManagerActiveCount::ConstructL( 
    const TDesC& aRootFolder,
    const CFileManagerItemProperties::TFileManagerFileType aType )
    {

    iDirScan = CDirScan::NewL( iFs );

    if ( aType == CFileManagerItemProperties::EFolder )
        {
        // Set scanning from current directory, take only folders
        // No sorting needed
        iDirScan->SetScanDataL(
            aRootFolder,
            KEntryAttDir | KEntryAttMatchExclusive,
            ESortNone );
        }
    else if ( aType == CFileManagerItemProperties::EFile ||
             aType == CFileManagerItemProperties::EOpen ||
             aType == CFileManagerItemProperties::EReadOnly )
        {
        // Set scanning from current directory, take only file
        // No sorting needed
        iDirScan->SetScanDataL(
            aRootFolder,
            KEntryAttNormal | KEntryAttHidden | KEntryAttSystem,
            ESortNone );
        }
    else
        {
        // Set scanning from current directory,
        // take file and folders except hidden and system files
        // No sorting needed
        iDirScan->SetScanDataL( aRootFolder, KEntryAttDir, ESortNone );
        }

    TRAPD( err, iDirScan->NextL( iDir ) );

    if ( err == KErrNone && iDir )
        {
        if ( aType == CFileManagerItemProperties::EOpen ||
             aType == CFileManagerItemProperties::EReadOnly )
            {
            iFiles = iDir->Count();
            iOpenFiles = 0;
            }
        else if ( aType == CFileManagerItemProperties::EFolder )
            {
            iFolders = iDir->Count();
            delete iDir;
            iDir = NULL;
            iProcessDone = ETrue;
            }
        else if ( aType == CFileManagerItemProperties::EFile )
            {
            iFiles = iDir->Count();
            delete iDir;
            iDir = NULL;
            iProcessDone = ETrue;
            }
        }

    }

// -----------------------------------------------------------------------------
// CFileManagerActiveCount::~CFileManagerActiveCount
// Destructor
// -----------------------------------------------------------------------------
// 
CFileManagerActiveCount::~CFileManagerActiveCount()
    {
    delete iDirScan;
    delete iDir;
    }

// -----------------------------------------------------------------------------
// CFileManagerActiveCount::IsProcessDone
// 
// -----------------------------------------------------------------------------
// 
TBool CFileManagerActiveCount::IsProcessDone() const
    {
    return iProcessDone;
    }

// -----------------------------------------------------------------------------
// CFileManagerActiveCount::StepL
// 
// -----------------------------------------------------------------------------
// 
void CFileManagerActiveCount::StepL()
    {
    if( !iDir )
        {
        iProcessDone = ETrue;
        return;
        }

    TInt processCount( KFileManagerProcessFilesPerCycle );
    while( iFileCounter < iDir->Count() && processCount )
        {
        const TEntry& entry( ( *iDir )[ iFileCounter ] );
        iFileName.Copy( iDirScan->FullPath() );
        iFileName.Append( entry.iName );
        TBool fileIsOpen( EFalse );
        if ( KErrNone == iFs.IsFileOpen( iFileName, fileIsOpen ) )
            {
            if ( fileIsOpen )
                {
                ++iOpenFiles;
                }
            }
        ++iFileCounter;
        --processCount;
        }

    if ( iFileCounter >= iDir->Count() )
        {
        delete iDir;
        iDir = NULL;
        iDirScan->NextL( iDir );
        if ( !iDir )
            {
            iProcessDone = ETrue;
            }
        iFileCounter = 0;
        }

    }

// -----------------------------------------------------------------------------
// CFileManagerActiveCount::FolderCount()
// 
// -----------------------------------------------------------------------------
// 
TInt CFileManagerActiveCount::FolderCount() const
    {
    if ( iProcessDone )
        {
        return iFolders;
        }
    return KErrNotFound;
    }

// -----------------------------------------------------------------------------
// CFileManagerActiveCount::FileCount()
//
// -----------------------------------------------------------------------------
//
TInt CFileManagerActiveCount::FileCount() const
    {
    if ( iProcessDone )
        {
        return iFiles;
        }
    return KErrNotFound;
    }

// -----------------------------------------------------------------------------
// CFileManagerActiveCount::OpenFiles()
//
// -----------------------------------------------------------------------------
//
TInt CFileManagerActiveCount::OpenFiles() const
    {
    if ( iProcessDone )
        {
        return iOpenFiles;
        }
    return KErrNotFound;
    }

// End of File