filemanager/src/inc/fmutils.cpp
author hgs
Wed, 29 Sep 2010 10:37:03 +0800
changeset 46 d58987eac7e8
parent 37 15bc28c9dd51
child 49 81668a704644
permissions -rw-r--r--
201037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*     Zhiqiang Yang <zhiqiang.yang@nokia.com>
hgs
parents:
diff changeset
    14
* 
hgs
parents:
diff changeset
    15
* Description:
hgs
parents:
diff changeset
    16
*     The source file of the file manager utilities
hgs
parents:
diff changeset
    17
*/
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "fmutils.h"
hgs
parents:
diff changeset
    20
46
hgs
parents: 37
diff changeset
    21
#include <QRegExp>
37
hgs
parents:
diff changeset
    22
#include <QFileInfo>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include <hbglobal.h>
hgs
parents:
diff changeset
    25
46
hgs
parents: 37
diff changeset
    26
37
hgs
parents:
diff changeset
    27
/*!
hgs
parents:
diff changeset
    28
    Used to get drive type for convenience.
hgs
parents:
diff changeset
    29
*/
hgs
parents:
diff changeset
    30
FmDriverInfo::DriveType FmDriverInfo::driveType()
hgs
parents:
diff changeset
    31
{
hgs
parents:
diff changeset
    32
    FmDriverInfo::DriveType driveType;
hgs
parents:
diff changeset
    33
    if( mDriveState & FmDriverInfo::EDriveRemovable ) {
hgs
parents:
diff changeset
    34
        // if drive is removable, it may be mass, usb, or remote drive
hgs
parents:
diff changeset
    35
        if( mDriveState & FmDriverInfo::EDriveMassStorage ) {
hgs
parents:
diff changeset
    36
            driveType = FmDriverInfo::EDriveTypeMassStorage;
hgs
parents:
diff changeset
    37
        } else if( mDriveState & FmDriverInfo::EDriveUsbMemory ) {
hgs
parents:
diff changeset
    38
            driveType = FmDriverInfo::EDriveTypeUsbMemory;
hgs
parents:
diff changeset
    39
        } else if( mDriveState & FmDriverInfo::EDriveRemote ){
hgs
parents:
diff changeset
    40
            driveType = FmDriverInfo::EDriveTypeRemote;
hgs
parents:
diff changeset
    41
        } else {
hgs
parents:
diff changeset
    42
            driveType = FmDriverInfo::EDriveTypeMemoryCard;
hgs
parents:
diff changeset
    43
        }
hgs
parents:
diff changeset
    44
    } else if( mDriveState & FmDriverInfo::EDriveRom ) {
hgs
parents:
diff changeset
    45
        driveType = FmDriverInfo::EDriveTypeRom;
hgs
parents:
diff changeset
    46
    } else if( mDriveState & FmDriverInfo::EDriveRam ) {
hgs
parents:
diff changeset
    47
        driveType = FmDriverInfo::EDriveTypeRam;
hgs
parents:
diff changeset
    48
    } else {
hgs
parents:
diff changeset
    49
        // if drive type is not recognized in previous condition,
hgs
parents:
diff changeset
    50
        // it should be an un-existed drive or phone memory
hgs
parents:
diff changeset
    51
        if( mDriveState & EDriveNotPresent ){
hgs
parents:
diff changeset
    52
            // if come here, means 2 conditions:
hgs
parents:
diff changeset
    53
            //  1 this drive is not exist( FmUtils::queryDriverInfo will give EDriveNotPresent to mDriveState )
hgs
parents:
diff changeset
    54
            //  2 un-mounted removable drive
hgs
parents:
diff changeset
    55
            // removable drive filted in previous condifiton. So, give EDriveTypeNotExist 
hgs
parents:
diff changeset
    56
            driveType = FmDriverInfo::EDriveTypeNotExist;
hgs
parents:
diff changeset
    57
        } else {
hgs
parents:
diff changeset
    58
            // drive is existed, only remain the type of EDriveTypePhoneMemory
hgs
parents:
diff changeset
    59
            driveType = FmDriverInfo::EDriveTypePhoneMemory;
hgs
parents:
diff changeset
    60
        }
hgs
parents:
diff changeset
    61
    }
hgs
parents:
diff changeset
    62
    
hgs
parents:
diff changeset
    63
    return driveType;
hgs
parents:
diff changeset
    64
}
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
/*!
hgs
parents:
diff changeset
    67
    return drive name for \a path
hgs
parents:
diff changeset
    68
*/
hgs
parents:
diff changeset
    69
