diff options
author | Matthew Vogt <matthew.vogt@nokia.com> | 2012-04-20 14:50:03 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-26 03:33:13 +0200 |
commit | f29c5732f6dbb2c928a088bb14dfb63b600ca9c8 (patch) | |
tree | 938ab6533d309abcc706369680248db31a6a3da3 /src/qml/qml/qqmlimport.cpp | |
parent | 1d0368335d25b70d3cecbbcea224feb9ac0d6e59 (diff) |
Remove relative directory elements in import paths
Avoid unnecessary conversions to/from QUrl.
Change-Id: If52e78cfdaf4fe344f34d961e300b21dd4a11fb2
Reviewed-by: Michael Brasser <michael.brasser@nokia.com>
Reviewed-by: Chris Adams <christopher.adams@nokia.com>
Diffstat (limited to 'src/qml/qml/qqmlimport.cpp')
-rw-r--r-- | src/qml/qml/qqmlimport.cpp | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp index 90228f170b..a8a3ed0a4b 100644 --- a/src/qml/qml/qqmlimport.cpp +++ b/src/qml/qml/qqmlimport.cpp @@ -63,9 +63,6 @@ static bool greaterThan(const QString &s1, const QString &s2) QString resolveLocalUrl(const QString &url, const QString &relative) { - return QUrl(url).resolved(QUrl(relative)).toString(); - - //XXX Find out why this broke with new QUrl. if (relative.contains(QLatin1Char(':'))) { // contains a host name return QUrl(url).resolved(QUrl(relative)).toString(); @@ -74,11 +71,41 @@ QString resolveLocalUrl(const QString &url, const QString &relative) } else if (relative.at(0) == QLatin1Char('/') || !url.contains(QLatin1Char('/'))) { return relative; } else { + QString base(url.left(url.lastIndexOf(QLatin1Char('/')) + 1)); + if (relative == QLatin1String(".")) - return url.left(url.lastIndexOf(QLatin1Char('/')) + 1); - else if (relative.startsWith(QLatin1String("./"))) - return url.left(url.lastIndexOf(QLatin1Char('/')) + 1) + relative.mid(2); - return url.left(url.lastIndexOf(QLatin1Char('/')) + 1) + relative; + return base; + + base.append(relative); + + // Remove any relative directory elements in the path + const QLatin1Char dot('.'); + const QLatin1Char slash('/'); + + int length = base.length(); + int index = 0; + while ((index = base.indexOf(QLatin1String("/."), index)) != -1) { + if ((length > (index + 2)) && (base.at(index + 2) == dot) && + (length == (index + 3) || (base.at(index + 3) == slash))) { + // Either "/../" or "/..<END>" + int previous = base.lastIndexOf(slash, index - 1); + if (previous == -1) + break; + + int removeLength = (index - previous) + 3; + base.remove(previous + 1, removeLength); + length -= removeLength; + index = previous; + } else if ((length == (index + 2)) || (base.at(index + 2) == slash)) { + // Either "/./" or "/.<END>" + base.remove(index, 2); + length -= 2; + } else { + ++index; + } + } + + return base; } } |