18#ifndef QGSTILEDOWNLOADMANAGER_H
19#define QGSTILEDOWNLOADMANAGER_H
26#include <QNetworkAccessManager>
27#include <QNetworkReply>
46class CORE_EXPORT QgsTileDownloadManagerReply :
public QObject
50 ~QgsTileDownloadManagerReply()
override;
55 QByteArray
data()
const {
return mData; }
57 QUrl
url()
const {
return mUrl; }
59 QVariant attribute( QNetworkRequest::Attribute code );
61 QVariant header( QNetworkRequest::KnownHeaders header );
63 const QList<QNetworkReply::RawHeaderPair>
rawHeaderPairs()
const {
return mRawHeaderPairs; }
65 QNetworkReply::NetworkError
error()
const {
return mError; }
69 QNetworkRequest
request()
const {
return mRequest; }
76 void requestFinished( QByteArray
data, QUrl
url,
const QMap<QNetworkRequest::Attribute, QVariant> &attributes,
const QMap<QNetworkRequest::KnownHeaders, QVariant> &headers,
const QList<QNetworkReply::RawHeaderPair>
rawHeaderPairs, QNetworkReply::NetworkError
error,
const QString &
errorString );
77 void cachedRangeRequestFinished();
87 QNetworkRequest mRequest;
88 bool mHasFinished =
false;
90 QNetworkReply::NetworkError mError = QNetworkReply::NoError;
93 QMap<QNetworkRequest::Attribute, QVariant> mAttributes;
94 QMap<QNetworkRequest::KnownHeaders, QVariant> mHeaders;
95 QList<QNetworkReply::RawHeaderPair> mRawHeaderPairs;
106class QgsTileDownloadManagerReplyWorkerObject :
public QObject
110 QgsTileDownloadManagerReplyWorkerObject(
QgsTileDownloadManager *manager,
const QNetworkRequest &request )
111 : mManager( manager ), mRequest( request ) {}
114 void replyFinished();
117 void finished( QByteArray data, QUrl url,
const QMap<QNetworkRequest::Attribute, QVariant> &attributes,
const QMap<QNetworkRequest::KnownHeaders, QVariant> &headers,
const QList<QNetworkReply::RawHeaderPair> rawHeaderPairs, QNetworkReply::NetworkError error,
const QString &errorString );
121 QgsTileDownloadManager *mManager =
nullptr;
122 QNetworkRequest mRequest;
131class QgsTileDownloadManagerWorker :
public QObject
137 QgsTileDownloadManagerWorker( QgsTileDownloadManager *manager, QObject *parent =
nullptr );
139 void startIdleTimer();
143 void idleTimerTimeout();
146 void requestFinished( QString url, QByteArray data );
153 QgsTileDownloadManager *mManager =
nullptr;
208 bool isValid()
const {
return !request.url().isEmpty(); }
211 QNetworkRequest request;
215 QNetworkReply *networkReply =
nullptr;
280 void resetStatistics();
289 QueueEntry findEntryForRequest(
const QNetworkRequest &request );
290 void addEntry(
const QueueEntry &entry );
291 void updateEntry(
const QueueEntry &entry );
292 void removeEntry(
const QNetworkRequest &request );
293 void processStagedEntryRemovals();
295 void signalQueueModified();
297 bool isRangeRequest(
const QNetworkRequest &request );
298 bool isCachedRangeRequest(
const QNetworkRequest &request );
302 std::vector<QueueEntry> mQueue;
304 bool mStageQueueRemovals =
false;
305 std::vector< QNetworkRequest > mStagedQueueRemovals;
307 bool mShuttingDown =
false;
308 mutable QRecursiveMutex mMutex;
310 QThread *mWorkerThread =
nullptr;
314 int mIdleThreadTimeoutMs = 10000;
316 std::unique_ptr<QgsRangeRequestCache> mRangesCache;
A custom cache for handling the storage and retrieval of HTTP range requests on disk.
QString errorString() const
Returns error string (only valid when already finished).
bool hasFinished() const
Returns whether the reply has already finished (with success/failure).
QNetworkRequest request() const
Returns the original request for this reply object.
friend class QgsTileDownloadManager
const QList< QNetworkReply::RawHeaderPair > rawHeaderPairs() const
Returns a list of raw header pairs.
QByteArray data() const
Returns binary data returned in the reply (only valid when already finished).
QNetworkReply::NetworkError error() const
Returns error code (only valid when already finished).
QUrl url() const
Returns the reply URL.
void finished()
Emitted when the reply has finished (either with a success or with a failure).
Encapsulates any statistics we would like to keep about requests.
int networkRequestsStarted
How many actual network requests were started.
int requestsMerged
How many requests were same as some other pending request and got "merged".
int networkRequestsOk
How many network requests have been successful.
int networkRequestsFailed
How many network requests have failed.
int requestsEarlyDeleted
How many requests were deleted early by the client (i.e. lost interest).
int requestsTotal
How many requests were done through the download manager.
Tile download manager handles downloads of map tiles for the purpose of map rendering.
Stats statistics() const
Returns basic statistics of the queries handled by this class.
bool hasWorkerThreadRunning() const
Returns whether the worker thread is running currently (it may be stopped if there were no requests r...
friend class QgsTileDownloadManagerReplyWorkerObject
bool waitForPendingRequests(int msec=-1) const
Blocks the current thread until the queue is empty.
QgsTileDownloadManagerReply * get(const QNetworkRequest &request)
Starts a request.
void setIdleThreadTimeout(int timeoutMs)
Sets after how many milliseconds the idle worker therad should terminate.
friend class QgsTileDownloadManagerReply
bool hasPendingRequests() const
Returns whether there are any pending requests in the queue.
friend class QgsTileDownloadManagerWorker
void shutdown()
Asks the worker thread to stop and blocks until it is not stopped.