summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPrasanth Ullattil <prasanth.ullattil@nokia.com>2010-09-17 15:04:27 +0200
committerPrasanth Ullattil <prasanth.ullattil@nokia.com>2010-09-17 16:00:21 +0200
commit206f49020bce11e142c4290b6655ac7c15592b43 (patch)
tree07c55b419f57a9bd6a0af71ddc79ef9309a58fa8
parent3df81c23e6ab7dae949315a4f0ca4e54469ab2bf (diff)
Differntiate different types of absolute paths on windows.
QFileSystemEntry now differentiates between various types of absolute paths on Windows and Symbian. The new behavior is shown the table below. Anybody who uses this class should NOT treat that !isRelative() == isAbsolute(). The differentiation is puerly for internal use by the windows and symbian implementations of QFileSystemEngine. |============================================| |Filename isRelative isAbsolute | |============================================| | Somefile.txt 1 0 | | Some/file.txt 1 0 | | a:Somefile.txt 0 0 | | /Somefile.txt 0 0 | | a:/somefile.txt 0 1 | | //abc/somefile.txt 0 1 | |============================================| Reviewed-by: Joao Reviewed-by: Shane Kearns
-rw-r--r--src/corelib/io/qfilesystemengine_symbian.cpp2
-rw-r--r--src/corelib/io/qfilesystemengine_win.cpp20
-rw-r--r--src/corelib/io/qfilesystementry.cpp30
-rw-r--r--src/corelib/io/qfilesystementry_p.h4
-rw-r--r--tests/auto/qfilesystementry/tst_qfilesystementry.cpp47
5 files changed, 74 insertions, 29 deletions
diff --git a/src/corelib/io/qfilesystemengine_symbian.cpp b/src/corelib/io/qfilesystemengine_symbian.cpp
index 02b4c48572..b4f0f88451 100644
--- a/src/corelib/io/qfilesystemengine_symbian.cpp
+++ b/src/corelib/io/qfilesystemengine_symbian.cpp
@@ -114,7 +114,7 @@ QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
const bool isDriveRelative = (orig.size() > 2 && orig.at(1).unicode() == ':' && orig.at(2).unicode() != '/');
const bool isDirty = (orig.contains(QLatin1String("/../")) || orig.contains(QLatin1String("/./")) ||
orig.endsWith(QLatin1String("/..")) || orig.endsWith(QLatin1String("/.")));
- const bool isAbsolute = entry.isAbsolute();
+ const bool isAbsolute = !entry.isRelative();
if (isAbsolute &&
!(needsDrive || isDriveLetter || isDriveRelative || isDirty))
return entry;
diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp
index 8526cf2571..119ed7cde6 100644
--- a/src/corelib/io/qfilesystemengine_win.cpp
+++ b/src/corelib/io/qfilesystemengine_win.cpp
@@ -545,18 +545,18 @@ QFileSystemEntry QFileSystemEngine::absoluteName(const QFileSystemEntry &entry)
if (!entry.isRelative()) {
#if !defined(Q_OS_WINCE)
- if (entry.filePath().startsWith(QLatin1Char('/')) || // It's a absolute path to the current drive, so \a.txt -> Z:\a.txt
- entry.filePath().size() == 2 || // It's a drive letter that needs to get a working dir appended
- (entry.filePath().size() > 2 && entry.filePath().at(2) != QLatin1Char('/')) || // It's a drive-relative path, so Z:a.txt -> Z:\currentpath\a.txt
- entry.filePath().contains(QLatin1String("/../")) || entry.filePath().contains(QLatin1String("/./")) ||
- entry.filePath().endsWith(QLatin1String("/..")) || entry.filePath().endsWith(QLatin1String("/.")))
- {
- ret = QDir::fromNativeSeparators(nativeAbsoluteFilePath(entry.filePath()));
- } else
-#endif
- {
+ if (entry.isAbsolute()
+ && !entry.filePath().contains(QLatin1String("/../"))
+ && !entry.filePath().contains(QLatin1String("/./"))
+ && !entry.filePath().endsWith(QLatin1String("/.."))
+ && !entry.filePath().endsWith(QLatin1String("/."))) {
ret = entry.filePath();
+ } else {
+ ret = QDir::fromNativeSeparators(nativeAbsoluteFilePath(entry.filePath()));
}
+#else
+ ret = entry.filePath();
+#endif
} else {
ret = QDir::cleanPath(QDir::currentPath() + QLatin1Char('/') + entry.filePath());
}
diff --git a/src/corelib/io/qfilesystementry.cpp b/src/corelib/io/qfilesystementry.cpp
index 733a22601e..10b59fdacb 100644
--- a/src/corelib/io/qfilesystementry.cpp
+++ b/src/corelib/io/qfilesystementry.cpp
@@ -225,17 +225,33 @@ QString QFileSystemEntry::completeSuffix() const
return m_filePath.mid(qMax((qint16)0, m_lastSeparator) + m_firstDotInFileName + 1);
}
+#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
+bool QFileSystemEntry::isRelative() const
+{
+ resolveFilePath();
+ return (m_filePath.isEmpty() || (!m_filePath.isEmpty() && (m_filePath[0].unicode() != '/')
+ && (!(m_filePath.length() >= 2 && m_filePath[1].unicode() == ':'))));
+}
+
bool QFileSystemEntry::isAbsolute() const
{
resolveFilePath();
- return (!m_filePath.isEmpty() && (m_filePath[0].unicode() == '/')
-#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
- || (m_filePath.length() >= 2
- && ((m_filePath[0].isLetter() && m_filePath[1].unicode() == ':')
- || (m_filePath.at(0) == QLatin1Char('/') && m_filePath.at(1) == QLatin1Char('/'))))
-#endif
- );
+ return (!m_filePath.isEmpty() && ((m_filePath.length() >= 3
+ && (m_filePath[0].isLetter() && m_filePath[1].unicode() == ':' && m_filePath[2].unicode() == '/'))
+ || (m_filePath.length() >= 2 && (m_filePath.at(0) == QLatin1Char('/') && m_filePath.at(1) == QLatin1Char('/')))));
+}
+#else
+bool QFileSystemEntry::isRelative() const
+{
+ return !isAbsolute();
+}
+
+bool QFileSystemEntry::isAbsolute() const
+{
+ resolveFilePath();
+ return (!m_filePath.isEmpty() && (m_filePath[0].unicode() == '/'));
}
+#endif
#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
bool QFileSystemEntry::isDriveRoot() const
diff --git a/src/corelib/io/qfilesystementry_p.h b/src/corelib/io/qfilesystementry_p.h
index 5a41782336..7a9c2a5a3a 100644
--- a/src/corelib/io/qfilesystementry_p.h
+++ b/src/corelib/io/qfilesystementry_p.h
@@ -88,9 +88,7 @@ public:
QString suffix() const;
QString completeSuffix() const;
bool isAbsolute() const;
- bool isRelative() const {
- return !isAbsolute();
- }
+ bool isRelative() const;
#if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
bool isDriveRoot() const;
diff --git a/tests/auto/qfilesystementry/tst_qfilesystementry.cpp b/tests/auto/qfilesystementry/tst_qfilesystementry.cpp
index 49afab6000..4375f9950a 100644
--- a/tests/auto/qfilesystementry/tst_qfilesystementry.cpp
+++ b/tests/auto/qfilesystementry/tst_qfilesystementry.cpp
@@ -64,6 +64,10 @@ private slots:
void baseName();
void completeBaseName_data();
void completeBaseName();
+#if defined(WIN_STUFF)
+ void absoluteOrRelative_data();
+ void absoluteOrRelative();
+#endif
};
#if defined(WIN_STUFF)
@@ -78,6 +82,7 @@ void tst_QFileSystemEntry::getSetCheck_data()
QTest::addColumn<QString>("suffix");
QTest::addColumn<QString>("completeSuffix");
QTest::addColumn<bool>("absolute");
+ QTest::addColumn<bool>("relative");
QString absPrefix = QLatin1String("\\\\?\\");
QString relPrefix = absPrefix
@@ -88,33 +93,33 @@ void tst_QFileSystemEntry::getSetCheck_data()
<< QString("A:\\home\\qt\\in\\a\\dir.tar.gz")
<< absPrefix + QString("A:\\home\\qt\\in\\a\\dir.tar.gz")
<< "A:/home/qt/in/a/dir.tar.gz"
- << "dir.tar.gz" << "dir" << "dir.tar" << "gz" << "tar.gz" << true;
+ << "dir.tar.gz" << "dir" << "dir.tar" << "gz" << "tar.gz" << true << false;
QTest::newRow("relative")
<< QString("in\\a\\dir.tar.gz")
<< relPrefix + QString("in\\a\\dir.tar.gz")
<< "in/a/dir.tar.gz"
- << "dir.tar.gz" << "dir" << "dir.tar" << "gz" << "tar.gz" << false;
+ << "dir.tar.gz" << "dir" << "dir.tar" << "gz" << "tar.gz" << false <<true;
QTest::newRow("noSuffix")
<< QString("myDir\\myfile")
<< relPrefix + QString("myDir\\myfile")
- << "myDir/myfile" << "myfile" << "myfile" << "myfile" << "" << "" << false;
+ << "myDir/myfile" << "myfile" << "myfile" << "myfile" << "" << "" << false <<true;
QTest::newRow("noLongSuffix")
<< QString("myDir\\myfile.txt")
<< relPrefix + QString("myDir\\myfile.txt")
- << "myDir/myfile.txt" << "myfile.txt" << "myfile" << "myfile" << "txt" << "txt" << false;
+ << "myDir/myfile.txt" << "myfile.txt" << "myfile" << "myfile" << "txt" << "txt" << false << true;
QTest::newRow("endingSlash")
<< QString("myDir\\myfile.bla\\")
<< relPrefix + QString("myDir\\myfile.bla\\")
- << "myDir/myfile.bla/" << "" << "" << "" << "" << "" << false;
+ << "myDir/myfile.bla/" << "" << "" << "" << "" << "" << false << true;
QTest::newRow("absolutePath")
<< QString("A:dir\\without\\leading\\backslash.bat")
<< absPrefix + QString("A:\\dir\\without\\leading\\backslash.bat")
- << "A:dir/without/leading/backslash.bat" << "backslash.bat" << "backslash" << "backslash" << "bat" << "bat" << true;
+ << "A:dir/without/leading/backslash.bat" << "backslash.bat" << "backslash" << "backslash" << "bat" << "bat" << false << false;
}
void tst_QFileSystemEntry::getSetCheck()
@@ -128,6 +133,7 @@ void tst_QFileSystemEntry::getSetCheck()
QFETCH(QString, suffix);
QFETCH(QString, completeSuffix);
QFETCH(bool, absolute);
+ QFETCH(bool, relative);
QFileSystemEntry entry1(filepath);
QCOMPARE(entry1.filePath(), filepath);
@@ -136,7 +142,7 @@ void tst_QFileSystemEntry::getSetCheck()
QCOMPARE(entry1.suffix(), suffix);
QCOMPARE(entry1.completeSuffix(), completeSuffix);
QCOMPARE(entry1.isAbsolute(), absolute);
- QCOMPARE(entry1.isRelative(), !absolute);
+ QCOMPARE(entry1.isRelative(), relative);
QCOMPARE(entry1.baseName(), baseName);
QCOMPARE(entry1.completeBaseName(), completeBasename);
@@ -144,7 +150,7 @@ void tst_QFileSystemEntry::getSetCheck()
QCOMPARE(entry2.suffix(), suffix);
QCOMPARE(entry2.completeSuffix(), completeSuffix);
QCOMPARE(entry2.isAbsolute(), absolute);
- QCOMPARE(entry2.isRelative(), !absolute);
+ QCOMPARE(entry2.isRelative(), relative);
QCOMPARE(entry2.filePath(), filepath);
// Since this entry was created using the native path,
// the object shouldnot change nativeFilePath.
@@ -351,6 +357,31 @@ void tst_QFileSystemEntry::completeBaseName()
QCOMPARE(fi2.completeBaseName(), expected);
}
+#if defined(WIN_STUFF)
+void tst_QFileSystemEntry::absoluteOrRelative_data()
+{
+ QTest::addColumn<QString>("path");
+ QTest::addColumn<bool>("isAbsolute");
+ QTest::addColumn<bool>("isRelative");
+
+ QTest::newRow("data0") << "file.tar" << false << true;
+ QTest::newRow("data1") << "/path/file/file.tar.gz" << false << false;
+ QTest::newRow("data1") << "C:path/file/file.tar.gz" << false << false;
+ QTest::newRow("data3") << "C:/path/file" << true << false;
+ QTest::newRow("data3") << "//machine/share" << true << false;
+}
+
+void tst_QFileSystemEntry::absoluteOrRelative()
+{
+ QFETCH(QString, path);
+ QFETCH(bool, isAbsolute);
+ QFETCH(bool, isRelative);
+
+ QFileSystemEntry fi(path);
+ QCOMPARE(fi.isAbsolute(), isAbsolute);
+ QCOMPARE(fi.isRelative(), isRelative);
+}
+#endif
QTEST_MAIN(tst_QFileSystemEntry)
#include <tst_qfilesystementry.moc>