diff -r ada7962b4308 -r b7bfdea70ca2 filemanager/src/inc/fmutils_s60.cpp --- a/filemanager/src/inc/fmutils_s60.cpp Mon May 03 12:24:39 2010 +0300 +++ b/filemanager/src/inc/fmutils_s60.cpp Fri Jun 25 17:08:34 2010 +0800 @@ -37,19 +37,23 @@ #include #include +#include + #include #include -#include +#include #define BURCONFIGFILE "z:/private/2002BCC0/burconfig.xml" QString FmUtils::getDriveNameFromPath( const QString &path ) { - if( path.length() <3 ) { + // fillPathWithSplash make sure path length will be at least 3 if it is not empty. + QString checkedPath( fillPathWithSplash( path ) ); + if( checkedPath.length() < 3 ) { return QString(); } - return path.left( 3 ); + return checkedPath.left( 3 ); } QString FmUtils::getDriveLetterFromPath( const QString &path ) @@ -62,6 +66,9 @@ FmDriverInfo FmUtils::queryDriverInfo( const QString &driverName ) { + if( driverName.isEmpty() ) { + return FmDriverInfo( 0, 0, driverName, QString(), FmDriverInfo::EDriveNotPresent ); + } CCoeEnv *env = CCoeEnv::Static(); RFs& fs = env->FsSession(); @@ -70,17 +77,29 @@ drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA; quint32 state( 0 ); - int err = fs.Volume( volumeInfo, drive ); + 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() ); - - if( err == KErrNone ) { - TDriveInfo driveInfo = volumeInfo.iDrive; + + TDriveInfo driveInfo; + if( volumeInfoErr == KErrNone ) { + driveInfo = volumeInfo.iDrive; + } else { + driveInfoErr = fs.Drive( driveInfo, drive ); + if( driveInfoErr != KErrNone ) { + errorCode = driveInfoErr; + } + } + + if( volumeName == KErrNone || driveInfoErr == KErrNone ) { + //TDriveInfo driveInfo = volumeInfo.iDrive; quint32 drvStatus( 0 ); - err = DriveInfo::GetDriveStatus( fs, drive, drvStatus ); + int err = DriveInfo::GetDriveStatus( fs, drive, drvStatus ); if( err == KErrNone ) { - QString logString = driverName +':'+ QString::number( drvStatus); - FmLogger::log(logString); if ( ( drvStatus & DriveInfo::EDriveInternal ) && ( drvStatus & DriveInfo::EDriveExternallyMountable ) ){ @@ -89,7 +108,11 @@ state |= FmDriverInfo::EDriveMassStorage | FmDriverInfo::EDriveRemovable; } - + if ( drvStatus & DriveInfo::EDriveUsbMemory ) + { + state |= FmDriverInfo::EDriveUsbMemory; + } + if ( drvStatus & DriveInfo::EDriveRom ){ state |= FmDriverInfo::EDriveRom; } @@ -123,12 +146,36 @@ 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 - switch( 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: - state |= FmDriverInfo::EDriveAvailable; + // this drive could be used as it is not be locked, or corrupt. + state |= FmDriverInfo::EDriveAvailable; break; case KErrLocked: state |= FmDriverInfo::EDriveLocked; @@ -136,10 +183,19 @@ case KErrCorrupt: state |= FmDriverInfo::EDriveCorrupted; break; + case KErrInUse: + state |= FmDriverInfo::EDriveInUse; + break; default: // other errors state |= FmDriverInfo::EDriveNotPresent; break; } + QString logString ( "FmUtils::queryDriverInfo_" + driverName + + "_volumeInfoErr:" + QString::number( volumeInfoErr ) + + "_driveInfoErr:" + QString::number( driveInfoErr ) + + "_errorCode:" + QString::number( errorCode ) + + "_driveSatus:" + QString::number( state ) ); + FmLogger::log( logString ); return FmDriverInfo( volumeInfo.iSize, volumeInfo.iFree, driverName, volumeName, state ); } @@ -155,84 +211,12 @@ return QString::number( size / ( 1024.0 * 1024.0 * 1024.0 ), 'f', 1 ) + " GB"; } } -/* -quint32 FmUtils::getDriverState( const QString &driverName ) -{ - CCoeEnv *env = CCoeEnv::Static(); - RFs& fs = env->FsSession(); - - TVolumeInfo volumeInfo; - TInt drive = 0; - drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA; - - quint32 state( 0 ); - int err = fs.Volume( volumeInfo, drive ); - QString volumeName( (QChar*)( volumeInfo.iName.Des().Ptr() ), volumeInfo.iName.Length() ); - - //handle error code - if( err != KErrNone ) { - state |= FmDriverInfo::EDriveNotPresent; - } - if ( err == KErrLocked ) { - state |= FmDriverInfo::EDriveLocked; - } - - TDriveInfo driveInfo = volumeInfo.iDrive; - - quint32 drvStatus( 0 ); - DriveInfo::GetDriveStatus( fs, drive, drvStatus ); - - QString logString = driverName +':'+ QString::number( drvStatus); - FmLogger::log(logString); - - if ( ( drvStatus & DriveInfo::EDriveInternal ) && - ( drvStatus & DriveInfo::EDriveExternallyMountable ) ){ - // Handle mass storage bits here - - state |= FmDriverInfo::EDriveMassStorage | FmDriverInfo::EDriveRemovable; - } - - - 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; - } - - return state; - -} -*/ int FmUtils::removeDrivePwd( const QString &driverName, const QString &Pwd ) { + if( driverName.isEmpty() ) { + return FmErrWrongParam; + } QString logString = "Drive name:" + driverName; FmLogger::log( logString ); logString = "Password:" + Pwd; @@ -271,6 +255,9 @@ int FmUtils::unlockDrive( const QString &driverName, const QString &Pwd ) { + if( driverName.isEmpty() ) { + return FmErrWrongParam; + } QString logString = "Drive name:" + driverName; FmLogger::log( logString ); logString = "Password:" + Pwd; @@ -313,6 +300,9 @@ int FmUtils::checkDrivePwd( const QString &driverName, const QString &pwd ) { + if( driverName.isEmpty() ) { + return FmErrWrongParam; + } QString logString = "checkDrivePwd Drive name:" + driverName; logString += " password:" + pwd; FmLogger::log( logString ); @@ -322,6 +312,9 @@ int FmUtils::setDrivePwd( const QString &driverName, const QString &oldPwd, const QString &newPwd) { + if( driverName.isEmpty() ) { + return FmErrWrongParam; + } QString logString = "setDrivePwd Drive name:" + driverName ; logString += " Old password:" + oldPwd; logString += " New password:" + newPwd; @@ -373,7 +366,10 @@ int FmUtils::renameDrive( const QString &driverName, const QString &newVolumeName) { - foreach( QChar ch, newVolumeName ) + if( driverName.isEmpty() ) { + return FmErrWrongParam; + } + foreach( const QChar &ch, newVolumeName ) { bool a = ch.isSpace(); bool b = ch.isLetterOrNumber(); @@ -408,8 +404,11 @@ } } -void FmUtils::ejectDrive( const QString &driverName ) +int FmUtils::ejectDrive( const QString &driverName ) { + if( driverName.isEmpty() ) { + return FmErrWrongParam; + } QString logString = "FmUtils::ejectDrive start"; FmLogger::log( logString ); @@ -424,6 +423,7 @@ KCoreAppUIsMmcRemovedWithoutEject, ECoreAppUIsEjectCommandUsedToDrive | ( drive << KDriveShift ) ); + return FmErrNone; } QString FmUtils::getFileType( const QString &filePath ) @@ -506,6 +506,9 @@ bool FmUtils::isDriveC( const QString &driverName ) { + if( driverName.isEmpty() ) { + return false; + } TInt drive = 0; drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA; if( drive == EDriveC ){ @@ -529,6 +532,9 @@ void FmUtils::createDefaultFolders( const QString &driverName ) { + if( driverName.isEmpty() ) { + return; + } int err; TInt drive = 0; @@ -597,14 +603,23 @@ QString FmUtils::fillPathWithSplash( const QString &filePath ) { - QString newFilePath( filePath ); + QString newFilePath; if( filePath.isEmpty() ) { return newFilePath; } - if( filePath.at( filePath.length()-1 ) != QChar( '/' ) ){ - newFilePath.append( QChar( '/' ) ); + foreach( QChar ch, filePath ) { + if( ch == QChar('\\') || ch == QChar('/') ) { + newFilePath.append( QDir::separator() ); + } else { + newFilePath.append( ch ); + } } + + if( newFilePath.right( 1 )!= QDir::separator() ){ + newFilePath.append( QDir::separator() ); + } + return newFilePath; } @@ -617,10 +632,15 @@ return newFilePath; } -// used to filter drive which need be hide. -bool FmUtils::checkDriveFilter( const QString &driveName ) +// filter un-accessable drive +bool FmUtils::checkDriveAccessFilter( const QString &driveName ) { - if( driveName.contains( "D:" ) || driveName.contains( "Z:" ) ) { + if( driveName.isEmpty() ) { + return false; + } + FmDriverInfo driveInfo = queryDriverInfo( driveName ); + if( ( driveInfo.driveState()& FmDriverInfo::EDriveRam ) || + ( driveInfo.driveState()& FmDriverInfo::EDriveRom ) ) { return false; } return true; @@ -635,8 +655,8 @@ } */ QString checkedPath = fillPathWithSplash( path ); - if( checkedPath.compare( QString( "C:/"), Qt::CaseInsensitive ) == 0 ) { - checkedPath += QString( "data/" ); + if( checkedPath.compare( Drive_C, Qt::CaseInsensitive ) == 0 ) { + checkedPath += QString( "data" ) + QDir::separator(); return checkedPath; } return path; @@ -653,47 +673,50 @@ logString = QString( "checkFolderToDriveFilter_fillPathWithSplash: " ) + checkedPath; FmLogger::log( logString ); - if( checkedPath.compare( QString( "C:/data/"), Qt::CaseInsensitive ) == 0 ) { + if( checkedPath.compare( Folder_C_Data, Qt::CaseInsensitive ) == 0 ) { FmLogger::log( QString( " change from c:/data/ to C:/" ) ); - return QString( "C:/" ); + return Drive_C; } return path; } -bool FmUtils::isPathAccessabel( const QString &path ) +int FmUtils::isPathAccessabel( const QString &path ) { + // Used to check if path is accessable, very important feature + // and will return filemanager error. FmLogger::log( QString( "isPathAccessabel:" ) + path ); + if( path.isEmpty() ) { + return FmErrPathNotExist; + } if( path.length() <= 3 && !isDriveAvailable( path ) ) { //used to filter locked drive FmLogger::log( QString( "isPathAccessabel false: path is drive and not available" ) ); - return false; + return FmErrDriveNotAvailable; } QFileInfo fileInfo( path ); - if( fileInfo.absoluteFilePath().contains( QString( Drive_C ), Qt::CaseInsensitive ) && - !fileInfo.absoluteFilePath().contains( QString( Folder_C_Data ), Qt::CaseInsensitive ) ) { + if( fileInfo.absoluteFilePath().contains( Drive_C, Qt::CaseInsensitive ) && + !fileInfo.absoluteFilePath().contains( Folder_C_Data, Qt::CaseInsensitive ) ) { FmLogger::log( QString( "isPathAccessabel false: path contain C and not in data folder" ) ); - return false; + return FmErrPathDenied; } - if( fileInfo.absoluteFilePath().contains( QString( Drive_D ), Qt::CaseInsensitive ) ) { - FmLogger::log( QString( "isPathAccessabel false: path contain D" ) ); - return false; - } - if( fileInfo.absoluteFilePath().contains( QString( Drive_Z ), Qt::CaseInsensitive ) ) { - FmLogger::log( QString( "isPathAccessabel false: path contain Z" ) ); - return false; + if( !checkDriveAccessFilter( FmUtils::getDriveNameFromPath( fileInfo.absoluteFilePath() ) ) ){ + return FmErrDriveDenied; } if( !fileInfo.exists() ) { FmLogger::log( QString( "isPathAccessabel false: path not exist" ) ); - return false; + return FmErrPathNotExist; } - FmLogger::log( QString( "isPathAccessabel true" ) ); - return true; + FmLogger::log( QString( "isPathAccessabel FmErrNone" ) ); + return FmErrNone; } // only used to check drive, when MMC is not inserted, also return false bool FmUtils::isDriveAvailable( const QString &path ) { FmLogger::log( QString( "isDriveAvailable:" ) + path ); + if( path.isEmpty() ) { + return false; + } FmDriverInfo::DriveState driveState = queryDriverInfo( path ).driveState(); if( ( driveState & FmDriverInfo::EDriveAvailable ) ) { FmLogger::log( QString( "isDriveAvailable true" ) ); @@ -714,7 +737,7 @@ foreach( QFileInfo fileInfo, infoList ) { QString driveName = fileInfo.absolutePath(); - if( checkDriveFilter( driveName ) ) { + if( checkDriveAccessFilter( driveName ) ) { if( !isHideUnAvailableDrive ) { driveList.append( driveName ); } @@ -729,9 +752,12 @@ QString FmUtils::fillDriveVolume( QString driveName, bool isFillWithDefaultVolume ) { QString ret; + if( driveName.isEmpty() ) { + return ret; + } QString tempDriveName = fillPathWithSplash( driveName ); - ret = removePathSplash( driveName ); + QString checkedDriveName( removePathSplash( driveName ) ); FmDriverInfo driverInfo = FmUtils::queryDriverInfo( tempDriveName ); QString volumeName = driverInfo.volumeName(); @@ -741,25 +767,37 @@ if( driveState & FmDriverInfo::EDriveAvailable ){ if( driveState & FmDriverInfo::EDriveRemovable ) { if( driveState & FmDriverInfo::EDriveMassStorage ) { - volumeName.append( QObject::tr( "Mass Storage" ) ); + // Mass Storage + ret = hbTrId( "txt_fmgr_dblist_1_mass_storage" ).arg( checkedDriveName ); + } else if( driveState & FmDriverInfo::EDriveUsbMemory ) { + // USB Memory + ret = hbTrId( "txt_fmgr_dblist_1_usb_memory" ).arg( checkedDriveName ); + } else{ + // Memory Card + ret = hbTrId( "txt_fmgr_dblist_1_memory_card" ).arg( checkedDriveName ); } - else{ - volumeName.append( QObject::tr( "Memory Card" ) ); - } + } else{ + // phone memory + ret = hbTrId( "txt_fmgr_dblist_1_device_memory" ).arg( checkedDriveName ); } - else{ - volumeName.append( QObject::tr( "Phone Memory" ) ); - } - } + } } - - ret += QString( " " ) + volumeName; + + if( ret.isEmpty() ) { + // set ret as volumeName + // txt_fmgr_dblist_1_2 is not correct, can not use. + ret = hbTrId( "%1 %2" ).arg( checkedDriveName ).arg( volumeName ); + } return ret; } -int FmUtils::launchFile( const QString &filePath ) +int FmUtils::launchFile( const QString &filePath ) { QFile file( filePath ); + if( !file.exists() ) { + return false; + } + XQApplicationManager mAiwMgr; XQAiwRequest *request = mAiwMgr.create(file); if ( request == 0 ) { @@ -852,12 +890,68 @@ QString FmUtils::formatPath( const QString &path ) { - QString formatPath = path; - QRegExp regExp( "/" ); - formatPath.replace( regExp, "\\" ); - - if( path.right( 1 )!= "\\"){ - formatPath.append( "\\" ); + QString formatPath; + foreach( QChar ch, path ) { + if( ch == QChar('\\') || ch == QChar('/') ) { + formatPath.append( QDir::separator() ); + } else { + formatPath.append( ch ); + } + } + + if( formatPath.right( 1 ) != QDir::separator() ){ + formatPath.append( QDir::separator() ); } return formatPath; } + +int FmUtils::getMaxFileNameLength() +{ + return KMaxFileName; +} + +bool FmUtils::checkMaxPathLength( const QString& path ) +{ + if( path.length() > KMaxPath ) { + return false; + } + return true; +} +bool FmUtils::checkFolderFileName( const QString& name ) +{ + if( name.endsWith( QChar('.'), Qt::CaseInsensitive ) ) { + return false; + } + if( name.contains( QChar('\\'), Qt::CaseInsensitive ) || + name.contains( QChar('/'), Qt::CaseInsensitive ) || + name.contains( QChar(':'), Qt::CaseInsensitive ) || + name.contains( QChar('*'), Qt::CaseInsensitive ) || + name.contains( QChar('?'), Qt::CaseInsensitive ) || + name.contains( QChar('\"'), Qt::CaseInsensitive ) || + name.contains( QChar('<'), Qt::CaseInsensitive ) || + name.contains( QChar('>'), Qt::CaseInsensitive ) || + name.contains( QChar('|'), Qt::CaseInsensitive ) ){ + return false; + } + if( name.length() > KMaxFileName ) { + return false; + } + return true; +} + +bool FmUtils::checkNewFolderOrFile( const QString &path, QString &errString ) +{ + QFileInfo fileInfo( path ); + bool ret( true ); + if (!FmUtils::checkFolderFileName( fileInfo.fileName() ) ) { + errString = hbTrId( "Invalid file or folder name!" ); + ret = false; + } else if( !FmUtils::checkMaxPathLength( path ) ) { + errString = hbTrId( "the path you specified is too long!" ); + ret = false; + } else if (fileInfo.exists()) { + errString = hbTrId( "%1 already exist!" ).arg( fileInfo.fileName() ); + ret = false; + } + return ret; +}