filemanager/Engine/src/TFileManagerDriveInfo.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-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:  Drive info storage
*
*/


// INCLUDE FILES
#include <coreapplicationuisdomainpskeys.h>
#include "TFileManagerDriveInfo.h"
#include "CFileManagerEngine.h"
#include "FileManagerDebug.h"
#include "CFileManagerCommonDefinitions.h"
#include "CFileManagerFeatureManager.h"
#ifdef RD_MULTIPLE_DRIVE
#include <driveinfo.h>
#endif // RD_MULTIPLE_DRIVE

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

// -----------------------------------------------------------------------------
// TFileManagerDriveInfo::TFileManagerDriveInfo
// -----------------------------------------------------------------------------
//
EXPORT_C TFileManagerDriveInfo::TFileManagerDriveInfo()
    {
    Reset();
    }

// -----------------------------------------------------------------------------
// TFileManagerDriveInfo::TFileManagerDriveInfo
// -----------------------------------------------------------------------------
//
EXPORT_C void TFileManagerDriveInfo::Reset()
    {
    iName.Zero();
    iCapacity = 0;
    iSpaceFree = 0;
    iUid = 0;
    iDrive = 0;
    iState = 0;
    }

// -----------------------------------------------------------------------------
// TFileManagerDriveInfo::GetInfoL
// -----------------------------------------------------------------------------
//
void TFileManagerDriveInfo::GetInfoL(
        const CFileManagerEngine& aEngine, const TInt aDrive )
    {
    FUNC_LOG

    INFO_LOG1( "TFileManagerDriveInfo::GetInfoL - aDrive %d", aDrive )

    Reset();
    iDrive = aDrive;

    RFs& fs( aEngine.Fs() );
    CheckMountL( fs, aDrive );
    TInt err( FillStateFromVolumeInfo( fs, aDrive ) );
    if ( err == KErrInUse )
        {
        iState |= EDriveInUse;
        }
    else if ( err == KErrCorrupt )
        {
        iState |= EDrivePresent | EDriveCorrupted;
        }
    else if ( err == KErrLocked )
        {
        iState |= EDrivePresent | EDriveLocked | EDriveFormatted |
            EDrivePasswordProtected | EDriveLockable;
        }
    else if ( err == KErrNone )
        {
        if ( iState & EDriveRemote )
            {
            if ( aEngine.IsRemoteDriveConnected( aDrive ) )
                {
                iState |= EDriveConnected;
                }
            }

#ifndef RD_FILE_MANAGER_BACKUP
        if ( iState & EDriveRemovable )
            {
            if ( aEngine.BackupFileExistsL( aDrive ) )
                {
                iState |= EDriveBackupped;
                }
            }
#endif // RD_FILE_MANAGER_BACKUP

        }

    INFO_LOG3( "TFileManagerDriveInfo::GetInfoL - aDrive %d, err %d, iState 0x%x",
        aDrive, err, iState )

    if ( aEngine.FeatureManager().IsEmbedded() )
        {
        // Disable format in embedded mode, because it messes up 
        // operations since embedded apps are closed.
        iState &= ~EDriveFormattable;
        }
    }

// -----------------------------------------------------------------------------
// TFileManagerDriveInfo::CheckMountL()
// -----------------------------------------------------------------------------
// 
void TFileManagerDriveInfo::CheckMountL(
        RFs& aFs, const TInt aDrive ) const
    {
    FUNC_LOG

    HBufC* fullname = HBufC::NewLC( KMaxFullName );
    TPtr name( fullname->Des() );
    TInt err( aFs.FileSystemName( name, aDrive ) );
    if ( err == KErrNone && !name.Length() )
        {
        // Drive isn't mounted at present, so try it now....
        // Returns KErrLocked, if locked and the password
        // is not in store
        err = aFs.MountFileSystem( KFmgrFatFSName, aDrive );
        }
    CleanupStack::PopAndDestroy( fullname );

    LOG_IF_ERROR1( err, "TFileManagerDriveInfo::CheckMountL-err=%d", err )
    }

