diff options
Diffstat (limited to 'src/network/access/qnetworkaccessbackend_p.h')
-rw-r--r-- | src/network/access/qnetworkaccessbackend_p.h | 229 |
1 files changed, 90 insertions, 139 deletions
diff --git a/src/network/access/qnetworkaccessbackend_p.h b/src/network/access/qnetworkaccessbackend_p.h index b18f30c287..0f7b21684a 100644 --- a/src/network/access/qnetworkaccessbackend_p.h +++ b/src/network/access/qnetworkaccessbackend_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNetwork module of the Qt Toolkit. @@ -40,153 +40,108 @@ #ifndef QNETWORKACCESSBACKEND_P_H #define QNETWORKACCESSBACKEND_P_H -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of the Network Access API. This header file may change from -// version to version without notice, or even be removed. -// -// We mean it. -// - -#include <QtNetwork/private/qtnetworkglobal_p.h> -#include "qnetworkreplyimpl_p.h" -#include "QtCore/qobject.h" -Q_MOC_INCLUDE(<QAuthenticator>) -Q_MOC_INCLUDE(<QtNetwork/QSslError>) +#include <QtNetwork/qtnetworkglobal.h> -QT_BEGIN_NAMESPACE +#include <QtNetwork/qnetworkrequest.h> +#include <QtNetwork/qnetworkaccessmanager.h> +#include <QtNetwork/qnetworkreply.h> -class QNetworkProxy; -class QNetworkProxyQuery; -class QNetworkRequest; -class QStringList; -class QUrl; -class QSslConfiguration; +#include <QtCore/qobject.h> +#include <QtCore/qflags.h> +#include <QtCore/qbytearrayview.h> + +#if QT_CONFIG(ssl) +#include <QtNetwork/qsslconfiguration.h> +#endif + +QT_BEGIN_NAMESPACE -class QNetworkAccessManagerPrivate; class QNetworkReplyImplPrivate; -class QAbstractNetworkCache; -class QNetworkCacheMetaData; -class QNonContiguousByteDevice; - -// Should support direct file upload from disk or download to disk. -// -// - The HTTP handler will use two QIODevices for communication (pull mechanism) -// - KIO uses a pull mechanism too (data/dataReq signals) -class QNetworkAccessBackend : public QObject +class QNetworkAccessManagerPrivate; +class QNetworkAccessBackendPrivate; +class Q_NETWORK_EXPORT QNetworkAccessBackend : public QObject { Q_OBJECT + Q_DECLARE_PRIVATE(QNetworkAccessBackend); + public: - QNetworkAccessBackend(); + enum class TargetType { + Networked = 0x1, // We need to query for proxy in case it is needed + Local = 0x2, // Local file, generated data or local device + }; + Q_ENUM(TargetType) + Q_DECLARE_FLAGS(TargetTypes, TargetType) + + enum class SecurityFeature { + None = 0x0, + TLS = 0x1, // We need to set QSslConfiguration + }; + Q_ENUM(SecurityFeature) + Q_DECLARE_FLAGS(SecurityFeatures, SecurityFeature) + + enum class IOFeature { + None = 0x0, + ZeroCopy = 0x1, // readPointer and advanceReadPointer() is available! + NeedResetableUpload = 0x2, // Need to buffer upload data + SupportsSynchronousMode = 0x4, // Used for XMLHttpRequest + }; + Q_ENUM(IOFeature) + Q_DECLARE_FLAGS(IOFeatures, IOFeature) + + QNetworkAccessBackend(TargetTypes targetTypes, SecurityFeatures securityFeatures, + IOFeatures ioFeatures); + QNetworkAccessBackend(TargetTypes targetTypes); + QNetworkAccessBackend(TargetTypes targetTypes, SecurityFeatures securityFeatures); + QNetworkAccessBackend(TargetTypes targetTypes, IOFeatures ioFeatures); virtual ~QNetworkAccessBackend(); - // To avoid mistaking with QIODevice names, the functions here - // have different names. The Connection has two streams: - // - // - Upstream: - // The upstream uses a QNonContiguousByteDevice provided - // by the backend. This device emits the usual readyRead() - // signal when the backend has data available for the connection - // to write. The different backends can listen on this signal - // and then pull upload data from the QNonContiguousByteDevice and - // deal with it. - // - // - // - Downstream: - // Downstream is the data that is being read from this - // connection and is given to the user. Downstream operates in a - // semi-"push" mechanism: the Connection object pushes the data - // it gets from the network, but it should avoid writing too - // much if the data isn't being used fast enough. The value - // returned by suggestedDownstreamBlockSize() can be used to - // determine how much should be written at a time. The - // downstreamBytesConsumed() function will be called when the - // downstream buffer is consumed by the user -- the Connection - // may choose to re-fill it with more data it has ready or get - // more data from the network (for instance, by reading from its - // socket). + SecurityFeatures securityFeatures() const noexcept; + TargetTypes targetTypes() const noexcept; + IOFeatures ioFeatures() const noexcept; - virtual void open() = 0; - virtual bool start(); - virtual void closeDownstreamChannel() = 0; + inline bool needsResetableUploadData() const noexcept + { + return ioFeatures() & IOFeature::NeedResetableUpload; + } - // slot-like: - virtual void downstreamReadyWrite(); - virtual void setDownstreamLimited(bool b); - virtual void copyFinished(QIODevice *); + virtual bool start(); + virtual void open() = 0; + virtual void close() = 0; +#if QT_CONFIG(ssl) + virtual void setSslConfiguration(const QSslConfiguration &configuration); + virtual QSslConfiguration sslConfiguration() const; +#endif virtual void ignoreSslErrors(); virtual void ignoreSslErrors(const QList<QSslError> &errors); + virtual qint64 bytesAvailable() const = 0; + virtual QByteArrayView readPointer(); + virtual void advanceReadPointer(qint64 distance); + virtual qint64 read(char *data, qint64 maxlen); + virtual bool wantToRead(); - virtual void fetchSslConfiguration(QSslConfiguration &configuration) const; - virtual void setSslConfiguration(const QSslConfiguration &configuration); - - virtual QNetworkCacheMetaData fetchCacheMetaData(const QNetworkCacheMetaData &metaData) const; - - // information about the request - QNetworkAccessManager::Operation operation() const; - QNetworkRequest request() const; -#ifndef QT_NO_NETWORKPROXY +#if QT_CONFIG(networkproxy) QList<QNetworkProxy> proxyList() const; #endif - - QAbstractNetworkCache *networkCache() const; - void setCachingEnabled(bool enable); - bool isCachingEnabled() const; - - // information about the reply QUrl url() const; void setUrl(const QUrl &url); - - // "cooked" headers QVariant header(QNetworkRequest::KnownHeaders header) const; void setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value); + QByteArray rawHeader(const QByteArray &header) const; + void setRawHeader(const QByteArray &header, const QByteArray &value); + QNetworkAccessManager::Operation operation() const; - // raw headers: - bool hasRawHeader(const QByteArray &headerName) const; - QList<QByteArray> rawHeaderList() const; - QByteArray rawHeader(const QByteArray &headerName) const; - void setRawHeader(const QByteArray &headerName, const QByteArray &value); - - // attributes: - QVariant attribute(QNetworkRequest::Attribute code) const; - void setAttribute(QNetworkRequest::Attribute code, const QVariant &value); - - bool isSynchronous() { return synchronous; } - void setSynchronous(bool sync) { synchronous = sync; } - - // return true if the QNonContiguousByteDevice of the upload - // data needs to support reset(). Currently needed for HTTP. - // This will possibly enable buffering of the upload data. - virtual bool needsResetableUploadData() { return false; } - - // Returns \c true if backend is able to resume downloads. - virtual bool canResume() const { return false; } - virtual void setResumeOffset(quint64 offset) { Q_UNUSED(offset); } - - virtual bool processRequestSynchronously() { return false; } - -protected: - // Create the device used for reading the upload data - QNonContiguousByteDevice* createUploadByteDevice(); + bool isCachingEnabled() const; + void setCachingEnabled(bool canCache); - // these functions control the downstream mechanism - // that is, data that has come via the connection and is going out the backend - qint64 nextDownstreamBlockSize() const; - void writeDownstreamData(QByteDataBuffer &list); + void setAttribute(QNetworkRequest::Attribute attribute, const QVariant &value); - // not actually appending data, it was already written to the user buffer - void writeDownstreamDataDownloadBuffer(qint64, qint64); - char* getDownloadBuffer(qint64); + QIODevice *createUploadByteDevice(); + QIODevice *uploadByteDevice(); - QSharedPointer<QNonContiguousByteDevice> uploadByteDevice; + QAbstractNetworkCache *networkCache() const; public slots: - // for task 251801, needs to be a slot to be called asynchronously - void writeDownstreamData(QIODevice *data); - + void readyRead(); protected slots: void finished(); void error(QNetworkReply::NetworkError code, const QString &errorString); @@ -196,26 +151,21 @@ protected slots: void authenticationRequired(QAuthenticator *auth); void metaDataChanged(); void redirectionRequested(const QUrl &destination); - void encrypted(); - void sslErrors(const QList<QSslError> &errors); - void emitReplyUploadProgress(qint64 bytesSent, qint64 bytesTotal); - -protected: - // FIXME In the long run we should get rid of our QNAM architecture - // and scrap this ReplyImpl/Backend distinction. - QNetworkAccessManagerPrivate *manager; - QNetworkReplyImplPrivate *reply; private: - friend class QNetworkAccessManager; - friend class QNetworkAccessManagerPrivate; - friend class QNetworkReplyImplPrivate; - - bool synchronous; + void setReplyPrivate(QNetworkReplyImplPrivate *reply); + void setManagerPrivate(QNetworkAccessManagerPrivate *manager); + bool isSynchronous() const; + void setSynchronous(bool synchronous); + + friend class QNetworkAccessManager; // for setReplyPrivate + friend class QNetworkAccessManagerPrivate; // for setManagerPrivate + friend class QNetworkReplyImplPrivate; // for {set,is}Synchronous() }; -class QNetworkAccessBackendFactory +class Q_NETWORK_EXPORT QNetworkAccessBackendFactory : public QObject { + Q_OBJECT public: QNetworkAccessBackendFactory(); virtual ~QNetworkAccessBackendFactory(); @@ -224,7 +174,8 @@ public: const QNetworkRequest &request) const = 0; }; -QT_END_NAMESPACE +#define QNetworkAccessBackendFactory_iid "org.qt-project.Qt.NetworkAccessBackendFactory" +Q_DECLARE_INTERFACE(QNetworkAccessBackendFactory, QNetworkAccessBackendFactory_iid); +QT_END_NAMESPACE #endif - |