diff options
Diffstat (limited to 'src/corelib/io/qurl.h')
-rw-r--r-- | src/corelib/io/qurl.h | 298 |
1 files changed, 214 insertions, 84 deletions
diff --git a/src/corelib/io/qurl.h b/src/corelib/io/qurl.h index 3e5c62cd7c..7c6e47c73f 100644 --- a/src/corelib/io/qurl.h +++ b/src/corelib/io/qurl.h @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Intel Corporation. ** Contact: http://www.qt-project.org/ ** ** This file is part of the QtCore module of the Qt Toolkit. @@ -44,18 +45,74 @@ #include <QtCore/qbytearray.h> #include <QtCore/qobjectdefs.h> -#include <QtCore/qpair.h> #include <QtCore/qstring.h> -#include <QtCore/qhash.h> +#include <QtCore/qlist.h> +#include <QtCore/qpair.h> +#include <QtCore/qglobal.h> QT_BEGIN_HEADER QT_BEGIN_NAMESPACE +class QUrlQuery; class QUrlPrivate; class QDataStream; +template <typename E1, typename E2> +class QUrlTwoFlags +{ + int i; + typedef int QUrlTwoFlags:: *Zero; +public: + Q_DECL_CONSTEXPR inline QUrlTwoFlags(E1 f) : i(f) {} + Q_DECL_CONSTEXPR inline QUrlTwoFlags(E2 f) : i(f) {} + Q_DECL_CONSTEXPR inline QUrlTwoFlags(QFlag f) : i(f) {} + Q_DECL_CONSTEXPR inline QUrlTwoFlags(QFlags<E1> f) : i(f.operator int()) {} + Q_DECL_CONSTEXPR inline QUrlTwoFlags(QFlags<E2> f) : i(f.operator int()) {} + Q_DECL_CONSTEXPR inline QUrlTwoFlags(Zero = 0) : i(0) {} + + inline QUrlTwoFlags &operator&=(int mask) { i &= mask; return *this; } + inline QUrlTwoFlags &operator&=(uint mask) { i &= mask; return *this; } + inline QUrlTwoFlags &operator|=(QUrlTwoFlags f) { i |= f.i; return *this; } + inline QUrlTwoFlags &operator|=(E1 f) { i |= f; return *this; } + inline QUrlTwoFlags &operator|=(E2 f) { i |= f; return *this; } + inline QUrlTwoFlags &operator^=(QUrlTwoFlags f) { i ^= f.i; return *this; } + inline QUrlTwoFlags &operator^=(E1 f) { i ^= f; return *this; } + inline QUrlTwoFlags &operator^=(E2 f) { i ^= f; return *this; } + + Q_DECL_CONSTEXPR inline operator QFlags<E1>() const { return E1(i); } + Q_DECL_CONSTEXPR inline operator QFlags<E2>() const { return E2(i); } + Q_DECL_CONSTEXPR inline operator int() const { return i; } + Q_DECL_CONSTEXPR inline bool operator!() const { return !i; } + + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator|(QUrlTwoFlags f) const + { return QUrlTwoFlags(E1(i | f.i)); } + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator|(E1 f) const + { return QUrlTwoFlags(E1(i | f)); } + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator|(E2 f) const + { return QUrlTwoFlags(E2(i | f)); } + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator^(QUrlTwoFlags f) const + { return QUrlTwoFlags(E1(i ^ f.i)); } + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator^(E1 f) const + { return QUrlTwoFlags(E1(i ^ f)); } + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator^(E2 f) const + { return QUrlTwoFlags(E2(i ^ f)); } + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator&(int mask) const + { return QUrlTwoFlags(E1(i & mask)); } + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator&(uint mask) const + { return QUrlTwoFlags(E1(i & mask)); } + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator&(E1 f) const + { return QUrlTwoFlags(E1(i & f)); } + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator&(E2 f) const + { return QUrlTwoFlags(E2(i & f)); } + Q_DECL_CONSTEXPR inline QUrlTwoFlags operator~() const + { return QUrlTwoFlags(E1(~i)); } + + inline bool testFlag(E1 f) const { return (i & f) == f && (f != 0 || i == int(f)); } + inline bool testFlag(E2 f) const { return (i & f) == f && (f != 0 || i == int(f)); } +}; + class Q_CORE_EXPORT QUrl { public: @@ -65,7 +122,7 @@ public: }; // encoding / toString values - enum FormattingOption { + enum UrlFormattingOption { None = 0x0, RemoveScheme = 0x1, RemovePassword = 0x2, @@ -75,23 +132,41 @@ public: RemovePath = 0x20, RemoveQuery = 0x40, RemoveFragment = 0x80, - // 0x100: private: normalized + // 0x100 was a private code in Qt 4, keep unused for a while + PreferLocalFile = 0x200, + StripTrailingSlash = 0x400 + }; - StripTrailingSlash = 0x10000 + enum ComponentFormattingOption { + PrettyDecoded = 0x000000, + EncodeSpaces = 0x100000, + EncodeUnicode = 0x200000, + EncodeDelimiters = 0x400000 | 0x800000, + EncodeReserved = 0x1000000, + DecodeReserved = 0x2000000, + + FullyEncoded = EncodeSpaces | EncodeUnicode | EncodeDelimiters | EncodeReserved, + MostDecoded = PrettyDecoded | DecodeReserved }; - Q_DECLARE_FLAGS(FormattingOptions, FormattingOption) + Q_DECLARE_FLAGS(ComponentFormattingOptions, ComponentFormattingOption) +#ifdef qdoc + Q_DECLARE_FLAGS(FormattingOptions, UrlFormattingOption) +#else + typedef QUrlTwoFlags<UrlFormattingOption, ComponentFormattingOption> FormattingOptions; +#endif QUrl(); -#ifdef QT_NO_URL_CAST_FROM_STRING - explicit -#endif - QUrl(const QString &url, ParsingMode mode = TolerantMode); QUrl(const QUrl ©); QUrl &operator =(const QUrl ©); -#ifndef QT_NO_URL_CAST_FROM_STRING - QUrl &operator =(const QString &url); +#ifdef QT_NO_URL_CAST_FROM_STRING + explicit QUrl(const QString &url, ParsingMode mode = TolerantMode); +#else + QUrl(const QString &url, ParsingMode mode = TolerantMode); + QUrl &operator=(const QString &url); #endif #ifdef Q_COMPILER_RVALUE_REFS + QUrl(QUrl &&other) : d(0) + { qSwap(d, other.d); } inline QUrl &operator=(QUrl &&other) { qSwap(d, other.d); return *this; } #endif @@ -100,96 +175,63 @@ public: inline void swap(QUrl &other) { qSwap(d, other.d); } void setUrl(const QString &url, ParsingMode mode = TolerantMode); - QString url(FormattingOptions options = None) const; - QString toString(FormattingOptions options = None) const; - QString toDisplayString(FormattingOptions options = None) const; + QString url(FormattingOptions options = FormattingOptions(PrettyDecoded)) const; + QString toString(FormattingOptions options = FormattingOptions(PrettyDecoded)) const; + QString toDisplayString(FormattingOptions options = FormattingOptions(PrettyDecoded)) const; + + QByteArray toEncoded(FormattingOptions options = FullyEncoded) const; + static QUrl fromEncoded(const QByteArray &url, ParsingMode mode = TolerantMode); + + static QUrl fromUserInput(const QString &userInput); bool isValid() const; + QString errorString() const; bool isEmpty() const; - void clear(); void setScheme(const QString &scheme); QString scheme() const; void setAuthority(const QString &authority); - QString authority() const; + QString authority(ComponentFormattingOptions options = PrettyDecoded) const; void setUserInfo(const QString &userInfo); - QString userInfo() const; + QString userInfo(ComponentFormattingOptions options = PrettyDecoded) const; void setUserName(const QString &userName); - QString userName() const; - void setEncodedUserName(const QByteArray &userName); - QByteArray encodedUserName() const; + QString userName(ComponentFormattingOptions options = PrettyDecoded) const; void setPassword(const QString &password); - QString password() const; - void setEncodedPassword(const QByteArray &password); - QByteArray encodedPassword() const; + QString password(ComponentFormattingOptions = PrettyDecoded) const; void setHost(const QString &host); - QString host() const; - void setEncodedHost(const QByteArray &host); - QByteArray encodedHost() const; + QString host(ComponentFormattingOptions = PrettyDecoded) const; + QString topLevelDomain(ComponentFormattingOptions options = PrettyDecoded) const; void setPort(int port); int port(int defaultPort = -1) const; void setPath(const QString &path); - QString path() const; - void setEncodedPath(const QByteArray &path); - QByteArray encodedPath() const; + QString path(ComponentFormattingOptions options = PrettyDecoded) const; bool hasQuery() const; + void setQuery(const QString &query); + void setQuery(const QUrlQuery &query); + QString query(ComponentFormattingOptions = PrettyDecoded) const; - void setEncodedQuery(const QByteArray &query); - QByteArray encodedQuery() const; - - void setQueryDelimiters(char valueDelimiter, char pairDelimiter); - char queryValueDelimiter() const; - char queryPairDelimiter() const; - - void setQueryItems(const QList<QPair<QString, QString> > &query); - void addQueryItem(const QString &key, const QString &value); - QList<QPair<QString, QString> > queryItems() const; - bool hasQueryItem(const QString &key) const; - QString queryItemValue(const QString &key) const; - QStringList allQueryItemValues(const QString &key) const; - void removeQueryItem(const QString &key); - void removeAllQueryItems(const QString &key); - - void setEncodedQueryItems(const QList<QPair<QByteArray, QByteArray> > &query); - void addEncodedQueryItem(const QByteArray &key, const QByteArray &value); - QList<QPair<QByteArray, QByteArray> > encodedQueryItems() const; - bool hasEncodedQueryItem(const QByteArray &key) const; - QByteArray encodedQueryItemValue(const QByteArray &key) const; - QList<QByteArray> allEncodedQueryItemValues(const QByteArray &key) const; - void removeEncodedQueryItem(const QByteArray &key); - void removeAllEncodedQueryItems(const QByteArray &key); - - void setFragment(const QString &fragment); - QString fragment() const; - void setEncodedFragment(const QByteArray &fragment); - QByteArray encodedFragment() const; bool hasFragment() const; -#ifndef QT_BOOTSTRAPPED - QString topLevelDomain() const; -#endif + QString fragment(ComponentFormattingOptions options = PrettyDecoded) const; + void setFragment(const QString &fragment); QUrl resolved(const QUrl &relative) const; bool isRelative() const; bool isParentOf(const QUrl &url) const; + bool isLocalFile() const; static QUrl fromLocalFile(const QString &localfile); QString toLocalFile() const; - bool isLocalFile() const; - - QByteArray toEncoded(FormattingOptions options = None) const; - - static QUrl fromUserInput(const QString &userInput); void detach(); bool isDetached() const; @@ -202,37 +244,121 @@ public: static QByteArray toPercentEncoding(const QString &, const QByteArray &exclude = QByteArray(), const QByteArray &include = QByteArray()); - static QString fromPunycode(const QByteArray &); - static QByteArray toPunycode(const QString &); - static QString fromAce(const QByteArray &); - static QByteArray toAce(const QString &); - static QStringList idnWhitelist(); - static void setIdnWhitelist(const QStringList &); - - QString errorString() const; - #if QT_DEPRECATED_SINCE(5,0) + QT_DEPRECATED static QString fromPunycode(const QByteArray &punycode) + { return fromAce(punycode); } + QT_DEPRECATED static QByteArray toPunycode(const QString &string) + { return toAce(string); } + + QT_DEPRECATED inline void setQueryItems(const QList<QPair<QString, QString> > &qry); + QT_DEPRECATED inline void addQueryItem(const QString &key, const QString &value); + QT_DEPRECATED inline QList<QPair<QString, QString> > queryItems() const; + QT_DEPRECATED inline bool hasQueryItem(const QString &key) const; + QT_DEPRECATED inline QString queryItemValue(const QString &key) const; + QT_DEPRECATED inline QStringList allQueryItemValues(const QString &key) const; + QT_DEPRECATED inline void removeQueryItem(const QString &key); + QT_DEPRECATED inline void removeAllQueryItems(const QString &key); + + QT_DEPRECATED inline void setEncodedQueryItems(const QList<QPair<QByteArray, QByteArray> > &query); + QT_DEPRECATED inline void addEncodedQueryItem(const QByteArray &key, const QByteArray &value); + QT_DEPRECATED inline QList<QPair<QByteArray, QByteArray> > encodedQueryItems() const; + QT_DEPRECATED inline bool hasEncodedQueryItem(const QByteArray &key) const; + QT_DEPRECATED inline QByteArray encodedQueryItemValue(const QByteArray &key) const; + QT_DEPRECATED inline QList<QByteArray> allEncodedQueryItemValues(const QByteArray &key) const; + QT_DEPRECATED inline void removeEncodedQueryItem(const QByteArray &key); + QT_DEPRECATED inline void removeAllEncodedQueryItems(const QByteArray &key); + QT_DEPRECATED void setEncodedUrl(const QByteArray &u, ParsingMode mode = TolerantMode) { setUrl(QString::fromUtf8(u.constData(), u.size()), mode); } - QT_DEPRECATED static QUrl fromEncoded(const QByteArray &u, ParsingMode mode = TolerantMode) - { return QUrl(QString::fromUtf8(u.constData(), u.size()), mode); } + + QT_DEPRECATED QByteArray encodedUserName() const + { return userName(FullyEncoded).toLatin1(); } + QT_DEPRECATED void setEncodedUserName(const QByteArray &value) + { setUserName(QString::fromLatin1(value)); } + + QT_DEPRECATED QByteArray encodedPassword() const + { return password(FullyEncoded).toLatin1(); } + QT_DEPRECATED void setEncodedPassword(const QByteArray &value) + { setPassword(QString::fromLatin1(value)); } + + QT_DEPRECATED QByteArray encodedHost() const + { return host(FullyEncoded).toLatin1(); } + QT_DEPRECATED void setEncodedHost(const QByteArray &value) + { setHost(QString::fromLatin1(value)); } + + QT_DEPRECATED QByteArray encodedPath() const + { return path(FullyEncoded).toLatin1(); } + QT_DEPRECATED void setEncodedPath(const QByteArray &value) + { setPath(QString::fromLatin1(value)); } + + QT_DEPRECATED QByteArray encodedQuery() const + { return toLatin1_helper(query(FullyEncoded)); } + QT_DEPRECATED void setEncodedQuery(const QByteArray &value) + { setQuery(QString::fromLatin1(value)); } + + QT_DEPRECATED QByteArray encodedFragment() const + { return toLatin1_helper(fragment(FullyEncoded)); } + QT_DEPRECATED void setEncodedFragment(const QByteArray &value) + { setFragment(QString::fromLatin1(value)); } + +private: + // helper function for the encodedQuery and encodedFragment functions + static QByteArray toLatin1_helper(const QString &string) + { + if (string.isEmpty()) + return string.isNull() ? QByteArray() : QByteArray(""); + return string.toLatin1(); + } #endif +public: + static QString fromAce(const QByteArray &); + static QByteArray toAce(const QString &); + static QStringList idnWhitelist(); + static void setIdnWhitelist(const QStringList &); + friend Q_CORE_EXPORT uint qHash(const QUrl &url, uint seed = 0); + private: QUrlPrivate *d; + friend class QUrlQuery; + public: typedef QUrlPrivate * DataPtr; inline DataPtr &data_ptr() { return d; } }; -inline uint qHash(const QUrl &url) -{ - return qHash(url.toEncoded(QUrl::FormattingOption(0x100))); -} - Q_DECLARE_TYPEINFO(QUrl, Q_MOVABLE_TYPE); Q_DECLARE_SHARED(QUrl) -Q_DECLARE_OPERATORS_FOR_FLAGS(QUrl::FormattingOptions) +Q_DECLARE_OPERATORS_FOR_FLAGS(QUrl::ComponentFormattingOptions) +//Q_DECLARE_OPERATORS_FOR_FLAGS(QUrl::FormattingOptions) + +Q_DECL_CONSTEXPR inline QUrl::FormattingOptions operator|(QUrl::UrlFormattingOption f1, QUrl::UrlFormattingOption f2) +{ return QUrl::FormattingOptions(f1) | f2; } +Q_DECL_CONSTEXPR inline QUrl::FormattingOptions operator|(QUrl::UrlFormattingOption f1, QUrl::FormattingOptions f2) +{ return f2 | f1; } +inline QIncompatibleFlag operator|(QUrl::UrlFormattingOption f1, int f2) +{ return QIncompatibleFlag(int(f1) | f2); } + +// add operators for OR'ing the two types of flags +inline QUrl::FormattingOptions &operator|=(QUrl::FormattingOptions &i, QUrl::ComponentFormattingOptions f) +{ i |= QUrl::UrlFormattingOption(int(f)); return i; } +Q_DECL_CONSTEXPR inline QUrl::FormattingOptions operator|(QUrl::UrlFormattingOption i, QUrl::ComponentFormattingOption f) +{ return i | QUrl::UrlFormattingOption(int(f)); } +Q_DECL_CONSTEXPR inline QUrl::FormattingOptions operator|(QUrl::UrlFormattingOption i, QUrl::ComponentFormattingOptions f) +{ return i | QUrl::UrlFormattingOption(int(f)); } +Q_DECL_CONSTEXPR inline QUrl::FormattingOptions operator|(QUrl::ComponentFormattingOption f, QUrl::UrlFormattingOption i) +{ return i | QUrl::UrlFormattingOption(int(f)); } +Q_DECL_CONSTEXPR inline QUrl::FormattingOptions operator|(QUrl::ComponentFormattingOptions f, QUrl::UrlFormattingOption i) +{ return i | QUrl::UrlFormattingOption(int(f)); } +Q_DECL_CONSTEXPR inline QUrl::FormattingOptions operator|(QUrl::FormattingOptions i, QUrl::ComponentFormattingOptions f) +{ return i | QUrl::UrlFormattingOption(int(f)); } +Q_DECL_CONSTEXPR inline QUrl::FormattingOptions operator|(QUrl::ComponentFormattingOption f, QUrl::FormattingOptions i) +{ return i | QUrl::UrlFormattingOption(int(f)); } +Q_DECL_CONSTEXPR inline QUrl::FormattingOptions operator|(QUrl::ComponentFormattingOptions f, QUrl::FormattingOptions i) +{ return i | QUrl::UrlFormattingOption(int(f)); } + +//inline QUrl::UrlFormattingOption &operator=(const QUrl::UrlFormattingOption &i, QUrl::ComponentFormattingOptions f) +//{ i = int(f); f; } #ifndef QT_NO_DATASTREAM Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QUrl &); @@ -245,6 +371,10 @@ Q_CORE_EXPORT QDebug operator<<(QDebug, const QUrl &); QT_END_NAMESPACE +#if QT_DEPRECATED_SINCE(5,0) +# include <QtCore/qurlquery.h> +#endif + QT_END_HEADER #endif // QURL_H |