diff options
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/access/qnetworkaccessbackend.cpp | 17 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessbackend_p.h | 2 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessdebugpipebackend.cpp | 6 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessdebugpipebackend_p.h | 1 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessfilebackend.cpp | 11 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessfilebackend_p.h | 1 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessftpbackend.cpp | 6 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessftpbackend_p.h | 1 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessmanager.cpp | 51 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessmanager.h | 6 | ||||
-rw-r--r-- | src/network/access/qnetworkaccessmanager_p.h | 1 |
11 files changed, 103 insertions, 0 deletions
diff --git a/src/network/access/qnetworkaccessbackend.cpp b/src/network/access/qnetworkaccessbackend.cpp index a895864d76..47cd928541 100644 --- a/src/network/access/qnetworkaccessbackend.cpp +++ b/src/network/access/qnetworkaccessbackend.cpp @@ -47,6 +47,7 @@ #include "qnetworkreply_p.h" #include "QtCore/qhash.h" #include "QtCore/qmutex.h" +#include "QtCore/qstringlist.h" #include "QtNetwork/private/qnetworksession_p.h" #include "qnetworkaccesscachebackend_p.h" @@ -110,6 +111,22 @@ QNetworkAccessBackend *QNetworkAccessManagerPrivate::findBackend(QNetworkAccessM return 0; } +QStringList QNetworkAccessManagerPrivate::backendSupportedSchemes() const +{ + if (QNetworkAccessBackendFactoryData::valid.load()) { + QMutexLocker locker(&factoryData()->mutex); + QNetworkAccessBackendFactoryData::ConstIterator it = factoryData()->constBegin(); + QNetworkAccessBackendFactoryData::ConstIterator end = factoryData()->constEnd(); + QStringList schemes; + while (it != end) { + schemes += (*it)->supportedSchemes(); + ++it; + } + return schemes; + } + return QStringList(); +} + QNonContiguousByteDevice* QNetworkAccessBackend::createUploadByteDevice() { if (reply->outgoingDataBuffer) diff --git a/src/network/access/qnetworkaccessbackend_p.h b/src/network/access/qnetworkaccessbackend_p.h index bf284414e0..d9657cf750 100644 --- a/src/network/access/qnetworkaccessbackend_p.h +++ b/src/network/access/qnetworkaccessbackend_p.h @@ -62,6 +62,7 @@ class QAuthenticator; class QNetworkProxy; class QNetworkProxyQuery; class QNetworkRequest; +class QStringList; class QUrl; class QUrlInfo; class QSslConfiguration; @@ -219,6 +220,7 @@ class QNetworkAccessBackendFactory public: QNetworkAccessBackendFactory(); virtual ~QNetworkAccessBackendFactory(); + virtual QStringList supportedSchemes() const = 0; virtual QNetworkAccessBackend *create(QNetworkAccessManager::Operation op, const QNetworkRequest &request) const = 0; }; diff --git a/src/network/access/qnetworkaccessdebugpipebackend.cpp b/src/network/access/qnetworkaccessdebugpipebackend.cpp index b6c04dddea..a91751523a 100644 --- a/src/network/access/qnetworkaccessdebugpipebackend.cpp +++ b/src/network/access/qnetworkaccessdebugpipebackend.cpp @@ -42,6 +42,7 @@ #include "qnetworkaccessdebugpipebackend_p.h" #include "QtCore/qdatastream.h" #include <QCoreApplication> +#include <QStringList> #include <QUrlQuery> #include "private/qnoncontiguousbytedevice_p.h" @@ -54,6 +55,11 @@ enum { WriteBufferSize = ReadBufferSize }; +QStringList QNetworkAccessDebugPipeBackendFactory::supportedSchemes() const +{ + return QStringList(QStringLiteral("debugpipe")); +} + QNetworkAccessBackend * QNetworkAccessDebugPipeBackendFactory::create(QNetworkAccessManager::Operation op, const QNetworkRequest &request) const diff --git a/src/network/access/qnetworkaccessdebugpipebackend_p.h b/src/network/access/qnetworkaccessdebugpipebackend_p.h index 0ae49de132..7593dfa9b7 100644 --- a/src/network/access/qnetworkaccessdebugpipebackend_p.h +++ b/src/network/access/qnetworkaccessdebugpipebackend_p.h @@ -102,6 +102,7 @@ private: class QNetworkAccessDebugPipeBackendFactory: public QNetworkAccessBackendFactory { public: + virtual QStringList supportedSchemes() const Q_DECL_OVERRIDE; virtual QNetworkAccessBackend *create(QNetworkAccessManager::Operation op, const QNetworkRequest &request) const; }; diff --git a/src/network/access/qnetworkaccessfilebackend.cpp b/src/network/access/qnetworkaccessfilebackend.cpp index 13428cc802..13e7394003 100644 --- a/src/network/access/qnetworkaccessfilebackend.cpp +++ b/src/network/access/qnetworkaccessfilebackend.cpp @@ -49,6 +49,17 @@ QT_BEGIN_NAMESPACE +QStringList QNetworkAccessFileBackendFactory::supportedSchemes() const +{ + QStringList schemes; + schemes << QStringLiteral("file") + << QStringLiteral("qrc"); +#if defined(Q_OS_ANDROID) + schemes << QStringLiteral("assets"); +#endif + return schemes; +} + QNetworkAccessBackend * QNetworkAccessFileBackendFactory::create(QNetworkAccessManager::Operation op, const QNetworkRequest &request) const diff --git a/src/network/access/qnetworkaccessfilebackend_p.h b/src/network/access/qnetworkaccessfilebackend_p.h index a52ecef165..157461fee7 100644 --- a/src/network/access/qnetworkaccessfilebackend_p.h +++ b/src/network/access/qnetworkaccessfilebackend_p.h @@ -88,6 +88,7 @@ private: class QNetworkAccessFileBackendFactory: public QNetworkAccessBackendFactory { public: + virtual QStringList supportedSchemes() const Q_DECL_OVERRIDE; virtual QNetworkAccessBackend *create(QNetworkAccessManager::Operation op, const QNetworkRequest &request) const; }; diff --git a/src/network/access/qnetworkaccessftpbackend.cpp b/src/network/access/qnetworkaccessftpbackend.cpp index 737d7d0151..246eb41657 100644 --- a/src/network/access/qnetworkaccessftpbackend.cpp +++ b/src/network/access/qnetworkaccessftpbackend.cpp @@ -43,6 +43,7 @@ #include "qnetworkaccessmanager_p.h" #include "QtNetwork/qauthenticator.h" #include "private/qnoncontiguousbytedevice_p.h" +#include <QStringList> #ifndef QT_NO_FTP @@ -61,6 +62,11 @@ static QByteArray makeCacheKey(const QUrl &url) QUrl::RemoveFragment); } +QStringList QNetworkAccessFtpBackendFactory::supportedSchemes() const +{ + return QStringList(QStringLiteral("ftp")); +} + QNetworkAccessBackend * QNetworkAccessFtpBackendFactory::create(QNetworkAccessManager::Operation op, const QNetworkRequest &request) const diff --git a/src/network/access/qnetworkaccessftpbackend_p.h b/src/network/access/qnetworkaccessftpbackend_p.h index 1bc377d80e..c006d450b8 100644 --- a/src/network/access/qnetworkaccessftpbackend_p.h +++ b/src/network/access/qnetworkaccessftpbackend_p.h @@ -111,6 +111,7 @@ private: class QNetworkAccessFtpBackendFactory: public QNetworkAccessBackendFactory { public: + virtual QStringList supportedSchemes() const Q_DECL_OVERRIDE; virtual QNetworkAccessBackend *create(QNetworkAccessManager::Operation op, const QNetworkRequest &request) const; }; diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp index 8c671a8c99..402bdeba24 100644 --- a/src/network/access/qnetworkaccessmanager.cpp +++ b/src/network/access/qnetworkaccessmanager.cpp @@ -1159,6 +1159,57 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera return reply; } +/*! + \since 5.2 + + Lists all the URL schemes supported by the access manager. + + \sa supportedSchemesImplementation() +*/ +QStringList QNetworkAccessManager::supportedSchemes() const +{ + QStringList schemes; + QNetworkAccessManager *self = const_cast<QNetworkAccessManager *>(this); // We know we call a const slot + QMetaObject::invokeMethod(self, "supportedSchemesImplementation", Qt::DirectConnection, + Q_RETURN_ARG(QStringList, schemes)); + schemes.removeDuplicates(); + return schemes; +} + +/*! + \since 5.2 + + Lists all the URL schemes supported by the access manager. + + You should not call this function directly; use + QNetworkAccessManager::supportedSchemes() instead. + + Reimplement this slot to provide your own supported schemes + in a QNetworkAccessManager subclass. It is for instance necessary + when your subclass provides support for new protocols. + + Because of binary compatibility constraints, the supportedSchemes() + method (introduced in Qt 5.2) is not virtual. Instead, supportedSchemes() + will dynamically detect and call this slot. + + \sa supportedSchemes() +*/ +QStringList QNetworkAccessManager::supportedSchemesImplementation() const +{ + Q_D(const QNetworkAccessManager); + + QStringList schemes = d->backendSupportedSchemes(); + // Those ones don't exist in backends +#ifndef QT_NO_HTTP + schemes << QStringLiteral("http"); +#ifndef QT_NO_SSL + if (QSslSocket::supportsSsl()) + schemes << QStringLiteral("https"); +#endif +#endif + schemes << QStringLiteral("data"); + return schemes; +} /*! \since 5.0 diff --git a/src/network/access/qnetworkaccessmanager.h b/src/network/access/qnetworkaccessmanager.h index ac8d58522b..46e46c49ab 100644 --- a/src/network/access/qnetworkaccessmanager.h +++ b/src/network/access/qnetworkaccessmanager.h @@ -97,6 +97,9 @@ public: explicit QNetworkAccessManager(QObject *parent = 0); ~QNetworkAccessManager(); + // ### Qt 6: turn into virtual + QStringList supportedSchemes() const; + void clearAccessCache(); #ifndef QT_NO_NETWORKPROXY @@ -153,6 +156,9 @@ protected: virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData = 0); +protected Q_SLOTS: + QStringList supportedSchemesImplementation() const; + private: friend class QNetworkReplyImplPrivate; friend class QNetworkReplyHttpImpl; diff --git a/src/network/access/qnetworkaccessmanager_p.h b/src/network/access/qnetworkaccessmanager_p.h index ec4fb24371..292755e7eb 100644 --- a/src/network/access/qnetworkaccessmanager_p.h +++ b/src/network/access/qnetworkaccessmanager_p.h @@ -124,6 +124,7 @@ public: #endif QNetworkAccessBackend *findBackend(QNetworkAccessManager::Operation op, const QNetworkRequest &request); + QStringList backendSupportedSchemes() const; #ifndef QT_NO_BEARERMANAGEMENT void createSession(const QNetworkConfiguration &config); |