diff -r 95243422089a -r 491b3ed49290 filemanager/src/inc/fmutils_s60.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filemanager/src/inc/fmutils_s60.cpp Tue Aug 31 15:06:05 2010 +0300 @@ -0,0 +1,859 @@ +/* +* Copyright (c) 2009 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: +* Zhiqiang Yang +* +* Description: +* The source file of the file manager utilities on Symbian +*/ + + +#include "fmutils.h" +#include "fmcommon.h" +#include "fms60utils.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#define BURCONFIGFILE "z:/private/2002BCC0/burconfig.xml" + +/*! + query drive info and status for \a driveName + return \a FmDriverInfo +*/ +FmDriverInfo FmUtils::queryDriverInfo( const QString &driveName ) +{ + if( driveName.isEmpty() ) { + return FmDriverInfo( 0, 0, driveName, QString(), FmDriverInfo::EDriveNotPresent ); + } + CCoeEnv *env = CCoeEnv::Static(); + RFs& fs = env->FsSession(); + + TVolumeInfo volumeInfo; + TInt drive = 0; + drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA; + + quint32 state( 0 ); + + int volumeInfoErr( KErrNone ); + int driveInfoErr( KErrNone ); + int errorCode( KErrNone ); + volumeInfoErr = fs.Volume( volumeInfo, drive ); + errorCode = volumeInfoErr; + QString volumeName( (QChar*)( volumeInfo.iName.Des().Ptr() ), volumeInfo.iName.Length() ); + + TDriveInfo driveInfo; + if( volumeInfoErr == KErrNone ) { + driveInfo = volumeInfo.iDrive; + } else { + driveInfoErr = fs.Drive( driveInfo, drive ); + if( driveInfoErr != KErrNone ) { + errorCode = driveInfoErr; + } + } + + if( volumeInfoErr == KErrNone || driveInfoErr == KErrNone ) { + //TDriveInfo driveInfo = volumeInfo.iDrive; + + quint32 drvStatus( 0 ); + int err = DriveInfo::GetDriveStatus( fs, drive, drvStatus ); + if( err == KErrNone ) { + + if ( ( drvStatus & DriveInfo::EDriveInternal ) && + ( drvStatus & DriveInfo::EDriveExternallyMountable ) ){ + // Handle mass storage bits here + state |= FmDriverInfo::EDriveMassStorage | FmDriverInfo::EDriveRemovable; + } + + if ( drvStatus & DriveInfo::EDriveUsbMemory ) + { + state |= FmDriverInfo::EDriveUsbMemory; + } + + if ( drvStatus & DriveInfo::EDriveRemote ) + { + state |= FmDriverInfo::EDriveRemote; + } + + if ( drvStatus & DriveInfo::EDriveRom ){ + state |= FmDriverInfo::EDriveRom; + } + + if ( drvStatus & DriveInfo::EDriveRam ){ + state |= FmDriverInfo::EDriveRam; + } + + if ( driveInfo.iMediaAtt & KMediaAttFormattable ){ + state |= FmDriverInfo::EDriveFormattable; + } + if ( driveInfo.iMediaAtt & KMediaAttWriteProtected ){ + state |= FmDriverInfo::EDriveWriteProtected; + } + if ( driveInfo.iMediaAtt & KMediaAttHasPassword ){ + state |= FmDriverInfo::EDrivePasswordProtected; + } + if ( driveInfo.iMediaAtt & KMediaAttLocked ){ + state |= FmDriverInfo::EDriveLocked; + } + + if ( driveInfo.iDriveAtt & KDriveAttRemovable ){ + state |= FmDriverInfo::EDriveRemovable; + + if ( drvStatus & DriveInfo::EDriveSwEjectable ){ + state |= FmDriverInfo::EDriveEjectable; + } + } + + if( driveInfo.iType == EMediaNotPresent ){ + state |= FmDriverInfo::EDriveNotPresent; + } + } + // If memory card is not ready but type is present, + // then check if it is reserved. + if( err == KErrNone && volumeInfoErr == KErrNotReady && + driveInfo.iType != EMediaNotPresent ) + { + // Check USB file transfer state + TInt prop( ECoreAppUIsUSBFileTransferUninitialized ); + RProperty::Get( + KPSUidCoreApplicationUIs, + KCoreAppUIsUSBFileTransfer, prop ); + if ( prop == ECoreAppUIsUSBFileTransferActive ) + { + errorCode = KErrInUse; // Reserved for file transfer + } + } + if( err!= KErrNone ) + { + errorCode = err; + } + } + + // handle error code + // volumeInfoErr will occur while drive is lock,corrupted... + // driveInfoErr can not be promoted for locked, corrupted drive. + // so we can not use driveInfoErr to justify EDriveAvailable + switch( errorCode ) + { + case KErrNone: + // this drive could be used as it is not be locked, or corrupt. + state |= FmDriverInfo::EDriveAvailable; + break; + case KErrLocked: + state |= FmDriverInfo::EDriveLocked; + break; + case KErrCorrupt: + state |= FmDriverInfo::EDriveCorrupted; + break; + case KErrInUse: + state |= FmDriverInfo::EDriveInUse; + break; + default: // other errors + state |= FmDriverInfo::EDriveNotPresent; + break; + } + QString logString ( "FmUtils::queryDriverInfo_" + driveName + + "_volumeInfoErr:" + QString::number( volumeInfoErr ) + + "_driveInfoErr:" + QString::number( driveInfoErr ) + + "_errorCode:" + QString::number( errorCode ) + + "_driveSatus:" + QString::number( state ) ); + FM_LOG( logString ); + return FmDriverInfo( volumeInfo.iSize, volumeInfo.iFree, driveName, volumeName, state ); +} + +/*! + remove drive password for \a driveName + \a Pwd is original password. +*/ +int FmUtils::removeDrivePwd( const QString &driveName, const QString &Pwd ) +{ + if( driveName.isEmpty() || Pwd.length() > FmMaxLengthofDrivePassword ) { + return FmErrWrongParam; + } + QString logString = "Drive name:" + driveName; + FM_LOG( logString ); + logString = "Password:" + Pwd; + FM_LOG( logString ); + + CCoeEnv *env = CCoeEnv::Static(); + RFs& fs = env->FsSession(); + + TInt drive = 0; + + drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA; + + HBufC* password16 = XQConversions::qStringToS60Desc( Pwd ); + TMediaPassword password; + TPtr ptrPassword16( password16->Des() ); + FmS60Utils::ConvertCharsToPwd( ptrPassword16, password ); + + int err( fs.ClearPassword( drive, password ) ); + + logString = "Drive:" + QString::number( drive ); + FM_LOG( logString ); + + logString = "Clear password error:" + QString::number( err ); + FM_LOG( logString ); + + delete password16; + + if( err == KErrNone ){ + return FmErrNone; + } + else if( err == KErrAccessDenied ){ + return FmErrAccessDenied; + } + else{ + return FmErrUnKnown; + } +} + +/*! + Unlock drive \a driveName with provided password \a Pwd +*/ +int FmUtils::unlockDrive( const QString &driveName, const QString &Pwd ) +{ + if( driveName.isEmpty() || Pwd.length() > FmMaxLengthofDrivePassword ) { + return FmErrWrongParam; + } + QString logString = "Drive name:" + driveName; + FM_LOG( logString ); + logString = "Password:" + Pwd; + FM_LOG( logString ); + + CCoeEnv *env = CCoeEnv::Static(); + RFs& fs = env->FsSession(); + + TInt drive = 0; + drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA; + + HBufC* password16 = XQConversions::qStringToS60Desc( Pwd ); + TMediaPassword password; + TPtr ptrPassword16( password16->Des() ); + FmS60Utils::ConvertCharsToPwd( ptrPassword16, password ); + + int err( fs.UnlockDrive( drive, password, ETrue) ); + + logString = "Drive:" + QString::number( drive ); + FM_LOG( logString ); + logString = "Unlock drive error:" + QString::number( err ); + FM_LOG( logString ); + + delete password16; + + if( err == KErrNone ){ + return FmErrNone; + } + else if( err == KErrAccessDenied ){ + return FmErrAccessDenied; + } + else if( err == KErrAlreadyExists ){ + return FmErrAlreadyExists; + } + else if( err == KErrNotSupported ){ + return FmErrNotSupported; + } + else{ + return FmErrUnKnown; + } +} + +/*! + Check if \a pwd is the right password for drive \a driveName +*/ +int FmUtils::checkDrivePwd( const QString &driveName, const QString &pwd ) +{ + if( driveName.isEmpty() || pwd.length() > FmMaxLengthofDrivePassword ) { + return FmErrWrongParam; + } + QString logString = "checkDrivePwd Drive name:" + driveName; + logString += " password:" + pwd; + FM_LOG( logString ); + + return setDrivePwd( driveName, pwd, pwd ); +} + +/*! + Set new password \a newPwd for drive \a driveName. \a oldPwd is old password +*/ +int FmUtils::setDrivePwd( const QString &driveName, const QString &oldPwd, const QString &newPwd) +{ + if( driveName.isEmpty() || + oldPwd.length() > FmMaxLengthofDrivePassword || newPwd.length() > FmMaxLengthofDrivePassword ) { + return FmErrWrongParam; + } + QString logString = "setDrivePwd Drive name:" + driveName ; + logString += " Old password:" + oldPwd; + logString += " New password:" + newPwd; + FM_LOG( logString ); + + CCoeEnv *env = CCoeEnv::Static(); + RFs& fs = env->FsSession(); + + TInt drive = 0; + drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA; + + HBufC* newPassword16 = XQConversions::qStringToS60Desc( newPwd); + HBufC* oldPassword16 = XQConversions::qStringToS60Desc( oldPwd ); + + TMediaPassword oldPassword; + TMediaPassword newPassword; + + TPtr ptrNewPassword16( newPassword16->Des() ); + TPtr ptrOldPassword16( oldPassword16->Des() ); + + FmS60Utils::ConvertCharsToPwd( ptrNewPassword16, newPassword ); + FmS60Utils::ConvertCharsToPwd( ptrOldPassword16, oldPassword ); + + int err( fs.LockDrive( drive, oldPassword, newPassword, ETrue ) ); + + logString = "Drive:" + QString::number( drive ); + FM_LOG( logString ); + logString = "Password set error:" + QString::number( err ); + FM_LOG( logString ); + + delete newPassword16; + delete oldPassword16; + if( err == KErrNone ){ + return FmErrNone; + } + else if( err == KErrNotSupported ){ + return FmErrNotSupported; + } + else{ + return FmErrUnKnown; + } +} + +/*! + Set \a pwd as empty password +*/ +void FmUtils::emptyPwd( QString &pwd ) +{ + TBuf< FmMaxLengthofDrivePassword > nullPwd; + nullPwd.FillZ( nullPwd.MaxLength() ); + nullPwd.Zero(); + pwd = XQConversions::s60DescToQString( nullPwd ); +} + +/*! + Set drive volume for drive \a driveName +*/ +int FmUtils::renameDrive( const QString &driveName, const QString &newVolumeName) +{ + if( driveName.isEmpty() ) { + return FmErrWrongParam; + } + foreach( const QChar &ch, newVolumeName ) + { + bool a = ch.isSpace(); + bool b = ch.isLetterOrNumber(); + // If not alphadigit or space, return error + if( !ch.isLetterOrNumber() && !ch.isSpace() ) + { + return FmErrBadName; + } + } + + CCoeEnv *env = CCoeEnv::Static(); + RFs& fs = env->FsSession(); + + TInt drive = 0; + drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA; + + TPtr newName ( ( XQConversions::qStringToS60Desc( newVolumeName ) )->Des() ); + + int err( fs.SetVolumeLabel( newName, drive )); + + QString logString = "Rename error:" + QString::number( err ); + FM_LOG( logString ); + + if( err == KErrNone ){ + return FmErrNone; + } + else if( err == KErrNotReady ){ + return FmErrNotReady; + } + else{ + return FmErrUnKnown; + } +} + +/*! + Eject drive \a driveName +*/ +int FmUtils::ejectDrive( const QString &driveName ) +{ + if( driveName.isEmpty() ) { + return FmErrWrongParam; + } + QString logString = "FmUtils::ejectDrive start"; + FM_LOG( logString ); + + TInt drive = 0; + drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA; + + const int KDriveShift = 16; + + // Let SysAp handle eject + RProperty::Set( + KPSUidCoreApplicationUIs, + KCoreAppUIsMmcRemovedWithoutEject, + ECoreAppUIsEjectCommandUsedToDrive | ( drive << KDriveShift ) + ); + return FmErrNone; +} + +/*! + Check if drive \a driveName is accessable for user +*/ +bool FmUtils::checkDriveAccessFilter( const QString &driveName ) +{ + if( driveName.isEmpty() ) { + return false; + } + FmDriverInfo driveInfo = queryDriverInfo( driveName ); + if( ( driveInfo.driveState()& FmDriverInfo::EDriveRam ) || + ( driveInfo.driveState()& FmDriverInfo::EDriveRom ) ) { + return false; + } + return true; +} + +/*! + This function should be called to adjust path if user goto a drive. + data folder will be append to C:\ becuase user could only view C:\data instead C:\ +*/ +QString FmUtils::checkDriveToFolderFilter( const QString &path ) +{ + QString checkedPath = fillPathWithSplash( path ); + if( checkedPath.compare( Drive_C, Qt::CaseInsensitive ) == 0 ) { + checkedPath += QString( "data" ) + QDir::separator(); + return checkedPath; + } + return path; + +} + +/*! + This function should be called to adjust path if user back to up level path. + If user is at C:\data then path level should be returned as C:\ + Becuase C:\data is root path for C drive +*/ +QString FmUtils::checkFolderToDriveFilter( const QString &path ) +{ + QString logString; + logString = QString( "checkFolderToDriveFilter: " ) + path; + FM_LOG( logString ); + QString checkedPath = fillPathWithSplash( path ); + + logString = QString( "checkFolderToDriveFilter_fillPathWithSplash: " ) + checkedPath; + FM_LOG( logString ); + + if( checkedPath.compare( Folder_C_Data, Qt::CaseInsensitive ) == 0 ) { + FM_LOG( QString( " change from c:/data/ to C:/" ) ); + return Drive_C; + } + return path; + +} + +/*! + Check if \a path is accessable for user +*/ +int FmUtils::isPathAccessabel( const QString &path ) +{ + // Used to check if path is accessable, very important feature + // and will return filemanager error. + FM_LOG( QString( "isPathAccessabel:" ) + path ); + if( path.isEmpty() ) { + return FmErrPathNotExist; + } + + // used to filter locked/ejected/corrupted drive + // check if drive is available, no matter if it is a drive, a folder, or a file. + if( !isDriveAvailable( path ) ) { + FM_LOG( QString( "isPathAccessabel false: path is drive and not available" ) ); + return FmErrDriveNotAvailable; + } + + QFileInfo fileInfo( path ); + + if( fileInfo.absoluteFilePath().contains( Drive_C, Qt::CaseInsensitive ) && + !fileInfo.absoluteFilePath().contains( Folder_C_Data, Qt::CaseInsensitive ) ) { + FM_LOG( QString( "isPathAccessabel false: path contain C and not in data folder" ) ); + return FmErrPathDenied; + } + if( !checkDriveAccessFilter( FmUtils::getDriveNameFromPath( fileInfo.absoluteFilePath() ) ) ){ + return FmErrDriveDenied; + } + if( !fileInfo.exists() ) { + FM_LOG( QString( "isPathAccessabel false: path not exist" ) ); + return FmErrPathNotExist; + } + FM_LOG( QString( "isPathAccessabel FmErrNone" ) ); + return FmErrNone; +} + +/*! + Check if drive related to \a path is available. + This function should not check if path is available. Only responsible for checking drive + When MMC is not inserted, also return false +*/ +bool FmUtils::isDriveAvailable( const QString &path ) +{ + FM_LOG( QString( "isDriveAvailable:" ) + path ); + if( path.isEmpty() ) { + return false; + } + FmDriverInfo::DriveState driveState = queryDriverInfo( path ).driveState(); + if( ( driveState & FmDriverInfo::EDriveAvailable ) ) { + FM_LOG( QString( "isDriveAvailable true" ) ); + return true; + } + FM_LOG( QString( "isDriveAvailable false" ) ); + return false; +} + +/*! + Check if \a folderPath is default folder for system +*/ +bool FmUtils::isDefaultFolder( const QString &folderPath ) +{ + HBufC *path = XQConversions::qStringToS60Desc( folderPath ); + TPtrC desFolderPath( path->Des() ); + + bool ret( true ); + TInt pathType( PathInfo::PathType( desFolderPath ) ); + switch( pathType ){ + case PathInfo::ENotSystemPath:{ + QString locString( localize( folderPath ) ); + if ( locString.isEmpty() ){ + ret = false; + break; + } + ret = true; + break; + } + case PathInfo::EPhoneMemoryRootPath: // FALL THROUGH + case PathInfo::EMemoryCardRootPath: // FALL THROUGH + case PathInfo::ERomRootPath:{ + ret = false; + break; + } + // Accept other folders + default:{ + ret = true; + break; + } + } + delete path; + return ret; +} + +/*! + Create system default folders for drive \a driveName. + Default folders should be created after format a drive. +*/ +void FmUtils::createDefaultFolders( const QString &driveName ) +{ + if( driveName.isEmpty() ) { + return; + } + int err; + + TInt drive = 0; + drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA; + + RFs fs; + err = fs.Connect(); + + if( err != KErrNone ){ + return; + } + + quint32 drvStatus( 0 ); + err = DriveInfo::GetDriveStatus( fs, drive, drvStatus ); + if ( !( drvStatus & DriveInfo::EDriveUserVisible ) || + ( drvStatus & ( DriveInfo::EDriveRemote | + DriveInfo::EDriveReadOnly | + DriveInfo::EDriveUsbMemory ) ) ){ + return; + } + + TEntry entry; + CDesCArray* array = PathInfo::GetListOfPathsLC( drive ); + + TInt count( array->MdcaCount() ); + for ( TInt i( 0 ); i < count; ++i ) + { + TPtrC fullPath( array->MdcaPoint( i ) ); + TBool allow( ETrue ); + + if ( drvStatus & DriveInfo::EDriveRemovable ) + { + // Filter few folder types from physically removable memory cards + TInt pathType( PathInfo::PathType( fullPath ) ); + switch( pathType ) + { + case PathInfo::EGamesPath: // FALL THROUGH + case PathInfo::EInstallsPath: // FALL THROUGH + case PathInfo::EGsmPicturesPath: // FALL THROUGH + case PathInfo::EMmsBackgroundImagesPath: // FALL THROUGH + case PathInfo::EPresenceLogosPath: + { + allow = EFalse; + } + default: + { + break; + } + } + } + + if ( allow ){ + fs.MkDirAll( fullPath ); // Ignore error + + if ( fs.Entry( fullPath, entry ) == KErrNone ){ + if( entry.IsHidden() ){ + // If setting fails, File Manager can still go on + fs.SetEntry( + fullPath, entry.iModified, 0, KEntryAttHidden ); + } + } + } + } + CleanupStack::PopAndDestroy( array ); +} + +/*! + In Symbian system, default folders will be localized. + So localize is used to check if a path is a default folder + \sa isDefaultFolder +*/ +QString FmUtils::localize( const QString &path ) +{ + // HbDirectoryNameLocalizer can not recognize path with \ in the end + QString locPath( removePathSplash( path ) ); + + HbDirectoryNameLocalizer localizer; + return localizer.translate( locPath ); +} + +/*! + set the \a desFile attributes as the same with \a srcFile +*/ +int FmUtils::setFileAttributes( const QString &srcFile, const QString &desFile ) +{ + RFs fsSession; + User::LeaveIfError( fsSession.Connect() ); + CleanupClosePushL( fsSession ); + RFile64 src; + RFile64 des; + HBufC *buf1 = XQConversions::qStringToS60Desc( removePathSplash( formatPath( srcFile ) ) ); + HBufC *buf2 = XQConversions::qStringToS60Desc( removePathSplash( formatPath( desFile ) ) ); + User::LeaveIfError( src.Open( fsSession, *buf1, EFileRead | EFileShareReadersOnly ) ); + User::LeaveIfError( des.Open( fsSession, *buf2, EFileWrite | EFileShareExclusive ) ); + TTime mod; + int err = src.Modified( mod );; + if ( err == FmErrNone ) { + err = des.SetModified( mod ); + } + TUint att( 0 ); + if ( err == FmErrNone ) { + err = src.Att( att ); + } + if ( err == FmErrNone ) { + des.SetAtt( att, ( ~att ) & KEntryAttMaskSupported ); + } + src.Close(); + des.Close(); + fsSession.Close(); + CleanupStack::PopAndDestroy(); // fsSession + return err; +} + +/*! + judge whether there is enough space on \a targetDrive for \a size. + return true if has, false if not. +*/ +bool FmUtils::hasEnoughSpace( const QString &targetDrive, qint64 size ) +{ + RFs fsSession; + QT_TRAP_THROWING( fsSession.Connect() ); + CleanupClosePushL( fsSession ); + TInt dstDrv(0); + HBufC* hbuf = XQConversions::qStringToS60Desc( targetDrive ); + QT_TRAP_THROWING( RFs::CharToDrive( hbuf->operator [](0), dstDrv ) ); + bool ret = !SysUtil::DiskSpaceBelowCriticalLevelL( &fsSession, size , dstDrv ); + CleanupStack::PopAndDestroy(); // fsSession + return ret; + +} + +/*! + move one file insice the same drive, from \a source to \a target. + return KErrNone if successful, otherwise one of the other system-wide error codes. +*/ +int FmUtils::moveInsideDrive( const QString &source, const QString &target ) +{ + RFs fsSession; + QT_TRAP_THROWING( fsSession.Connect() ); + CleanupClosePushL( fsSession ); + HBufC* oldName = XQConversions::qStringToS60Desc( source ); + HBufC* newName = XQConversions::qStringToS60Desc( target ); + int ret = fsSession.Rename( *oldName, *newName ); + CleanupStack::PopAndDestroy(); // fsSession + return ret; +} + +/*! + Launch a file with associated application. +*/ +int FmUtils::launchFile( const QString &filePath ) + +{ + QFile file( filePath ); + if( !file.exists() ) { + return false; + } + + XQApplicationManager mAiwMgr; + XQAiwRequest *request = mAiwMgr.create(file); + if ( request == 0 ) { + // No handlers for the URI + return FmErrUnKnown; + } + + // Set function parameters + QList args; + args << file.fileName(); + request->setArguments(args); + + // Send the request + bool res = request->send(); + if (!res) + { + // Request failed. + int error = request->lastError(); + + delete request; + return FmErrUnKnown; + } + + delete request; + return FmErrNone; +} + +/*! + Send files( \a filePathList ) with share ui. +*/ +void FmUtils::sendFiles( QStringList &filePathList ) +{ + ShareUi shareui; + shareui.send( filePathList, false ); +} + +/*! + return path for backup restore config file. + Currently \a appPath is not used. +*/ +QString FmUtils::getBurConfigPath( QString appPath ) +{ + Q_UNUSED( appPath ); + QString path( BURCONFIGFILE ); + return path; +} + +/*! + return MetaData string for \a filePath +*/ +QString FmUtils::getFileType( const QString &filePath ) +{ + RApaLsSession apaSession; + TDataType dataType; + TUid appUid; + + TBuf<128> mimeTypeBuf; + + int err = apaSession.Connect(); + + if ( err == KErrNone ){ + err = apaSession.AppForDocument( XQConversions::qStringToS60Desc( filePath )->Des(), + appUid, dataType ); + + if( err == KErrNone ){ + mimeTypeBuf.Copy(dataType.Des8()); + } + } + + apaSession.Close(); + return XQConversions::s60DescToQString( mimeTypeBuf ); +} + +/*! + Check if drive \a driveName is drive C +*/ +bool FmUtils::isDriveC( const QString &driveName ) +{ + if( driveName.isEmpty() ) { + return false; + } + TInt drive = 0; + drive = driveName[0].toUpper().toAscii() - 'A' + EDriveA; + if( drive == EDriveC ){ + return true; + } + else{ + return false; + } + +} + +/*! + return max file name length +*/ +int FmUtils::getMaxFileNameLength() +{ + return KMaxFileName; +} + +/*! + Check if length of \a path is exceed max path length. +*/ +bool FmUtils::checkMaxPathLength( const QString& path ) +{ + if( path.length() > KMaxPath ) { + return false; + } + return true; +}