Fix cases where functions are called with a drive and no slash
authorAndy Shaw <andy.shaw@digia.com>
Tue, 17 Apr 2012 18:30:54 +0000 (20:30 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 16 May 2012 02:24:29 +0000 (04:24 +0200)
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>
src/corelib/io/qfilesystementry.cpp
tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp

index 46881a1..032a5bd 100644 (file)
@@ -189,7 +189,7 @@ QString QFileSystemEntry::path() const
     if (m_lastSeparator == -1) {
 #if defined(Q_OS_WIN)
         if (m_filePath.length() >= 2 && m_filePath.at(1) == QLatin1Char(':'))
-            return m_filePath.left(2);
+            return QFSFileEngine::currentPath(m_filePath.left(2));
 #endif
         return QString(QLatin1Char('.'));
     }
@@ -205,32 +205,32 @@ QString QFileSystemEntry::path() const
 QString QFileSystemEntry::baseName() const
 {
     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;
     if (m_firstDotInFileName >= 0) {
         length = m_firstDotInFileName;
         if (m_lastSeparator != -1) // avoid off by one
             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);
 }
 
 QString QFileSystemEntry::completeBaseName() const
 {
     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;
     if (m_firstDotInFileName >= 0) {
         length = m_firstDotInFileName + m_lastDotInFileName;
         if (m_lastSeparator != -1) // avoid off by one
             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);
 }
 
index 797d5ff..ab5f948 100644 (file)
@@ -460,6 +460,8 @@ void tst_QFileInfo::absolutePath_data()
 #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
     QTest::newRow("c:\\autoexec.bat") << "c:\\autoexec.bat" << "C:/"
                                       << "autoexec.bat";
+    QTest::newRow("c:autoexec.bat") << QDir::currentPath().left(2) + "autoexec.bat" << QDir::currentPath()
+                                    << "autoexec.bat";
 #endif
     QTest::newRow("QTBUG-19995.1") << drivePrefix + "/System/Library/StartupItems/../Frameworks"
                                    << drivePrefix + "/System/Library"
@@ -500,6 +502,7 @@ void tst_QFileInfo::absFilePath_data()
     QString nonCurrentDrivePrefix =
         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("<not current drive>: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";
 #if (defined(Q_OS_WIN) && !defined(Q_OS_WINCE))
     QTest::newRow("absFilePath") << "c:\\home\\andy\\tmp.txt" << "tmp.txt";
+    QTest::newRow("driveWithNoSlash") << "c:tmp.txt" << "tmp.txt";
 #else
     QTest::newRow("absFilePath") << "/home/andy/tmp.txt" << "tmp.txt";
 #endif
@@ -698,6 +702,10 @@ void tst_QFileInfo::dir_data()
     QTest::newRow("absFilePath") << QDir::currentPath() + "/tmp.txt" << false << QDir::currentPath();
     QTest::newRow("absFilePathAbsPath") << QDir::currentPath() + "/tmp.txt" << true << QDir::currentPath();
     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()
@@ -739,6 +747,10 @@ void tst_QFileInfo::suffix_data()
     QTest::newRow("hidden2") << ".ex.ext2" << "ext2";
     QTest::newRow("hidden2") << ".e.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()
@@ -764,6 +776,10 @@ void tst_QFileInfo::completeSuffix_data()
     QTest::newRow("data3") << "/path/file.tar" << "tar";
     QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << "ext1";
     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()
@@ -787,6 +803,10 @@ void tst_QFileInfo::baseName_data()
     QTest::newRow("data4") << "/path/file" << "file";
     QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << "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()
@@ -810,6 +830,10 @@ void tst_QFileInfo::completeBaseName_data()
     QTest::newRow("data4") << "/path/file" << "file";
     QTest::newRow("resource1") << ":/tst_qfileinfo/resources/file1.ext1" << "file1";
     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()
@@ -1684,7 +1708,7 @@ void tst_QFileInfo::owner()
                                             dwPrefMaxLen, &dwEntriesRead, &dwTotalEntries);
             // Check if the current user is a member of Administrators group
             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);
                     if (!groupName.compare(QLatin1String("Administrators")))
                         userName = groupName;