commonservices/PlatformEnv/src/PathInfo.cpp
changeset 0 4e1aa6a622a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonservices/PlatformEnv/src/PathInfo.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,580 @@
+/*
+* 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:  Holds information of system paths.
+*                These utility methods should be used instead of hard coded.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "pathinfo.h"
+#include    "pathconfiguration.hrh"
+#include    <e32std.h>
+#include    <f32file.h>
+#include    <badesca.h>
+#include    "platformenvdebug.h"
+
+// MACROS
+
+// needed because _LIT macro does not expand parameter, which is also macro
+#define _CREATE_LIT(a,b) _LIT(a,b)
+
+#define ARRAY_LEN( a ) ( sizeof( a ) / sizeof( a[ 0 ] ) )
+
+// CONSTANTS
+
+_CREATE_LIT( KRomRootPath,              text_rom_root_path );
+_CREATE_LIT( KPhoneMemoryRootPath,      text_phone_memory_root_path );
+_CREATE_LIT( KMemoryCardRootPath,       text_memory_card_root_path );
+
+_CREATE_LIT( KGamesPath,                text_games_path );
+_CREATE_LIT( KInstallsPath,             text_installs_path );
+_CREATE_LIT( KOthersPath,               text_others_path );
+_CREATE_LIT( KVideosPath,               text_videos_path );
+_CREATE_LIT( KImagesPath,               text_images_path );
+_CREATE_LIT( KImagesThumbnailPath,      text_images_thumbnail_path );
+_CREATE_LIT( KPicturesPath,             text_pictures_path );
+_CREATE_LIT( KGmsPicturesPath,          text_gms_pictures_path );
+_CREATE_LIT( KMmsBackgroundImagesPath,  text_mms_background_images_path );
+_CREATE_LIT( KPresenceLogosPath,        text_presence_logos_path );
+_CREATE_LIT( KSoundsPath,               text_sounds_path );
+_CREATE_LIT( KDigitalSoundsPath,        text_digital_sounds_path );
+_CREATE_LIT( KSimpleSoundsPath,         text_simple_sounds_path );
+_CREATE_LIT( KMemoryCardContactsPath,   text_memory_card_contacts_path );
+
+_LIT( KPanicCategory, "PATHINFO" );
+
+_LIT( KDriveLetterMatch, "?:\\*" );
+_LIT( KDriveDefaultPath, ":\\" );
+const TInt KDriveNameLen = 3; // Length of drive letter, colon and backslash
+
+// Path property bit mask definitions
+enum TPathInfoProperty
+    {
+    EPathInfoPropNone = 0x0, // No special handling is required
+    EPathInfoPropAppendDenied = 0x1, // Append to root path is denied
+    EPathInfoPropDriveSpecific = 0x2, // Path is strictly drive specific
+    EPathInfoPropUnavailableForPhoneMem = 0x4 // Path is unavailable for default phone memory
+    };
+
+// Path property definitions that must exist for each path
+const TUint KPathProperties[] =
+    {
+    EPathInfoPropDriveSpecific,  // PathInfo::ERomRootPath, 0
+    EPathInfoPropDriveSpecific,  // PathInfo::EPhoneMemoryRootPath, 1
+    EPathInfoPropDriveSpecific,  // PathInfo::EMemoryCardRootPath, 2
+    EPathInfoPropNone,  // PathInfo::EGamesPath, 3
+    EPathInfoPropNone,  // PathInfo::EInstallsPath, 4
+    EPathInfoPropNone,  // PathInfo::EOthersPath, 5
+    EPathInfoPropNone,  // PathInfo::EVideosPath, 6
+    EPathInfoPropNone,  // PathInfo::EImagesPath, 7
+    EPathInfoPropNone,  // PathInfo::EGsmPicturesPath, 8
+    EPathInfoPropNone,  // PathInfo::EMmsBackgroundImagesPath, 9
+    EPathInfoPropNone,  // PathInfo::EPresenceLogosPath, 10
+    EPathInfoPropNone,  // PathInfo::ESoundsPath, 11
+    EPathInfoPropNone,  // PathInfo::EDigitalSoundsPath, 12
+    EPathInfoPropNone,  // PathInfo::ESimpleSoundsPath, 13
+    EPathInfoPropAppendDenied, // PathInfo::EImagesThumbnailPath, 14
+    EPathInfoPropUnavailableForPhoneMem // PathInfo::EMemoryCardContactsPath, 15
+    };
+
+// DATA TYPES
+
+enum TPathInfoPanic
+    {
+    EInvalidParameter        = 0 // Invalid parameter.
+    };
+
+// ============================= LOCAL FUNCTIONS ===============================
+// -----------------------------------------------------------------------------
+// ThumbnailPath
+// -----------------------------------------------------------------------------
+//
+static TBool ThumbnailPath( const TDesC& aFullPath )
+    {
+    FUNC_LOG
+
+    TInt len( KImagesThumbnailPath().Length() );
+    if ( aFullPath.Length() >= len &&
+        !aFullPath.Right( len ).CompareF( KImagesThumbnailPath ) )
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// PathInfo::RomRootPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::RomRootPath()
+    {
+    return KRomRootPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::PhoneMemoryRootPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::PhoneMemoryRootPath()
+    {
+    return KPhoneMemoryRootPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::MemoryCardRootPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::MemoryCardRootPath()
+    {
+    return KMemoryCardRootPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::GamesPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::GamesPath()
+    {
+    return KGamesPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::InstallsPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::InstallsPath()
+    {
+    return KInstallsPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::OthersPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::OthersPath()
+    {
+    return KOthersPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::VideosPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::VideosPath()
+    {
+    return KVideosPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::ImagesPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::ImagesPath()
+    {
+    return KImagesPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::ImagesThumbnailPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::ImagesThumbnailPath()
+    {
+    return KImagesThumbnailPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::PicturesPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::PicturesPath()
+    {
+    return KPicturesPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::GmsPicturesPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::GmsPicturesPath()
+    {
+    return KGmsPicturesPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::MmsBackgroundImagesPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::MmsBackgroundImagesPath()
+    {
+    return KMmsBackgroundImagesPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::PresenceLogosPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::PresenceLogosPath()
+    {
+    return KPresenceLogosPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::SoundsPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::SoundsPath()
+    {
+    return KSoundsPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::DigitalSoundsPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::DigitalSoundsPath()
+    {
+    return KDigitalSoundsPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::SimpleSoundsPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::SimpleSoundsPath()
+    {
+    return KSimpleSoundsPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::MemoryCardContactsPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::MemoryCardContactsPath()
+    {
+    return KMemoryCardContactsPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::GetPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& PathInfo::GetPath( TInt aPath )
+    {
+    FUNC_LOG_WITH_CLIENT_NAME
+
+    switch( aPath )
+        {
+        case PathInfo::ERomRootPath:
+            return KRomRootPath;
+
+        case PathInfo::EPhoneMemoryRootPath:
+            return KPhoneMemoryRootPath;
+
+	    case PathInfo::EMemoryCardRootPath: 
+            return KMemoryCardRootPath;
+
+        case PathInfo::EGamesPath:
+            return KGamesPath;
+
+        case PathInfo::EInstallsPath:
+            return KInstallsPath;
+            
+        case PathInfo::EOthersPath:
+            return KOthersPath;
+
+        case PathInfo::EVideosPath:
+            return KVideosPath;
+
+        case PathInfo::EImagesPath:
+            return KImagesPath;
+
+        case PathInfo::EGsmPicturesPath:
+            return KGmsPicturesPath;
+
+        case PathInfo::EMmsBackgroundImagesPath:
+            return KMmsBackgroundImagesPath;
+
+        case PathInfo::EPresenceLogosPath:
+            return KPresenceLogosPath;
+
+        case PathInfo::ESoundsPath:   
+            return KSoundsPath;
+         
+        case PathInfo::EDigitalSoundsPath:
+            return KDigitalSoundsPath;
+
+        case PathInfo::ESimpleSoundsPath:
+            return KSimpleSoundsPath;
+
+        case PathInfo::EImagesThumbnailPath:
+            return KImagesThumbnailPath;
+
+        case PathInfo::EMemoryCardContactsPath:  
+            return KMemoryCardContactsPath; 
+        
+        default:
+            User::Panic( KPanicCategory, EInvalidParameter );
+            // To get rid of compilation warnings.
+            return KNullDesC;
+
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::GetRootPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt PathInfo::GetRootPath( TDes& aRootPath, TInt aDrive )
+    {
+    FUNC_LOG_WITH_CLIENT_NAME
+
+    aRootPath.Zero();
+    TChar ch( 0 );
+    TInt ret( RFs::DriveToChar( aDrive, ch ) );
+    if ( ret == KErrNone )
+        {
+        if ( ch == KRomRootPath()[ 0 ] )
+            {
+            aRootPath.Copy( KRomRootPath );
+            }
+        else if ( ch == KPhoneMemoryRootPath()[ 0 ] )
+            {
+            aRootPath.Copy( KPhoneMemoryRootPath );
+            }
+        else if ( ch == KMemoryCardRootPath()[ 0 ] )
+            {
+            aRootPath.Copy( KMemoryCardRootPath );
+            }
+        else
+            {
+            aRootPath.Append( ch );
+            aRootPath.Append( KDriveDefaultPath );
+            }
+        }
+
+    INFO_LOG2( "PathInfo::GetRootPath-aRootPath=%S,aDrive=%d",
+        &aRootPath, aDrive )
+
+    LOG_IF_ERROR2( ret, "PathInfo::GetRootPath-aDrive=%d,ret=%d",
+        aDrive, ret )
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::GetFullPath
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt PathInfo::GetFullPath( TDes& aFullPath, TInt aDrive, TInt aPath )
+    {
+    FUNC_LOG_WITH_CLIENT_NAME
+
+    aFullPath.Zero();
+
+    // Check if requested path is valid or not
+    TInt count( ARRAY_LEN( KPathProperties ) );
+    if ( aPath < 0 || aPath >= count )
+        {
+        ERROR_LOG3( "PathInfo::GetFullPath-aDrive=%d,aPath=%d,ret=%d",
+            aDrive, aPath, KErrArgument )
+
+        return KErrArgument; // Invalid path value
+        }
+
+    TUint pathProp( KPathProperties[ aPath ] );
+
+    INFO_LOG2( "PathInfo::GetFullPath-aPath=%d,pathProp=0x%x",
+        aPath, pathProp )
+
+    if ( pathProp & EPathInfoPropAppendDenied )
+        {
+        return KErrNotFound; // Cannot append path to root path
+        }
+
+    TChar ch( 0 );
+    TInt ret( RFs::DriveToChar( aDrive, ch ) );
+    if ( ret != KErrNone )
+        {
+        ERROR_LOG3( "PathInfo::GetFullPath-aDrive=%d,aPath=%d,ret=%d",
+            aDrive, aPath, ret )
+
+        return ret; // No drive letter
+        }
+
+    if ( pathProp & EPathInfoPropUnavailableForPhoneMem )
+        {
+        if ( ch == KPhoneMemoryRootPath()[ 0 ] )
+            {
+            return KErrNotFound; // Drive is phone memory
+            }
+        }
+
+    TPtrC path( GetPath( aPath ) );
+    if ( !path.MatchF( KDriveLetterMatch ) )
+        {
+        if ( pathProp & EPathInfoPropDriveSpecific )
+            {
+            // The path is drive specific
+            if ( ch == path[ 0 ] )
+                {
+                aFullPath.Copy( path );
+                }
+            else
+                {
+                ret = KErrNotFound;
+                }
+            }
+        else
+            {
+            // Apply path to requested drive
+            ret = GetRootPath( aFullPath, aDrive );
+            if ( ret == KErrNone )
+                {
+                aFullPath.Append( path.Mid( KDriveNameLen ) );
+                }
+            }
+        }
+    else
+        {
+        // Apply path to requested drive
+        ret = GetRootPath( aFullPath, aDrive );
+        if ( ret == KErrNone )
+            {
+            aFullPath.Append( path );
+            }
+        }
+
+    INFO_LOG3( "PathInfo::GetFullPath-aFullPath=%S,aPath=%d,ret=%d",
+        &aFullPath, aPath, ret )
+
+#ifdef PLATFORM_ENV_ERROR_LOG
+    // Trace only unexpected errors, KErrNotFound is ok at this point
+    if ( ret != KErrNone && ret != KErrNotFound )
+        {
+        ERROR_LOG3( "PathInfo::GetFullPath-aDrive=%d,aPath=%d,ret=%d",
+            aDrive, aPath, ret )
+        }
+#endif // PLATFORM_ENV_ERROR_LOG
+
+    if ( ret != KErrNone )
+        {
+        aFullPath.Zero();
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::PathType
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt PathInfo::PathType( const TDesC& aFullPath )
+    {
+    FUNC_LOG_WITH_CLIENT_NAME
+
+    if ( aFullPath.MatchF( KDriveLetterMatch ) )
+        {
+        INFO_LOG2( "PathInfo::PathType-aFullPath=%S,ret=%d",
+            &aFullPath, ENotSystemPath )
+
+        return ENotSystemPath;
+        }
+
+    // Thumbnail path needs different handling because
+    // it is used differently compared to other paths
+    if ( ThumbnailPath( aFullPath ) )
+        {
+        INFO_LOG2( "PathInfo::PathType-aFullPath=%S,ret=%d",
+            &aFullPath, EImagesThumbnailPath )
+
+        return EImagesThumbnailPath;
+        }
+
+    TInt drive( 0 );
+    if ( RFs::CharToDrive( aFullPath[ 0 ], drive ) != KErrNone )
+        {
+        INFO_LOG2( "PathInfo::PathType-aFullPath=%S,ret=%d",
+            &aFullPath, ENotSystemPath )
+
+        return ENotSystemPath;
+        }
+
+    // Get the path count from the property array
+    TInt count( ARRAY_LEN( KPathProperties ) );
+
+    TFileName path;
+    for( TInt i( 0 ); i < count; ++i )
+        {
+        if ( GetFullPath( path, drive, i ) == KErrNone )
+            {
+            if( !aFullPath.CompareF( path ) )
+                {
+                INFO_LOG2( "PathInfo::PathType-aFullPath=%S,ret=%d",
+                    &aFullPath, i )
+
+                return i;
+                }
+            }
+        }
+
+    INFO_LOG2( "PathInfo::PathType-aFullPath=%S,ret=%d",
+        &aFullPath, ENotSystemPath )
+
+    return ENotSystemPath;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::GetListOfPathsLC
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CDesCArray* PathInfo::GetListOfPathsLC( TInt aDrive )
+    {
+    CDesCArray* ret = NULL;
+    FUNC_LOG_WITH_CLIENT_NAME_LC( ret )
+
+    ret = GetListOfPathsL( aDrive );
+    CleanupStack::PushL( ret );
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// PathInfo::GetListOfPathsL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CDesCArray* PathInfo::GetListOfPathsL( TInt aDrive )
+    {
+    FUNC_LOG_WITH_CLIENT_NAME
+
+    // Get the path count from the property array
+    TInt count( ARRAY_LEN( KPathProperties ) );
+    CDesCArray* ret = new( ELeave ) CDesCArrayFlat( count );
+    CleanupStack::PushL( ret );
+    TFileName path;
+    for ( TInt i( 0 ); i < count; ++i )
+        {
+        if ( GetFullPath( path, aDrive, i ) == KErrNone )
+            {
+            ret->AppendL( path );
+            }
+        }
+    CleanupStack::Pop( ret );
+    return ret;
+    }
+
+//  End of File