diff -r 1957042d8c7e -r ada7962b4308 filemanager/src/inc/fmutils_s60.cpp --- a/filemanager/src/inc/fmutils_s60.cpp Fri Apr 16 14:53:38 2010 +0300 +++ b/filemanager/src/inc/fmutils_s60.cpp Mon May 03 12:24:39 2010 +0300 @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -51,19 +52,95 @@ return path.left( 3 ); } +QString FmUtils::getDriveLetterFromPath( const QString &path ) +{ + if( path.length() <2 ) { + return QString(); + } + return path.left( 1 ); +} + FmDriverInfo FmUtils::queryDriverInfo( const QString &driverName ) { - CCoeEnv *env = CCoeEnv::Static(); - RFs& fs = env->FsSession(); + 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() ); - TVolumeInfo volumeInfo; - TInt drive = 0; - drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA; - - fs.Volume( volumeInfo, drive ); - QString volumeName( (QChar*)( volumeInfo.iName.Des().Ptr() ), volumeInfo.iName.Length() ); - - return FmDriverInfo( volumeInfo.iSize, volumeInfo.iFree, driverName, volumeName ); + if( err == KErrNone ) { + TDriveInfo driveInfo = volumeInfo.iDrive; + + quint32 drvStatus( 0 ); + 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 ) ){ + // 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; + } + } + } + //handle error code + switch( err ) + { + case KErrNone: + state |= FmDriverInfo::EDriveAvailable; + break; + case KErrLocked: + state |= FmDriverInfo::EDriveLocked; + break; + case KErrCorrupt: + state |= FmDriverInfo::EDriveCorrupted; + break; + default: // other errors + state |= FmDriverInfo::EDriveNotPresent; + break; + } + return FmDriverInfo( volumeInfo.iSize, volumeInfo.iFree, driverName, volumeName, state ); } QString FmUtils::formatStorageSize( quint64 size ) @@ -78,19 +155,21 @@ return QString::number( size / ( 1024.0 * 1024.0 * 1024.0 ), 'f', 1 ) + " GB"; } } +/* quint32 FmUtils::getDriverState( const QString &driverName ) { - quint32 state( 0 ); CCoeEnv *env = CCoeEnv::Static(); - RFs& fs = env->FsSession(); + RFs& fs = env->FsSession(); - TVolumeInfo volumeInfo; - TInt drive = 0; - drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA; + TVolumeInfo volumeInfo; + TInt drive = 0; + drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA; - int err = fs.Volume( volumeInfo, drive ); + quint32 state( 0 ); + int err = fs.Volume( volumeInfo, drive ); + QString volumeName( (QChar*)( volumeInfo.iName.Des().Ptr() ), volumeInfo.iName.Length() ); - //handle error code + //handle error code if( err != KErrNone ) { state |= FmDriverInfo::EDriveNotPresent; } @@ -150,6 +229,7 @@ return state; } +*/ int FmUtils::removeDrivePwd( const QString &driverName, const QString &Pwd ) { @@ -178,7 +258,15 @@ logString = "Clear password error:" + QString::number( err ); FmLogger::log( logString ); - return err; + if( err == KErrNone ){ + return FmErrNone; + } + else if( err == KErrAccessDenied ){ + return FmErrAccessDenied; + } + else{ + return FmErrUnKnown; + } } int FmUtils::unlockDrive( const QString &driverName, const QString &Pwd ) @@ -206,16 +294,37 @@ logString = "Unlock drive error:" + QString::number( err ); FmLogger::log( logString ); - return err; + 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; + } +} + +int FmUtils::checkDrivePwd( const QString &driverName, const QString &pwd ) +{ + QString logString = "checkDrivePwd Drive name:" + driverName; + logString += " password:" + pwd; + FmLogger::log( logString ); + + return setDrivePwd( driverName, pwd, pwd ); } int FmUtils::setDrivePwd( const QString &driverName, const QString &oldPwd, const QString &newPwd) { - QString logString = "Drive name:" + driverName; - FmLogger::log( logString ); - logString = "Old password:" + oldPwd; - FmLogger::log( logString ); - logString = "New password:" + newPwd; + QString logString = "setDrivePwd Drive name:" + driverName ; + logString += " Old password:" + oldPwd; + logString += " New password:" + newPwd; FmLogger::log( logString ); CCoeEnv *env = CCoeEnv::Static(); @@ -236,10 +345,6 @@ FmS60Utils::ConvertCharsToPwd( ptrNewPassword16, newPassword ); FmS60Utils::ConvertCharsToPwd( ptrOldPassword16, oldPassword ); - //oldPassword.FillZ(oldPassword.MaxLength()); - //oldPassword.Zero(); - //newPassword.Copy(_L8("A")); - int err( fs.LockDrive( drive, oldPassword, newPassword, ETrue ) ); logString = "Drive:" + QString::number( drive ); @@ -247,7 +352,15 @@ logString = "Password set error:" + QString::number( err ); FmLogger::log( logString ); - return err; + if( err == KErrNone ){ + return FmErrNone; + } + else if( err == KErrNotSupported ){ + return FmErrNotSupported; + } + else{ + return FmErrUnKnown; + } } void FmUtils::emptyPwd( QString &pwd ) @@ -260,6 +373,17 @@ int FmUtils::renameDrive( const QString &driverName, const QString &newVolumeName) { + foreach( 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(); @@ -273,154 +397,33 @@ QString logString = "Rename error:" + QString::number( err ); FmLogger::log( logString ); - return err; + if( err == KErrNone ){ + return FmErrNone; + } + else if( err == KErrNotReady ){ + return FmErrNotReady; + } + else{ + return FmErrUnKnown; + } } -int FmUtils::ejectDrive( const QString &driverName ) +void FmUtils::ejectDrive( const QString &driverName ) { - CCoeEnv *env = CCoeEnv::Static(); - RFs& fs = env->FsSession(); + QString logString = "FmUtils::ejectDrive start"; + FmLogger::log( logString ); TInt drive = 0; drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA; const int KDriveShift = 16; - - TFileName fileSystemName; - TInt err = fs.FileSystemName( fileSystemName, drive ); + // Let SysAp handle eject RProperty::Set( KPSUidCoreApplicationUIs, KCoreAppUIsMmcRemovedWithoutEject, ECoreAppUIsEjectCommandUsedToDrive | ( drive << KDriveShift ) ); - - err = fs.DismountFileSystem( fileSystemName, drive ); - - if (err == KErrNone){ - // remount the file system - err = fs.MountFileSystem( fileSystemName, drive ); - - if (err == KErrInUse){ - // try to remount after a while if locked - User::After(1000000); - err = fs.MountFileSystem( fileSystemName, drive ); - } - } - - return err; -} - -int FmUtils::formatDrive( const QString &driverName ) -{ - RFormat format; - -// CCoeEnv *env = CCoeEnv::Static(); -// RFs& fs = env->FsSession(); - - RFs fs; - int err = fs.Connect(); - - if( err != KErrNone ){ - return FmErrTypeFormatFailed; - } - - TInt drive = 0; - drive = driverName[0].toUpper().toAscii() - 'A' + EDriveA; - - TDriveName formatDriveName( TDriveUnit( drive ).Name() ); - - int finalValue = 0; - - format.Close(); - - err = format.Open( - fs, formatDriveName, EFullFormat | ESpecialFormat, finalValue ); - - QString logString = "Format open error:" + QString::number( err ); - FmLogger::log( logString ); - - if( err == KErrLocked ){ - err = fs.ErasePassword( drive ); - - logString = "ErasePassword error:" + QString::number( err ); - FmLogger::log( logString ); - - if( err == KErrNone ){ - err = format.Open( - fs, formatDriveName, EFullFormat, finalValue ); - - logString = "Second format open error:" + QString::number( err ); - FmLogger::log( logString ); - } - } - - if (err == KErrInUse){ - TBool reallyFormat = ETrue; - if (reallyFormat) - { - err = format.Open( - fs, formatDriveName, EFullFormat | EForceFormat, finalValue ); - - logString = "Reallyformat open error:" + QString::number( err ); - FmLogger::log( logString ); - } - } - - TFullName fsName; - if ( err == KErrNone ) - { - err = fs.FileSystemName( fsName, drive ); - - logString = "FileSystemName error:" + QString::number( err ); - FmLogger::log( logString ); - - if ( err == KErrNone && fsName.Length() > 0 ) - { - // Prevent SysAp shutting down applications - RProperty::Set( - KPSUidCoreApplicationUIs, - KCoreAppUIsMmcRemovedWithoutEject, - ECoreAppUIsEjectCommandUsed ); - - logString = "Prevent SysAp shutting down applications" ; - FmLogger::log( logString ); - } - else - { - // Don't continue with format if there is no file system name - // or file system name could not be obtained. - err = KErrCancel; - - logString = "Format cancel:" + QString::number( err ); - FmLogger::log( logString ); - } - } - - if( err == KErrNone && finalValue ){ - - while ( finalValue ){ - logString = "Format tracks:" + QString::number( finalValue ); - FmLogger::log( logString ); - - err = format.Next( finalValue ); - - if( err != KErrNone ){ - logString = "Format error:" + QString::number( err ); - FmLogger::log( logString ); - break; - } - } - } - - if( !finalValue || err != KErrNone ){ - format.Close(); - fs.Close(); - - createDefaultFolders( driverName ); - } - - return FmErrNone; } QString FmUtils::getFileType( const QString &filePath ) @@ -449,20 +452,11 @@ quint64 FmUtils::getDriveDetailsResult( const QString &folderPath, const QString &extension ) { int err; -// CCoeEnv *env = CCoeEnv::Static(); -// RFs& fs = env->FsSession(); RFs fs; err = fs.Connect(); - QString string( folderPath ); - - QRegExp regExp( "/" ); - string.replace( regExp, "\\" ); - - if( string.right( 1 )!= "\\"){ - string.append( "\\" ); - } + QString string( formatPath( folderPath ) ); TPtrC desFolderPath( XQConversions::qStringToS60Desc( string )->Des() ); TPtrC ptrExtension( XQConversions::qStringToS60Desc( extension )->Des() ); @@ -523,6 +517,16 @@ } +bool FmUtils::isDrive( const QString &path ) +{ + bool ret( false ); + if( path.length() <= 3 && path.length() >=2 ) { + ret = true; + } + + return ret; +} + void FmUtils::createDefaultFolders( const QString &driverName ) { int err; @@ -613,6 +617,7 @@ return newFilePath; } +// used to filter drive which need be hide. bool FmUtils::checkDriveFilter( const QString &driveName ) { if( driveName.contains( "D:" ) || driveName.contains( "Z:" ) ) { @@ -623,11 +628,12 @@ QString FmUtils::checkDriveToFolderFilter( const QString &path ) { + /* QFileInfo fileInfo( path ); if( !fileInfo.exists() ) { return QString(); } - + */ QString checkedPath = fillPathWithSplash( path ); if( checkedPath.compare( QString( "C:/"), Qt::CaseInsensitive ) == 0 ) { checkedPath += QString( "data/" ); @@ -657,34 +663,53 @@ bool FmUtils::isPathAccessabel( const QString &path ) { + FmLogger::log( QString( "isPathAccessabel:" ) + path ); + if( path.length() <= 3 && !isDriveAvailable( path ) ) { //used to filter locked drive + FmLogger::log( QString( "isPathAccessabel false: path is drive and not available" ) ); + return false; + } QFileInfo fileInfo( path ); if( fileInfo.absoluteFilePath().contains( QString( Drive_C ), Qt::CaseInsensitive ) && !fileInfo.absoluteFilePath().contains( QString( Folder_C_Data ), Qt::CaseInsensitive ) ) { + FmLogger::log( QString( "isPathAccessabel false: path contain C and not in data folder" ) ); return false; } 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( !fileInfo.exists() ) { + FmLogger::log( QString( "isPathAccessabel false: path not exist" ) ); return false; } + FmLogger::log( QString( "isPathAccessabel true" ) ); return true; } +// only used to check drive, when MMC is not inserted, also return false bool FmUtils::isDriveAvailable( const QString &path ) { - QFileInfo fileInfo( path ); - if( !fileInfo.exists() ) { - return false; + FmLogger::log( QString( "isDriveAvailable:" ) + path ); + FmDriverInfo::DriveState driveState = queryDriverInfo( path ).driveState(); + if( ( driveState & FmDriverInfo::EDriveAvailable ) ) { + FmLogger::log( QString( "isDriveAvailable true" ) ); + return true; } - return true; + FmLogger::log( QString( "isDriveAvailable false" ) ); + return false; } void FmUtils::getDriveList( QStringList &driveList, bool isHideUnAvailableDrive ) { + if( isHideUnAvailableDrive ) { + FmLogger::log( QString( "getDriveList HideUnAvailableDrive_true" ) ); + } else { + FmLogger::log( QString( "getDriveList HideUnAvailableDrive_false" ) ); + } QFileInfoList infoList = QDir::drives(); foreach( QFileInfo fileInfo, infoList ) { @@ -712,8 +737,8 @@ QString volumeName = driverInfo.volumeName(); if( volumeName.isEmpty() && isFillWithDefaultVolume ){ - quint32 driveState = FmUtils::getDriverState( tempDriveName ); - if( !( driveState & FmDriverInfo::EDriveNotPresent ) ){ + FmDriverInfo::DriveState driveState = queryDriverInfo( tempDriveName ).driveState(); + if( driveState & FmDriverInfo::EDriveAvailable ){ if( driveState & FmDriverInfo::EDriveRemovable ) { if( driveState & FmDriverInfo::EDriveMassStorage ) { volumeName.append( QObject::tr( "Mass Storage" ) ); @@ -762,10 +787,10 @@ return FmErrNone; } -void FmUtils::sendFiles( QList filePathList ) +void FmUtils::sendFiles( QStringList &filePathList ) { ShareUi shareui; - shareui.init( filePathList, false ); + shareui.send( filePathList, false ); } QString FmUtils::getBurConfigPath( QString appPath ) @@ -774,3 +799,65 @@ QString path( BURCONFIGFILE ); return path; } + +bool FmUtils::isPathEqual( const QString &pathFst, const QString &pathLast ) +{ + QString fst( fillPathWithSplash( pathFst ) ); + QString last( fillPathWithSplash( pathLast ) ); + if( fst.compare( last, Qt::CaseInsensitive ) == 0 ) { + return true; + } + return false; +} + +bool FmUtils::isDefaultFolder( const QString &folderPath ) +{ + TPtrC desFolderPath( XQConversions::qStringToS60Desc( folderPath )->Des() ); + + TInt pathType( PathInfo::PathType( desFolderPath ) ); + switch( pathType ){ + case PathInfo::ENotSystemPath:{ + QString locString( Localize( folderPath ) ); + if ( locString.isEmpty() ){ + return false; + } + return true; + } + case PathInfo::EPhoneMemoryRootPath: // FALL THROUGH + case PathInfo::EMemoryCardRootPath: // FALL THROUGH + case PathInfo::ERomRootPath:{ + return false; + } + // Accept other folders + default:{ + return true; + } + } +} + +QString FmUtils::Localize( const QString &path ) +{ + QString locPath = formatPath( path ); + + TPtrC desPath( XQConversions::qStringToS60Desc( locPath )->Des() ); + CDirectoryLocalizer *localizer = CDirectoryLocalizer::NewL(); + + localizer->SetFullPath( desPath ); + if( localizer->IsLocalized() ){ + return XQConversions::s60DescToQString( localizer->LocalizedName() ); + } + + return QString(); +} + +QString FmUtils::formatPath( const QString &path ) +{ + QString formatPath = path; + QRegExp regExp( "/" ); + formatPath.replace( regExp, "\\" ); + + if( path.right( 1 )!= "\\"){ + formatPath.append( "\\" ); + } + return formatPath; +}