// -----------------------------------------------------------------------------
// TFileManagerDriveInfo::FillStateFromDriveInfo()
// -----------------------------------------------------------------------------
// 
TInt TFileManagerDriveInfo::FillStateFromDriveInfo(
#ifdef RD_MULTIPLE_DRIVE
        RFs& aFs,
#else // RD_MULTIPLE_DRIVE
        RFs& /*aFs*/,
#endif // RD_MULTIPLE_DRIVE
        const TInt aDrive,
        const TDriveInfo& aDrvInfo )
    {
    FUNC_LOG

    TInt ret( KErrNone );

#ifdef RD_MULTIPLE_DRIVE
    TUint drvStatus( 0 );
    TInt err( DriveInfo::GetDriveStatus( aFs, aDrive, drvStatus ) );
    if ( err != KErrNone )
        {
        ERROR_LOG2( "TFileManagerDriveInfo::FillStateFromDriveInfo - aDrive %d, Status err %d",
            aDrive, err )
        }
    INFO_LOG2( "TFileManagerDriveInfo::FillStateFromDriveInfo - Media type %d, drvStatus 0x%x",
        aDrvInfo.iType, drvStatus )
    if ( aDrvInfo.iType != EMediaNotPresent && ( drvStatus & DriveInfo::EDriveInUse ) )
        {
        ret = KErrInUse; // Drive is reserved for exclusive usage like file transfer
        }
    if ( ( drvStatus & DriveInfo::EDriveInternal ) &&
        ( drvStatus & DriveInfo::EDriveExternallyMountable ) )
        {
        // Handle mass storage bits here
        iState |= EDriveMassStorage | EDriveRemovable;
        if ( aDrvInfo.iMediaAtt & KMediaAttFormattable )
            {
            iState |= EDriveFormattable;
            }
        if ( aDrvInfo.iMediaAtt & KMediaAttLocked )
            {
            // Locking internal drives is not supported
            iState |= EDriveCorrupted;
            ret = KErrCorrupt;
            }
        return ret;
        }
    if ( drvStatus & DriveInfo::EDriveUsbMemory )
        {
        iState |= EDriveUsbMemory;
        }
#endif // RD_MULTIPLE_DRIVE

    // Setup flags from drive info
    if ( aDrvInfo.iMediaAtt & KMediaAttWriteProtected )
        {
        iState |= EDriveWriteProtected;
        }
    if ( aDrvInfo.iMediaAtt & KMediaAttLocked )
        {
        iState |= EDriveLocked;
        ret = KErrLocked;
        }
    if ( aDrvInfo.iMediaAtt & KMediaAttFormattable )
        {
        iState |= EDriveFormattable;
        }
    if ( aDrvInfo.iMediaAtt & KMediaAttLockable )
        {
        iState |= EDriveLockable;
        }
    if ( aDrvInfo.iMediaAtt & KMediaAttHasPassword )
        {
        iState |= EDrivePasswordProtected;
        }
    if ( ( aDrvInfo.iDriveAtt & KDriveAttRemovable ) ||
        aDrive == KFmgrMemoryCardDrive )
        {
        iState |= EDriveRemovable;
#ifdef RD_MULTIPLE_DRIVE
        if ( drvStatus & DriveInfo::EDriveSwEjectable )
            {
            iState |= EDriveEjectable;
            }
#else // RD_MULTIPLE_DRIVE
        // Eject is possible for external memory cards
        if ( !( aDrvInfo.iDriveAtt & KDriveAttInternal ) ||
            aDrive == KFmgrMemoryCardDrive )
            {
            iState |= EDriveEjectable;
            }
#endif // RD_MULTIPLE_DRIVE
        }
    if ( aDrvInfo.iDriveAtt & KDriveAttRemote )
        {
        iState |= EDriveRemote;
        }

    return ret;
    }

// -----------------------------------------------------------------------------
// TFileManagerDriveInfo::FillStateFromVolumeInfo()
// -----------------------------------------------------------------------------
// 
TInt TFileManagerDriveInfo::FillStateFromVolumeInfo(
        RFs& aFs, const TInt aDrive )
    {
    FUNC_LOG

    TVolumeInfo volInfo;
    TInt ret( aFs.Volume( volInfo, aDrive ) );
    LOG_IF_ERROR1( ret,
        "TFileManagerDriveInfo::FillStateFromVolumeInfo - Volume err %d", ret );
    if ( ret == KErrNone )
        {
        // Get all information from volume info
        TInt maxLen( Min( volInfo.iName.Length(), KMaxVolumeName ) );

        iName = volInfo.iName.Left( maxLen );
        iUid = volInfo.iUniqueID;
        iCapacity = volInfo.iSize;
        iSpaceFree = volInfo.iFree;

        iState |= EDrivePresent;

        if ( volInfo.iSize )
            {
            iState |= EDriveFormatted;
            }

        ret = FillStateFromDriveInfo( aFs, aDrive, volInfo.iDrive );
        }
    else
        {
        // Get all information from drive info
        TDriveInfo& drvInfo( volInfo.iDrive );
        TInt err( aFs.Drive( drvInfo, aDrive ) );
        LOG_IF_ERROR1( err,
            "TFileManagerDriveInfo::FillStateFromVolumeInfo - Drive err %d", err );
        if ( err == KErrNone )
            {
            err = FillStateFromDriveInfo( aFs, aDrive, drvInfo );

            // If memory card is not ready but type is present,
            // then check if it is reserved.
            if( err == KErrNone &&
               ret == KErrNotReady &&
               drvInfo.iType != EMediaNotPresent )
                {
                // Check USB file transfer state
                TInt prop( ECoreAppUIsUSBFileTransferUninitialized );
                RProperty::Get(
                    KPSUidCoreApplicationUIs,
                    KCoreAppUIsUSBFileTransfer, prop );
                if ( prop == ECoreAppUIsUSBFileTransferActive )
                    {
                    ret = KErrInUse; // Reserved for file transfer
                    }
                INFO_LOG2( "TFileManagerDriveInfo::FillStateFromVolumeInfo-prop=%d,ret=%d",
                    prop, ret )
                }
            }
        if ( err != KErrNone )
            {
            ret = err;
            }
        }

    LOG_IF_ERROR2( ret,
        "TFileManagerDriveInfo::FillStateFromVolumeInfo - aDrive %d, Ret %d",
        aDrive, ret )

    return ret;
    }

//  End of File