QString FmUtils::getDriveNameFromPath( const QString &path )
hgs
parents:
diff changeset
    70
{
hgs
parents:
diff changeset
    71
    // fillPathWithSplash make sure path length will be at least 3 if it is not empty.
hgs
parents:
diff changeset
    72
    QString checkedPath( fillPathWithSplash( path ) );
hgs
parents:
diff changeset
    73
    if( checkedPath.length() < 3 ) {
hgs
parents:
diff changeset
    74
        return QString();
hgs
parents:
diff changeset
    75
    }
hgs
parents:
diff changeset
    76
    return checkedPath.left( 3 );
hgs
parents:
diff changeset
    77
}
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
/*!
hgs
parents:
diff changeset
    80
    return drive letter for \a path
hgs
parents:
diff changeset
    81
*/
hgs
parents:
diff changeset
    82
QString FmUtils::getDriveLetterFromPath( const QString &path )
hgs
parents:
diff changeset
    83
{
hgs
parents:
diff changeset
    84
	if( path.length() <2 ) {
hgs
parents:
diff changeset
    85
        return QString();
hgs
parents:
diff changeset
    86
    }
hgs
parents:
diff changeset
    87
    return path.left( 1 );
hgs
parents:
diff changeset
    88
}
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
/*!
hgs
parents:
diff changeset
    91
    return formatted string for size.
hgs
parents:
diff changeset
    92
*/
hgs
parents:
diff changeset
    93
QString FmUtils::formatStorageSize( quint64 size )
hgs
parents:
diff changeset
    94
{
hgs
parents:
diff changeset
    95
	if ( size < 1000 ) {
hgs
parents:
diff changeset
    96
		return QString::number( size ) + " B";
hgs
parents:
diff changeset
    97
	} else if ( size < 1000 * 1000 ) {
hgs
parents:
diff changeset
    98
		return QString::number( size / 1024.0, 'f', 2 ) + " KB";
hgs
parents:
diff changeset
    99
	} else if ( size < 1000 * 1000 * 1000 ) {
hgs
parents:
diff changeset
   100
		return QString::number( size / (1024.0 * 1024.0), 'f', 1 ) + " MB";
hgs
parents:
diff changeset
   101
	} else {
hgs
parents:
diff changeset
   102
	    return QString::number( size / ( 1024.0 * 1024.0 * 1024.0 ), 'f', 1 ) + " GB";	    
hgs
parents:
diff changeset
   103
	}
hgs
parents:
diff changeset
   104
}
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
/*!
hgs
parents:
diff changeset
   107
    Judge if a path is drive path, not a folder or a file.
hgs
parents:
diff changeset
   108
    For example, true for C:\ while false for C:\data
hgs
parents:
diff changeset
   109
*/
hgs
parents:
diff changeset
   110
bool FmUtils::isDrive( const QString &path )
hgs
parents:
diff changeset
   111
{
hgs
parents:
diff changeset
   112
   bool ret( false );
hgs
parents:
diff changeset
   113
   if( path.length() <= 3 && path.length() >=2 ) {
hgs
parents:
diff changeset
   114
       ret = true;
hgs
parents:
diff changeset
   115
   }
hgs
parents:
diff changeset
   116
   
hgs
parents:
diff changeset
   117
   return ret;   
hgs
parents:
diff changeset
   118
}
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
/*!
46
hgs
parents: 37
diff changeset
   121
    All "/" and "\" in \a path will be changed to \a splitter
hgs
parents: 37
diff changeset
   122
    QDir::separator is default value for splitter
37
hgs
parents:
diff changeset
   123
    \sa fillPathWithSplash, fillPathWithSplash will append QDir::separator in the end
hgs
parents:
diff changeset
   124
*/
46
hgs
parents: 37
diff changeset
   125
