diff options
author | João Abecasis <joao.abecasis@nokia.com> | 2011-03-09 18:46:08 (GMT) |
---|---|---|
committer | João Abecasis <joao.abecasis@nokia.com> | 2011-03-18 11:09:04 (GMT) |
commit | c7748b7838522ec38ec01423f1267acf1f163606 (patch) | |
tree | 5dc7dab7b4743dfea0cec406d20a6d86466038ac | |
parent | 5134b700b7311e39b25bd783f213e374de5efaaa (diff) | |
download | Qt-c7748b7838522ec38ec01423f1267acf1f163606.zip Qt-c7748b7838522ec38ec01423f1267acf1f163606.tar.gz Qt-c7748b7838522ec38ec01423f1267acf1f163606.tar.bz2 |
QDir: Fix absolute paths when using file engines
QFileSystemEntry doesn't know about paths as implemented by custom file
engines, such as is the case with resource files. In such cases, we need
to allow the engine to make the relative to absolute conversion.
Expanded QDir's test case to ensure resource paths are considered in
more places.
Task-number: QTBUG-17921
Reviewed-by: Prasanth Ullattil
-rw-r--r-- | src/corelib/io/qdir.cpp | 15 | ||||
-rw-r--r-- | tests/auto/qdir/tst_qdir.cpp | 20 |
2 files changed, 31 insertions, 4 deletions
diff --git a/src/corelib/io/qdir.cpp b/src/corelib/io/qdir.cpp index 42f1652..166513a 100644 --- a/src/corelib/io/qdir.cpp +++ b/src/corelib/io/qdir.cpp @@ -196,12 +196,19 @@ inline void QDirPrivate::resolveAbsoluteEntry() const if (!absoluteDirEntry.isEmpty() || dirEntry.isEmpty()) return; - if (dirEntry.isRelative()) { - QFileSystemEntry answer = QFileSystemEngine::absoluteName(dirEntry); - absoluteDirEntry = QFileSystemEntry(QDir::cleanPath(answer.filePath()), QFileSystemEntry::FromInternalPath()); + QString absoluteName; + if (fileEngine.isNull()) { + if (!dirEntry.isRelative()) { + absoluteDirEntry = dirEntry; + return; + } + + absoluteName = QFileSystemEngine::absoluteName(dirEntry).filePath(); } else { - absoluteDirEntry = dirEntry; + absoluteName = fileEngine->fileName(QAbstractFileEngine::AbsoluteName); } + + absoluteDirEntry = QFileSystemEntry(QDir::cleanPath(absoluteName), QFileSystemEntry::FromInternalPath()); } /* For sorting */ diff --git a/tests/auto/qdir/tst_qdir.cpp b/tests/auto/qdir/tst_qdir.cpp index 2fa0c24..04f7fa9 100644 --- a/tests/auto/qdir/tst_qdir.cpp +++ b/tests/auto/qdir/tst_qdir.cpp @@ -420,6 +420,9 @@ void tst_QDir::isRelativePath_data() #endif QTest::newRow("data2") << "somedir" << true; QTest::newRow("data3") << "/somedir" << false; + + QTest::newRow("resource0") << ":/prefix" << false; + QTest::newRow("resource1") << ":/prefix/foo.bar" << false; } void tst_QDir::isRelativePath() @@ -868,6 +871,8 @@ void tst_QDir::canonicalPath_data() QTest::newRow("drive:\\..\\..") << QDir::toNativeSeparators(QDir::rootPath().append("../..")) << QDir::rootPath(); QTest::newRow("drive:") << QDir().canonicalPath().left(2) << QDir().canonicalPath(); #endif + + QTest::newRow("resource") << ":/tst_qdir/resources/entryList" << ":/tst_qdir/resources/entryList"; } void tst_QDir::canonicalPath() @@ -1061,6 +1066,9 @@ tst_QDir::cleanPath_data() QTest::newRow("data10") << "/:/" << "/:"; #endif #endif + + QTest::newRow("resource0") << ":/prefix/foo.bar" << ":/prefix/foo.bar"; + QTest::newRow("resource1") << "://prefix/..//prefix/foo.bar" << ":/prefix/foo.bar"; } @@ -1084,6 +1092,7 @@ void tst_QDir::absoluteFilePath_data() QTest::newRow("2") << "/" << "passwd" << "/passwd"; QTest::newRow("3") << "relative" << "path" << QDir::currentPath() + "/relative/path"; QTest::newRow("4") << "" << "" << QDir::currentPath(); + QTest::newRow("resource") << ":/prefix" << "foo.bar" << ":/prefix/foo.bar"; } void tst_QDir::absoluteFilePath() @@ -1112,6 +1121,7 @@ void tst_QDir::absolutePath_data() QTest::newRow("4") << "c:/machine/share/dir1" << "c:/machine/share/dir1"; QTest::newRow("5") << "c:\\machine\\share\\dir1" << "c:/machine/share/dir1"; #endif + QTest::newRow("resource") << ":/prefix/foo.bar" << ":/prefix/foo.bar"; } void tst_QDir::absolutePath() @@ -1171,6 +1181,9 @@ void tst_QDir::relativeFilePath_data() QTest::newRow("33") << "//anotherHost/foo" << "C:/foo/bar" << "C:/foo/bar"; # endif #endif + + QTest::newRow("resource0") << ":/prefix" << "foo.bar" << "foo.bar"; + QTest::newRow("resource1") << ":/prefix" << ":/prefix/foo.bar" << "foo.bar"; } void tst_QDir::relativeFilePath() @@ -1193,6 +1206,7 @@ void tst_QDir::filePath_data() QTest::newRow("2") << "/" << "passwd" << "/passwd"; QTest::newRow("3") << "relative" << "path" << "relative/path"; QTest::newRow("4") << "" << "" << "."; + QTest::newRow("resource") << ":/prefix" << "foo.bar" << ":/prefix/foo.bar"; } void tst_QDir::filePath() @@ -1255,6 +1269,8 @@ void tst_QDir::exists2_data() QTest::newRow("4") << "/testData" << false; QTest::newRow("5") << "tst_qdir.cpp" << true; QTest::newRow("6") << "/resources.cpp" << false; + QTest::newRow("resource0") << ":/prefix/foo.bar" << false; + QTest::newRow("resource1") << ":/tst_qdir/resources/entryList/file1.data" << true; } void tst_QDir::exists2() @@ -1291,6 +1307,8 @@ void tst_QDir::dirName_data() QTest::newRow("bslash1") << "\\winnt\\system32" << "system32"; QTest::newRow("bslash2") << "c:\\winnt\\system32\\kernel32.dll" << "kernel32.dll"; #endif + + QTest::newRow("resource") << ":/prefix" << "prefix"; } void tst_QDir::dirName() @@ -1961,6 +1979,8 @@ void tst_QDir::isRelative_data() foreach (QFileInfo root, QDir::drives()) { QTest::newRow(root.absolutePath().toLocal8Bit()) << root.absolutePath() << false; } + + QTest::newRow("resource") << ":/prefix" << false; } void tst_QDir::isRelative() |