diff options
author | David Faure <faure@kde.org> | 2013-04-29 00:09:23 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-07-26 04:47:18 +0200 |
commit | 1aa4ad46e4878072be9acb8389572e7f9e8198df (patch) | |
tree | 36a40496b3a58ef31a765a18248d2b9aa0483989 /src/corelib | |
parent | 15b45c608fce1845e7f8c61edaeb35f0acc11ed9 (diff) |
QUrl: add matches(url, options) method.
Change-Id: I534f494aecc48cc2accfcfcb692f35046250b493
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/io/qurl.cpp | 69 | ||||
-rw-r--r-- | src/corelib/io/qurl.h | 2 |
2 files changed, 71 insertions, 0 deletions
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index f8a8bd18e3..30933b32a6 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -3435,6 +3435,75 @@ bool QUrl::operator ==(const QUrl &url) const } /*! + \since 5.2 + + Returns true if this URL and the given \a url are equal after + applying \a options to both; otherwise returns false. + + This is equivalent to calling adjusted(options) on both URLs + and comparing the resulting urls, but faster. + +*/ +bool QUrl::matches(const QUrl &url, FormattingOptions options) const +{ + if (!d && !url.d) + return true; + if (!d) + return url.d->isEmpty(); + if (!url.d) + return d->isEmpty(); + + // Compare which sections are present, but ignore Host + // which is set by parsing but not by construction, when empty. + int mask = QUrlPrivate::FullUrl & ~QUrlPrivate::Host; + + if (options & QUrl::RemoveScheme) + mask &= ~QUrlPrivate::Scheme; + else if (d->scheme != url.d->scheme) + return false; + + if (options & QUrl::RemovePassword) + mask &= ~QUrlPrivate::Password; + else if (d->password != url.d->password) + return false; + + if (options & QUrl::RemoveUserInfo) + mask &= ~QUrlPrivate::UserName; + else if (d->userName != url.d->userName) + return false; + + if (options & QUrl::RemovePort) + mask &= ~QUrlPrivate::Port; + else if (d->port != url.d->port) + return false; + + if (options & QUrl::RemoveAuthority) + mask &= ~QUrlPrivate::Host; + else if (d->host != url.d->host) + return false; + + if (options & QUrl::RemoveQuery) + mask &= ~QUrlPrivate::Query; + else if (d->query != url.d->query) + return false; + + if (options & QUrl::RemoveFragment) + mask &= ~QUrlPrivate::Fragment; + else if (d->fragment != url.d->fragment) + return false; + + if (!(d->sectionIsPresent & mask) == (url.d->sectionIsPresent & mask)) + return false; + + // Compare paths, after applying path-related options + QString path1; + d->appendPath(path1, options, QUrlPrivate::Path); + QString path2; + url.d->appendPath(path2, options, QUrlPrivate::Path); + return path1 == path2; +} + +/*! Returns true if this URL and the given \a url are not equal; otherwise returns false. */ diff --git a/src/corelib/io/qurl.h b/src/corelib/io/qurl.h index 3018f6d0e4..457440bb89 100644 --- a/src/corelib/io/qurl.h +++ b/src/corelib/io/qurl.h @@ -251,6 +251,8 @@ public: bool operator ==(const QUrl &url) const; bool operator !=(const QUrl &url) const; + bool matches(const QUrl &url, FormattingOptions options) const; + static QString fromPercentEncoding(const QByteArray &); static QByteArray toPercentEncoding(const QString &, const QByteArray &exclude = QByteArray(), |