QString FmUtils::formatPath( const QString &path, const QChar &splitter )
37
hgs
parents:
diff changeset
   126
{
hgs
parents:
diff changeset
   127
    QString formatPath;
hgs
parents:
diff changeset
   128
    if( path.isEmpty() ) {
hgs
parents:
diff changeset
   129
        return formatPath;
hgs
parents:
diff changeset
   130
    }
hgs
parents:
diff changeset
   131
    
hgs
parents:
diff changeset
   132
    foreach( const QChar &ch, path ) {
hgs
parents:
diff changeset
   133
        if( ch == QChar('\\') || ch == QChar('/') ) {
46
hgs
parents: 37
diff changeset
   134
            formatPath.append( splitter );
37
hgs
parents:
diff changeset
   135
        } else {
hgs
parents:
diff changeset
   136
            formatPath.append( ch );
hgs
parents:
diff changeset
   137
        }
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    return formatPath;
hgs
parents:
diff changeset
   141
}
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
/*!
46
hgs
parents: 37
diff changeset
   144
    Fill splash in the end of \a filePath. And all "/" and "\" will be changed to \a splitter
hgs
parents: 37
diff changeset
   145
    QDir::separator is default value for splitter
37
hgs
parents:
diff changeset
   146
    Please do not call this function if path is a file.
hgs
parents:
diff changeset
   147
    Use \a formatPath instead, \a formatPath will not append QDir::separator in the end.
hgs
parents:
diff changeset
   148
    \sa formatPath only changed "/" and "\" to QDir::separator
hgs
parents:
diff changeset
   149
*/
46
hgs
parents: 37
diff changeset
   150
QString FmUtils::fillPathWithSplash( const QString &filePath, const QChar &splitter )
37
hgs
parents:
diff changeset
   151
{
hgs
parents:
diff changeset
   152
    QString newFilePath;
hgs
parents:
diff changeset
   153
    if( filePath.isEmpty() ) {
hgs
parents:
diff changeset
   154
        return newFilePath;
hgs
parents:
diff changeset
   155
    }
hgs
parents:
diff changeset
   156
46
hgs
parents: 37
diff changeset
   157
    newFilePath = formatPath( filePath, splitter );
37
hgs
parents:
diff changeset
   158
    
46
hgs
parents: 37
diff changeset
   159
    if( newFilePath.right( 1 )!= splitter ){
hgs
parents: 37
diff changeset
   160
        newFilePath.append( splitter );
37
hgs
parents:
diff changeset
   161
    }
hgs
parents:
diff changeset
   162
    return newFilePath;
hgs
parents:
diff changeset
   163
}
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
/*!
hgs
parents:
diff changeset
   166
    Remove splash in the end of \a filePath.
hgs
parents:
diff changeset
   167
*/
hgs
parents:
diff changeset
   168
QString FmUtils::removePathSplash( const QString &filePath )
hgs
parents:
diff changeset
   169
{
hgs
parents:
diff changeset
   170
    QString newFilePath( filePath );
hgs
parents:
diff changeset
   171
    if( filePath.right( 1 ) == QChar( '/' ) || filePath.right(1) == QString( "\\" ) ) {
hgs
parents:
diff changeset
   172
        newFilePath = filePath.left( filePath.length() - 1 );
hgs
parents:
diff changeset
   173
    }
hgs
parents:
diff changeset
   174
    return newFilePath;
hgs
parents:
diff changeset
   175
}
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
/*!
hgs
parents:
diff changeset
   178
    fill \a driveList of drives can be shown in driveListView
hgs
parents:
diff changeset
   179
*/
hgs
parents:
diff changeset
   180
void FmUtils::getDriveList( QStringList &driveList, bool isHideUnAvailableDrive )
hgs
parents:
diff changeset
   181
{
hgs
parents:
diff changeset
   182
    if( isHideUnAvailableDrive ) {
hgs
parents:
diff changeset
   183
        FM_LOG( QString( "getDriveList HideUnAvailableDrive_true" ) );
hgs
parents:
diff changeset
   184
    } else {
hgs
parents:
diff changeset
   185
        FM_LOG( QString( "getDriveList HideUnAvailableDrive_false" ) );
hgs
parents:
diff changeset
   186
    }
hgs
parents:
diff changeset
   187
    QFileInfoList infoList = QDir::drives();
hgs
parents:
diff changeset
   188
hgs
parents:
diff changeset
   189
    foreach( const QFileInfo &fileInfo, infoList ) {
hgs
parents:
diff changeset
   190
        QString driveName = fileInfo.absolutePath();
hgs
parents:
diff changeset
   191
        if( checkDriveAccessFilter( driveName ) ) {
hgs
parents:
diff changeset
   192
            if( !isHideUnAvailableDrive ) {
hgs
parents:
diff changeset
   193
                driveList.append( driveName );
hgs
parents:
diff changeset
   194
            }
hgs
parents:
diff changeset
   195
            else if ( isDriveAvailable( driveName ) ) {
hgs
parents:
diff changeset
   196
                driveList.append( driveName );
hgs
parents:
diff changeset
   197
            }
hgs
parents:
diff changeset
   198
        }
hgs
parents:
diff changeset
   199
    }
hgs
parents:
diff changeset
   200
    return;
hgs
parents:
diff changeset
   201
}
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
/*!
hgs
parents:
diff changeset
   204
    return the combined string of drive name and volume( e.g. C: Phone memory for C drive)
hgs
parents:
diff changeset
   205
    \a driveName the drive name.
hgs
parents:
diff changeset
   206
    If set \a isFillWithDefaultVolume true, fill result with default volume if drive volume is empty.
hgs
parents:
diff changeset
   207
*/
hgs
parents:
diff changeset
   208
QString FmUtils::fillDriveVolume( QString driveName, bool isFillWithDefaultVolume )
hgs
parents:
diff changeset
   209
{
hgs
parents:
diff changeset
   210
    QString ret;
hgs
parents:
diff changeset
   211
    if( driveName.isEmpty() ) {
hgs
parents:
diff changeset
   212
        return ret;
hgs
parents:
diff changeset
   213
    }
hgs
parents:
diff changeset
   214
    QString tempDriveName = fillPathWithSplash( driveName );
hgs
parents:
diff changeset
   215
hgs
parents:
diff changeset
   216
    QString checkedDriveName( removePathSplash( driveName ) );
hgs
parents:
diff changeset
   217
    
hgs
parents:
diff changeset
   218
    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( tempDriveName );
hgs
parents:
diff changeset
   219
    QString volumeName = driverInfo.volumeName();
hgs
parents:
diff changeset
   220
    
hgs
parents:
diff changeset
   221
    if( volumeName.isEmpty() && isFillWithDefaultVolume ){
hgs
parents:
diff changeset
   222
        switch ( driverInfo.driveType() )
hgs
parents:
diff changeset
   223
            {
hgs
parents:
diff changeset
   224
            case FmDriverInfo::EDriveTypeMassStorage:
hgs
parents:
diff changeset
   225
                ret = hbTrId( "txt_fmgr_dblist_1_mass_storage" ).arg( checkedDriveName );
hgs
parents:
diff changeset
   226
                break;
hgs
parents:
diff changeset
   227
            case FmDriverInfo::EDriveTypeUsbMemory:
hgs
parents:
diff changeset
   228
                ret = hbTrId( "txt_fmgr_dblist_1_usb_memory" ).arg( checkedDriveName );
hgs
parents:
diff changeset
   229
                break;
hgs
parents:
diff changeset
   230
            case FmDriverInfo::EDriveTypeMemoryCard:
hgs
parents:
diff changeset
   231
                ret = hbTrId( "txt_fmgr_dblist_1_memory_card" ).arg( checkedDriveName );
hgs
parents:
diff changeset
   232
                break;
hgs
parents:
diff changeset
   233
            case FmDriverInfo::EDriveTypePhoneMemory:
hgs
parents:
diff changeset
   234
                ret = hbTrId( "txt_fmgr_dblist_1_device_memory" ).arg( checkedDriveName );
hgs
parents:
diff changeset
   235
                break;
hgs
parents:
diff changeset
   236
            case FmDriverInfo::EDriveTypeNotExist:// no such drive
hgs
parents:
diff changeset
   237
            default:// do not need get volume for other drive types, e.g. Ram, Rom
hgs
parents:
diff changeset
   238
                break;
hgs
parents:
diff changeset
   239
            }    
hgs
parents:
diff changeset
   240
    }
hgs
parents:
diff changeset
   241
    
hgs
parents:
diff changeset
   242
    if( ret.isEmpty() ) {
hgs
parents:
diff changeset
   243
        // ret is not got. fill ret as default method
hgs
parents:
diff changeset
   244
        // txt_fmgr_dblist_1_2 is not correct, can not use.
hgs
parents:
diff changeset
   245
        ret = hbTrId( "%1 %2" ).arg( checkedDriveName ).arg( volumeName );
hgs
parents:
diff changeset
   246
    }
hgs
parents:
diff changeset
   247
    return ret;
hgs
parents:
diff changeset
   248
}
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
/*!
hgs
parents:
diff changeset
   251
    return the default volume for drive
hgs
parents:
diff changeset
   252
    \a driveName the drive.
hgs
parents:
diff changeset
   253
    \sa getVolumeNameWithDefaultNameIfNull
hgs
parents:
diff changeset
   254
*/
hgs
parents:
diff changeset
   255
QString FmUtils::getDefaultVolumeName( const QString &driveName )
hgs
parents:
diff changeset
   256
{
hgs
parents:
diff changeset
   257
    QString defaultVolumeName;
hgs
parents:
diff changeset
   258
    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( driveName );
hgs
parents:
diff changeset
   259
          
hgs
parents:
diff changeset
   260
    switch ( driverInfo.driveType() )
hgs
parents:
diff changeset
   261
        {
hgs
parents:
diff changeset
   262
        case FmDriverInfo::EDriveTypeMassStorage:
hgs
parents:
diff changeset
   263
            defaultVolumeName = hbTrId("Mass storage"); 
hgs
parents:
diff changeset
   264
            break;
hgs
parents:
diff changeset
   265
        case FmDriverInfo::EDriveTypeUsbMemory:
hgs
parents:
diff changeset
   266
            defaultVolumeName = hbTrId("USB memory"); 
hgs
parents:
diff changeset
   267
            break;
hgs
parents:
diff changeset
   268
        case FmDriverInfo::EDriveTypeMemoryCard:
hgs
parents:
diff changeset
   269
            defaultVolumeName = hbTrId("Memory card");
hgs
parents:
diff changeset
   270
            break;
hgs
parents:
diff changeset
   271
        case FmDriverInfo::EDriveTypePhoneMemory:
hgs
parents:
diff changeset
   272
            defaultVolumeName = hbTrId("Device memory");
hgs
parents:
diff changeset
   273
            break;
hgs
parents:
diff changeset
   274
        case FmDriverInfo::EDriveTypeNotExist:// no such drive, break and return empty string
hgs
parents:
diff changeset
   275
        default:// do not have default volume for other drive types, e.g. Ram, Rom
hgs
parents:
diff changeset
   276
            break;
hgs
parents:
diff changeset
   277
        }   
hgs
parents:
diff changeset
   278
    return defaultVolumeName;
hgs
parents:
diff changeset
   279
}
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
/*!
hgs
parents:
diff changeset
   282
    get the volume name of the drive, if it is null, then return the default name.
hgs
parents:
diff changeset
   283
    \a driveName the drive letter.
hgs
parents:
diff changeset
   284
    \a defaultName whether it is the default name.
hgs
parents:
diff changeset
   285
    return the volume name.
hgs
parents:
diff changeset
   286
*/
hgs
parents:
diff changeset
   287
QString FmUtils::getVolumeNameWithDefaultNameIfNull( const QString &driveName, bool &defaultName )
hgs
parents:
diff changeset
   288
{
hgs
parents:
diff changeset
   289
    // do not re-use FmUtils::getDefaultVolumeName to save one time for call FmUtils::queryDriverInfo
hgs
parents:
diff changeset
   290
    FmDriverInfo driverInfo = FmUtils::queryDriverInfo( driveName );
hgs
parents:
diff changeset
   291
          
hgs
parents:
diff changeset
   292
    QString volumeName = driverInfo.volumeName();    
hgs
parents:
diff changeset
   293
    //save the volume status, whether it is default name
hgs
parents:
diff changeset
   294
    defaultName = false;
hgs
parents:
diff changeset
   295
    //volume name may be null if not set, it will be set at least for one time in the following while cycling.
hgs
parents:
diff changeset
   296
    if ( volumeName.isEmpty() ) {
hgs
parents:
diff changeset
   297
        switch ( driverInfo.driveType() )
hgs
parents:
diff changeset
   298
            {
hgs
parents:
diff changeset
   299
            case FmDriverInfo::EDriveTypeMassStorage:
hgs
parents:
diff changeset
   300
                volumeName = hbTrId("Mass storage"); 
hgs
parents:
diff changeset
   301
                break;
hgs
parents:
diff changeset
   302
            case FmDriverInfo::EDriveTypeUsbMemory:
hgs
parents:
diff changeset
   303
                volumeName = hbTrId("USB memory"); 
hgs
parents:
diff changeset
   304
                break;
hgs
parents:
diff changeset
   305
            case FmDriverInfo::EDriveTypeMemoryCard:
hgs
parents:
diff changeset
   306
                volumeName = hbTrId("Memory card");
hgs
parents:
diff changeset
   307
                break;
hgs
parents:
diff changeset
   308
            case FmDriverInfo::EDriveTypePhoneMemory:
hgs
parents:
diff changeset
   309
                volumeName = hbTrId("Device memory");
hgs
parents:
diff changeset
   310
                break;
hgs
parents:
diff changeset
   311
            case FmDriverInfo::EDriveTypeNotExist:// no such drive
hgs
parents:
diff changeset
   312
            default:// do not need get volume for other drive types, e.g. Ram, Rom
hgs
parents:
diff changeset
   313
                break;
hgs
parents:
diff changeset
   314
            }   
hgs
parents:
diff changeset
   315
        if( !volumeName.isEmpty() ) {
hgs
parents:
diff changeset
   316
             defaultName = true;
hgs
parents:
diff changeset
   317
        }
hgs
parents:
diff changeset
   318
    }
hgs
parents:
diff changeset
   319
    return volumeName;
hgs
parents:
diff changeset
   320
}
hgs
parents:
diff changeset
   321
hgs
parents:
diff changeset
   322
/*!
hgs
parents:
diff changeset
   323
    Check if two path are the same.
hgs
parents:
diff changeset
   324
*/
hgs
parents:
diff changeset
   325
bool FmUtils::isPathEqual( const QString &pathFst, const QString &pathLast )
hgs
parents:
diff changeset
   326
{
hgs
parents:
diff changeset
   327
    QString fst( fillPathWithSplash( pathFst ) );
hgs
parents:
diff changeset
   328
    QString last( fillPathWithSplash( pathLast ) );
hgs
parents:
diff changeset
   329
    if( fst.compare( last, Qt::CaseInsensitive ) == 0 ) {
hgs
parents:
diff changeset
   330
        return true;
hgs
parents:
diff changeset
   331
    }
hgs
parents:
diff changeset
   332
    return false;
hgs
parents:
diff changeset
   333
}
hgs
parents:
diff changeset
   334
hgs
parents:
diff changeset
   335
/*!
hgs
parents:
diff changeset
   336
    Check if a name is illegal for folder/file naming rule.
hgs
parents:
diff changeset
   337
*/
hgs
parents:
diff changeset
   338
bool FmUtils::checkFolderFileName( const QString& name )
hgs
parents:
diff changeset
   339
{
hgs
parents:
diff changeset
   340
    // trim space firest, because there may be some spaces after "." ,  it is also not valid
hgs
parents:
diff changeset
   341
    QString trimmedName( name.trimmed() );
hgs
parents:
diff changeset
   342
	if( trimmedName.isEmpty() ) {
hgs
parents:
diff changeset
   343
		return false;
hgs
parents:
diff changeset
   344
	}
hgs
parents:
diff changeset
   345
    if( trimmedName.endsWith( QChar('.'),  Qt::CaseInsensitive ) ) {
hgs
parents:
diff changeset
   346
        return false;
hgs
parents:
diff changeset
   347
    }
hgs
parents:
diff changeset
   348
    if( trimmedName.contains( QChar('\\'), Qt::CaseInsensitive ) ||
hgs
parents:
diff changeset
   349
        trimmedName.contains( QChar('/'),  Qt::CaseInsensitive ) ||
hgs
parents:
diff changeset
   350
        trimmedName.contains( QChar(':'),  Qt::CaseInsensitive ) ||
hgs
parents:
diff changeset
   351
        trimmedName.contains( QChar('*'),  Qt::CaseInsensitive ) ||
hgs
parents:
diff changeset
   352
        trimmedName.contains( QChar('?'),  Qt::CaseInsensitive ) ||
hgs
parents:
diff changeset
   353
        trimmedName.contains( QChar('\"'), Qt::CaseInsensitive ) ||
hgs
parents:
diff changeset
   354
        trimmedName.contains( QChar('<'),  Qt::CaseInsensitive ) ||
hgs
parents:
diff changeset
   355
        trimmedName.contains( QChar('>'),  Qt::CaseInsensitive ) ||
hgs
parents:
diff changeset
   356
        trimmedName.contains( QChar('|'),  Qt::CaseInsensitive ) ){
hgs
parents:
diff changeset
   357
        return false;
hgs
parents:
diff changeset
   358
    }
hgs
parents:
diff changeset
   359
    // use original name to exam max size of file name
hgs
parents:
diff changeset
   360
    if( name.length() > getMaxFileNameLength() ) {
hgs
parents:
diff changeset
   361
        return false;
hgs
parents:
diff changeset
   362
    }
hgs
parents:
diff changeset
   363
    return true;
hgs
parents:
diff changeset
   364
}
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
/*!
hgs
parents:
diff changeset
   367
    check file or folder path is illegal or not.
hgs
parents:
diff changeset
   368
    \a fileName file/folder name, used to check illegal characters
hgs
parents:
diff changeset
   369
    \a path file/folder path, used to check if path is available to use.
hgs
parents:
diff changeset
   370
    \a errString if return false, errString will be set for error note.
hgs
parents:
diff changeset
   371
    return true for not illegal and false for illegal path.
hgs
parents:
diff changeset
   372
*/
hgs
parents:
diff changeset
   373
bool FmUtils::checkNewFolderOrFile( const QString &fileName, const QString &path, QString &errString )
hgs
parents:
diff changeset
   374
{
hgs
parents:
diff changeset
   375
    // first check if fileName is valid, then check if path length is valid, and check if file/foler is existed at last
hgs
parents:
diff changeset
   376
    QFileInfo fileInfo( path );
hgs
parents:
diff changeset
   377
    bool ret( true );   
hgs
parents:
diff changeset
   378
    if (!FmUtils::checkFolderFileName( fileName ) ) {
hgs
parents:
diff changeset
   379
        errString = hbTrId( "Invalid file or folder name!" );
hgs
parents:
diff changeset
   380
        ret = false;
hgs
parents:
diff changeset
   381
    } else if( !FmUtils::checkMaxPathLength( path ) ) {
hgs
parents:
diff changeset
   382
        errString = hbTrId( "the path you specified is too long!" );
hgs
parents:
diff changeset
   383
        ret = false;
hgs
parents:
diff changeset
   384
    } else if (fileInfo.exists()) {
hgs
parents:
diff changeset
   385
        errString = hbTrId( "%1 already exist!" ).arg( fileInfo.fileName() );
hgs
parents:
diff changeset
   386
        ret = false;
hgs
parents:
diff changeset
   387
    }
hgs
parents:
diff changeset
   388
    return ret;
hgs
parents:
diff changeset
   389
}
hgs
parents:
diff changeset
   390
hgs
parents:
diff changeset
   391
/*!
hgs
parents:
diff changeset
   392
    Check if \a dest is sub level path of \a src
hgs
parents:
diff changeset
   393
    Used to check True/False when copy a folder to itself or its subfolder
hgs
parents:
diff changeset
   394
    For example, c:\data\test is sub path of c:\data.
hgs
parents:
diff changeset
   395
    But c:\data123\test is not sub path of c:\data.
hgs
parents:
diff changeset
   396
    So after got right part of path, the first char must be \ or /
hgs
parents:
diff changeset
   397
*/
hgs
parents:
diff changeset
   398
bool FmUtils::isSubLevelPath( const QString &src, const QString &dest )
hgs
parents:
diff changeset
   399
{
hgs
parents:
diff changeset
   400
    FM_LOG("FmUtils::isSubFolder: src=" + src + " dest=" + dest);
hgs
parents:
diff changeset
   401
    QString checkedSrc( FmUtils::fillPathWithSplash( src ) );
hgs
parents:
diff changeset
   402
    QString checkedDest( FmUtils::fillPathWithSplash( dest ) );
hgs
parents:
diff changeset
   403
    
hgs
parents:
diff changeset
   404
    if( checkedDest.contains( checkedSrc, Qt::CaseInsensitive) &&
hgs
parents:
diff changeset
   405
            checkedDest.length() > checkedSrc.length() ) {
hgs
parents:
diff changeset
   406
        // for example c:\data\ vs c:\data\123\ 
hgs
parents:
diff changeset
   407
        FM_LOG("FmUtils::isSubFolder: true");
hgs
parents:
diff changeset
   408
        return true;
hgs
parents:
diff changeset
   409
    }
hgs
parents:
diff changeset
   410
    // for example c:\data\ vs c:\data\ 
hgs
parents:
diff changeset
   411
    // for example c:\data\ vs c:\data123\ 
hgs
parents:
diff changeset
   412
hgs
parents:
diff changeset
   413
    FM_LOG("FmUtils::isSubFolder: false");
hgs
parents:
diff changeset
   414
    return false;
hgs
parents:
diff changeset
   415
}
46
hgs
parents: 37
diff changeset
   416
hgs
parents: 37
diff changeset
   417
/*!
hgs
parents: 37
diff changeset
   418
    Check if \a path is system path.
hgs
parents: 37
diff changeset
   419
*/
hgs
parents: 37
diff changeset
   420
bool FmUtils::isSystemFolder( const QString &path )
hgs
parents: 37
diff changeset
   421
{
hgs
parents: 37
diff changeset
   422
    QFileInfo fileInfo( path );
hgs
parents: 37
diff changeset
   423
    if( fileInfo.isDir() ) {
hgs
parents: 37
diff changeset
   424
        QString checkedPath( fillPathWithSplash( path, Char_Slash ) );
hgs
parents: 37
diff changeset
   425
hgs
parents: 37
diff changeset
   426
        QRegExp systemFolder  ( RegexWidecard_SystemFolder,   Qt::CaseInsensitive, QRegExp::Wildcard );
hgs
parents: 37
diff changeset
   427
        QRegExp sysFolder     ( RegexWidecard_SysFolder,      Qt::CaseInsensitive, QRegExp::Wildcard );
hgs
parents: 37
diff changeset
   428
        QRegExp privateFolder ( RegexWidecard_PrivateFolder,  Qt::CaseInsensitive, QRegExp::Wildcard );
hgs
parents: 37
diff changeset
   429
        QRegExp resourceFolder( RegexWidecard_ResourceFolder, Qt::CaseInsensitive, QRegExp::Wildcard );
hgs
parents: 37
diff changeset
   430
hgs
parents: 37
diff changeset
   431
        if( systemFolder.exactMatch( checkedPath ) ||
hgs
parents: 37
diff changeset
   432
            sysFolder.exactMatch( checkedPath ) ||
hgs
parents: 37
diff changeset
   433
            privateFolder.exactMatch( checkedPath ) ||
hgs
parents: 37
diff changeset
   434
            resourceFolder.exactMatch( checkedPath ) ) {
hgs
parents: 37
diff changeset
   435
            return true;
hgs
parents: 37
diff changeset
   436
        }
hgs
parents: 37
diff changeset
   437
    }
hgs
parents: 37
diff changeset
   438
    return false;
hgs
parents: 37
diff changeset
   439
}