Fix cases where functions are called with a drive and no slash

When a file is specified on a path that includes a drive letter
followed by a colon but no slash then it didn't always account
for the fact that this refers to the current path on that drive.
This fixes the problems in completeBaseName(), baseName() and
path().  Tests are also added for these three cases and some
others too.

Task-number: QTBUG-25353

Change-Id: I47a197c6af066f532442ad269be57597ec61303a
Reviewed-by: Irfan Omair <irfan.omair@gmail.com>
Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
This commit is contained in:
Andy Shaw 2012-04-17 20:30:54 +02:00 committed by Qt by Nokia
parent fb6d83cca5
commit cfb44c6528
2 changed files with 34 additions and 10 deletions

View File

@ -189,7 +189,7 @@ QString QFileSystemEntry::path() const
if (m_lastSeparator == -1) { if (m_lastSeparator == -1) {
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
if (m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':')) if (m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
return m_filePath.left(2); return QFSFileEngine::currentPath(m_filePath.left(2));
#endif #endif
return QString(QLatin1Char('.')); return QString(QLatin1Char('.'));
} }
@ -205,32 +205,32 @@ QString QFileSystemEntry::path() const
QString QFileSystemEntry::baseName() const QString QFileSystemEntry::baseName() const
{ {
findFileNameSeparators(); findFileNameSeparators();
#if defined(Q_OS_WIN)
if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
return m_filePath.mid(2);
#endif
int length = -1; int length = -1;
if (m_firstDotInFileName >= 0) { if (m_firstDotInFileName >= 0) {
length = m_firstDotInFileName; length = m_firstDotInFileName;
if (m_lastSeparator != -1) // avoid off by one if (m_lastSeparator != -1) // avoid off by one
length--; length--;
} }
#if defined(Q_OS_WIN)
if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
return m_filePath.mid(2, length - 2);
#endif
return m_filePath.mid(m_lastSeparator + 1, length); return m_filePath.mid(m_lastSeparator + 1, length);
} }
QString QFileSystemEntry::completeBaseName() const QString QFileSystemEntry::completeBaseName() const
{ {
findFileNameSeparators(); findFileNameSeparators();
#if defined(Q_OS_WIN)
if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
return m_filePath.mid(2);
#endif
int length = -1; int length = -1;
if (m_firstDotInFileName >= 0) { if (m_firstDotInFileName >= 0) {
length = m_firstDotInFileName + m_lastDotInFileName; length = m_firstDotInFileName + m_lastDotInFileName;
if (m_lastSeparator != -1) // avoid off by one if (m_lastSeparator != -1) // avoid off by one
length--; length--;
} }
#if defined(Q_OS_WIN)
if (m_lastSeparator == -1 && m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
return m_filePath.mid(2, length - 2);
#endif
return m_filePath.mid(m_lastSeparator + 1, length); return m_filePath.mid(m_lastSeparator + 1, length);
} }

View File

@ -460,6 +460,8 @@ void tst_QFileInfo::absolutePath_data()
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
QTest::newRow("c:\\autoexec.bat") << "c:\\autoexec.bat" << "C:/" QTest::newRow("c:\\autoexec.bat") << "c:\\autoexec.bat" << "C:/"
<< "autoexec.bat"; << "autoexec.bat";
QTest::newRow("c:autoexec.bat") << QDir::currentPath().left(2) + "autoexec.bat" << QDir::currentPath()
<< "autoexec.bat";
#endif #endif
QTest::newRow("QTBUG-19995.1") << drivePrefix + "/System/Library/StartupItems/../Frameworks" QTest::newRow("QTBUG-19995.1") << drivePrefix + "/System/Library/StartupItems/../Frameworks"
<< drivePrefix + "/System/Library" << drivePrefix + "/System/Library"
@ -500,6 +502,7 @@ void tst_QFileInfo::absFilePath_data()
QString nonCurrentDrivePrefix = QString nonCurrentDrivePrefix =
drivePrefix.left(1).compare("X", Qt::CaseInsensitive) == 0 ? QString("Y:") : QString("X:"); drivePrefix.left(1).compare("X", Qt::CaseInsensitive) == 0 ? QString("Y:") : QString("X:");
QTest::newRow("absFilePathWithoutSlash") << drivePrefix + "tmp.txt" << QDir::currentPath() + "/tmp.txt";
QTest::newRow("<current drive>:my.dll") << drivePrefix + "temp/my.dll" << QDir::currentPath() + "/temp/my.dll"; QTest::newRow("<current drive>:my.dll") << drivePrefix + "temp/my.dll" << QDir::currentPath() + "/temp/my.dll";
QTest::newRow("<not current drive>:my.dll") << nonCurrentDrivePrefix + "temp/my.dll" QTest::newRow("<not current drive>:my.dll") << nonCurrentDrivePrefix + "temp/my.dll"
<< nonCurrentDrivePrefix + "/temp/my.dll"; << nonCurrentDrivePrefix + "/temp/my.dll";
@ -642,6 +645,7 @@ void tst_QFileInfo::fileName_data()
QTest::newRow("relativeFileInSubDir") << "temp/tmp.txt" << "tmp.txt"; QTest::newRow("relativeFileInSubDir") << "temp/tmp.txt" << "tmp.txt";
#if (defined(Q_OS_WIN) && !defined(Q_OS_WINCE)) #if (defined(Q_OS_WIN) && !defined(Q_OS_WINCE))
QTest::newRow("absFilePath") << "c:\\home\\andy\\tmp.txt" << "tmp.txt"; QTest::newRow("absFilePath") << "c:\\home\\andy\\tmp.txt" << "tmp.txt";
QTest::newRow("driveWithNoSlash") << "c:tmp.txt" << "tmp.txt";
#else #else
QTest::newRow("absFilePath") << "/home/andy/tmp.txt" << "tmp.txt"; QTest::newRow("absFilePath") << "/home/andy/tmp.txt" << "tmp.txt";
#endif #endif
@ -698,6 +702,10 @@ void tst_QFileInfo::dir_data()
QTest::newRow("absFilePath") << QDir::currentPath() + "/tmp.txt" << false << QDir::currentPath(); QTest::newRow("absFilePath") << QDir::currentPath() + "/tmp.txt" << false << QDir::currentPath();
QTest::newRow("absFilePathAbsPath") << QDir::currentPath() + "/tmp.txt" << true << QDir::currentPath(); QTest::newRow("absFilePathAbsPath") << QDir::currentPath() + "/tmp.txt" << true << QDir::currentPath();
QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << true << ":/tst_qfileinfo/resources"; QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << true << ":/tst_qfileinfo/resources";
#ifdef Q_OS_WIN
QTest::newRow("driveWithSlash") << "C:/file1.ext1.ext2" << true << "C:/";
QTest::newRow("driveWithoutSlash") << QDir::currentPath().left(2) + "file1.ext1.ext2" << false << QDir::currentPath();
#endif
} }
void tst_QFileInfo::dir() void tst_QFileInfo::dir()
@ -739,6 +747,10 @@ void tst_QFileInfo::suffix_data()
QTest::newRow("hidden2") << ".ex.ext2" << "ext2"; QTest::newRow("hidden2") << ".ex.ext2" << "ext2";
QTest::newRow("hidden2") << ".e.ext2" << "ext2"; QTest::newRow("hidden2") << ".e.ext2" << "ext2";
QTest::newRow("hidden2") << "..ext2" << "ext2"; QTest::newRow("hidden2") << "..ext2" << "ext2";
#ifdef Q_OS_WIN
QTest::newRow("driveWithSlash") << "c:/file1.ext1.ext2" << "ext2";
QTest::newRow("driveWithoutSlash") << "c:file1.ext1.ext2" << "ext2";
#endif
} }
void tst_QFileInfo::suffix() void tst_QFileInfo::suffix()
@ -764,6 +776,10 @@ void tst_QFileInfo::completeSuffix_data()
QTest::newRow("data3") << "/path/file.tar" << "tar"; QTest::newRow("data3") << "/path/file.tar" << "tar";
QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << "ext1"; QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << "ext1";
QTest::newRow("resource2") << ":/tst_qfileinfo/resources/file1.ext1.ext2" << "ext1.ext2"; QTest::newRow("resource2") << ":/tst_qfileinfo/resources/file1.ext1.ext2" << "ext1.ext2";
#ifdef Q_OS_WIN
QTest::newRow("driveWithSlash") << "c:/file1.ext1.ext2" << "ext1.ext2";
QTest::newRow("driveWithoutSlash") << "c:file1.ext1.ext2" << "ext1.ext2";
#endif
} }
void tst_QFileInfo::completeSuffix() void tst_QFileInfo::completeSuffix()
@ -787,6 +803,10 @@ void tst_QFileInfo::baseName_data()
QTest::newRow("data4") << "/path/file" << "file"; QTest::newRow("data4") << "/path/file" << "file";
QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << "file1"; QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << "file1";
QTest::newRow("resource2") << ":/tst_qfileinfo/resources/file1.ext1.ext2" << "file1"; QTest::newRow("resource2") << ":/tst_qfileinfo/resources/file1.ext1.ext2" << "file1";
#ifdef Q_OS_WIN
QTest::newRow("driveWithSlash") << "c:/file1.ext1.ext2" << "file1";
QTest::newRow("driveWithoutSlash") << "c:file1.ext1.ext2" << "file1";
#endif
} }
void tst_QFileInfo::baseName() void tst_QFileInfo::baseName()
@ -810,6 +830,10 @@ void tst_QFileInfo::completeBaseName_data()
QTest::newRow("data4") << "/path/file" << "file"; QTest::newRow("data4") << "/path/file" << "file";
QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << "file1"; QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << "file1";
QTest::newRow("resource2") << ":/tst_qfileinfo/resources/file1.ext1.ext2" << "file1.ext1"; QTest::newRow("resource2") << ":/tst_qfileinfo/resources/file1.ext1.ext2" << "file1.ext1";
#ifdef Q_OS_WIN
QTest::newRow("driveWithSlash") << "c:/file1.ext1.ext2" << "file1.ext1";
QTest::newRow("driveWithoutSlash") << "c:file1.ext1.ext2" << "file1.ext1";
#endif
} }
void tst_QFileInfo::completeBaseName() void tst_QFileInfo::completeBaseName()
@ -1684,7 +1708,7 @@ void tst_QFileInfo::owner()
dwPrefMaxLen, &dwEntriesRead, &dwTotalEntries); dwPrefMaxLen, &dwEntriesRead, &dwTotalEntries);
// Check if the current user is a member of Administrators group // Check if the current user is a member of Administrators group
if (nStatus == NERR_Success && pBuf){ if (nStatus == NERR_Success && pBuf){
for (int i = 0; i < dwEntriesRead; i++) { for (int i = 0; i < (int)dwEntriesRead; i++) {
QString groupName = QString::fromWCharArray(pBuf[i].lgrui0_name); QString groupName = QString::fromWCharArray(pBuf[i].lgrui0_name);
if (!groupName.compare(QLatin1String("Administrators"))) if (!groupName.compare(QLatin1String("Administrators")))
userName = groupName; userName = groupName;