diff -r 000000000000 -r 4e1aa6a622a0 commonservices/PlatformEnv/src/PathInfo.cpp --- /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 +#include +#include +#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