1#ifndef QX_DOWNLOADMANAGER_H
2#define QX_DOWNLOADMANAGER_H
5#include "qx/network/qx_network_export.h"
9#include <QNetworkAccessManager>
10#include <QAuthenticator>
13#include "qx/network/qx-downloadtask.h"
14#include "qx/network/qx-downloadopreport.h"
15#include "qx/network/qx-downloadmanagerreport.h"
19#include "qx/core/qx-cumulation.h"
20#include "qx/io/qx-filestreamwriter.h"
51 enum Status {Initial, Enumerating, Downloading, Aborting, StoppingOnError};
59 std::optional<QCryptographicHash> mHash;
62 Writer(
const QString& d,
WriteOptions o, std::optional<QCryptographicHash::Algorithm> a);
70 QByteArray hash()
const;
76 static const qint64 PRESUMED_SIZE = 10485760;
77 static const qint64 SIZE_QUERY_TIMEOUT_MS = 500;
80 static inline const QString ERR_TIMEOUT = u
"The data transfer failed to start before the timeout was reached."_s;
81 static inline const QString ERR_CHECKSUM_MISMATCH = u
"The file's contents did not produce the expected checksum."_s;
84 static inline const QString SSL_ERR = u
"The following SSL issues occurred while attempting to download %1"_s;
85 static inline const QString CONTINUE_QUES = u
"Continue downloading?"_s;
86 static inline const QString AUTH_REQUIRED = u
"Authentication is required to connect to %1"_s;
87 static inline const QString PROXY_AUTH_REQUIRED = u
"Authentication is required to connect to the proxy %1"_s;
90 static inline const QString PROMPT_AUTH = u
"Authentication is required for %1"_s;
91 static inline const QString PROMPT_PRESHARED_AUTH = u
"Pre-shared key authentication is required for %1"_s;
92 static inline const QString PROMPT_PROXY_AUTH = u
"Proxy authentication is required for %1"_s;
98 int mEnumerationTimeout;
101 bool mSkipEnumeration;
102 bool mDeletePartials;
104 QCryptographicHash::Algorithm mVerificationMethod;
110 QNetworkAccessManager mNam;
113 QList<DownloadTask> mPendingEnumerants;
114 QList<DownloadTask> mPendingDownloads;
115 QHash<QNetworkReply*, DownloadTask> mActiveTasks;
116 QHash<QNetworkReply*, std::shared_ptr<Writer>> mActiveWriters;
123 DownloadManagerReport::Builder mReportBuilder;
132 void startSizeEnumeration();
133 void pushEnumerationsUntilFinished();
137 void startTrueDownloads();
138 void pushDownloadsUntilFinished();
167 void setTransferTimeout(
int timeout = QNetworkRequest::DefaultTransferTimeoutConstant);
182 void sslErrorHandler(QNetworkReply* reply,
const QList<QSslError>& errors);
183 void authHandler(QNetworkReply* reply, QAuthenticator* authenticator);
184 void preSharedAuthHandler(QNetworkReply* reply, QSslPreSharedKeyAuthenticator* authenticator);
185 void proxyAuthHandler(
const QNetworkProxy& proxy, QAuthenticator* authenticator);
186 void readyReadHandler();
187 void downloadProgressHandler(qint64 bytesCurrent, qint64 bytesTotal);
190 void sizeQueryFinishedHandler(QNetworkReply* reply);
191 void downloadFinishedHandler(QNetworkReply* reply);
245 void setTransferTimeout(
int timeout = QNetworkRequest::DefaultTransferTimeoutConstant);
The AsyncDownloadManager class is used to queue and process one or more downloads in an asynchronous ...
Definition qx-downloadmanager.h:45
bool isStopOnError() const
Definition qx-downloadmanager.cpp:322
void setMaxSimultaneous(int maxSimultaneous)
Definition qx-downloadmanager.cpp:392
void downloadProgress(qint64 bytesCurrent)
AsyncDownloadManager(QObject *parent=nullptr)
Definition qx-downloadmanager.cpp:76
void preSharedKeyAuthenticationRequired(QString prompt, QSslPreSharedKeyAuthenticator *authenticator)
void setDeletePartialDownloads(bool deletePartialDownloads)
Definition qx-downloadmanager.cpp:462
void finished(Qx::DownloadManagerReport report)
QCryptographicHash::Algorithm verificationMethod() const
Definition qx-downloadmanager.cpp:363
int transferTimeout() const
Definition qx-downloadmanager.cpp:292
void authenticationRequired(QString prompt, QAuthenticator *authenticator)
int enumerationTimeout() const
Definition qx-downloadmanager.cpp:302
void appendTask(const DownloadTask &task)
Definition qx-downloadmanager.cpp:478
QNetworkRequest::RedirectPolicy redirectPolicy() const
Definition qx-downloadmanager.cpp:283
void downloadTotalChanged(quint64 bytesTotal)
bool hasTasks() const
Definition qx-downloadmanager.cpp:378
void setVerificationMethod(QCryptographicHash::Algorithm method)
Definition qx-downloadmanager.cpp:469
void clearTasks()
Definition qx-downloadmanager.cpp:490
void setStopOnError(bool stopOnError)
Definition qx-downloadmanager.cpp:446
void sslErrors(Qx::Error errorMsg, bool *ignore)
bool isSkipEnumeration() const
Definition qx-downloadmanager.cpp:343
void setEnumerationTimeout(int timeout=500)
Definition qx-downloadmanager.cpp:430
bool isProcessing() const
Definition qx-downloadmanager.cpp:383
void setOverwrite(bool overwrite)
Definition qx-downloadmanager.cpp:438
void setSkipEnumeration(bool skipEnumeration)
Definition qx-downloadmanager.cpp:454
void processQueue()
Definition qx-downloadmanager.cpp:755
void setTransferTimeout(int timeout=QNetworkRequest::DefaultTransferTimeoutConstant)
Definition qx-downloadmanager.cpp:418
void abort()
Definition qx-downloadmanager.cpp:779
int maxSimultaneous() const
Definition qx-downloadmanager.cpp:273
bool isOverwrite() const
Definition qx-downloadmanager.cpp:312
int taskCount() const
Definition qx-downloadmanager.cpp:370
bool isDeletePartialDownloads() const
Definition qx-downloadmanager.cpp:354
void proxyAuthenticationRequired(QString prompt, QAuthenticator *authenticator)
void downloadFinished(Qx::DownloadOpReport downloadReport)
void setRedirectPolicy(QNetworkRequest::RedirectPolicy redirectPolicy)
Definition qx-downloadmanager.cpp:404
The Cumulation template class tracks the sum of multiple key-value components that can be changed ind...
Definition qx-cumulation.h:21
The DownloadManagerReport class details the outcome of processing an AsyncDownloadManager or SyncDown...
Definition qx-downloadmanagerreport.h:23
The DownloadOpReport class details the result of a single file download.
Definition qx-downloadopreport.h:17
The Error class acts as an interface for an extensible variety of error objects.
Definition qx-error.h:65
The FileStreamWriter class is a specialized wrapper for QDataStream that narrows and simplifies its u...
Definition qx-filestreamwriter.h:18
The IoOpReport class is a container for details regarding the outcome of an IO operation.
Definition qx-ioopreport.h:53
void downloadProgress(qint64 bytesCurrent)
void downloadTotalChanged(quint64 bytesTotal)
bool isStopOnError() const
Definition qx-downloadmanager.cpp:993
void proxyAuthenticationRequired(QString prompt, QAuthenticator *authenticator)
void preSharedKeyAuthenticationRequired(QString prompt, QSslPreSharedKeyAuthenticator *authenticator)
bool hasTasks() const
Definition qx-downloadmanager.cpp:1018
bool isDeletePartialDownloads() const
Definition qx-downloadmanager.cpp:1003
void appendTask(const DownloadTask &task)
Definition qx-downloadmanager.cpp:1076
void setEnumerationTimeout(int timeout=500)
Definition qx-downloadmanager.cpp:1046
void sslErrors(Qx::Error errorMsg, bool *ignore)
bool isProcessing() const
Definition qx-downloadmanager.cpp:1023
void downloadFinished(Qx::DownloadOpReport downloadReport)
void setOverwrite(bool overwrite)
Definition qx-downloadmanager.cpp:1051
void setTransferTimeout(int timeout=QNetworkRequest::DefaultTransferTimeoutConstant)
Definition qx-downloadmanager.cpp:1041
void abort()
Definition qx-downloadmanager.cpp:1127
void clearTasks()
Definition qx-downloadmanager.cpp:1081
void setVerificationMethod(QCryptographicHash::Algorithm method)
Definition qx-downloadmanager.cpp:1071
void authenticationRequired(QString prompt, QAuthenticator *authenticator)
void setStopOnError(bool stopOnError)
Definition qx-downloadmanager.cpp:1056
bool isOverwrite() const
Definition qx-downloadmanager.cpp:988
bool isSkipEnumeration() const
Definition qx-downloadmanager.cpp:998
DownloadManagerReport processQueue()
Definition qx-downloadmanager.cpp:1093
void setRedirectPolicy(QNetworkRequest::RedirectPolicy redirectPolicy)
Definition qx-downloadmanager.cpp:1033
void setDeletePartialDownloads(bool deletePartialDownloads)
Definition qx-downloadmanager.cpp:1066
QNetworkRequest::RedirectPolicy redirectPolicy() const
Definition qx-downloadmanager.cpp:973
SyncDownloadManager(QObject *parent=nullptr)
Definition qx-downloadmanager.cpp:948
int transferTimeout() const
Definition qx-downloadmanager.cpp:978
void setMaxSimultaneous(int maxSimultaneous)
Definition qx-downloadmanager.cpp:1028
int maxSimultaneous() const
Definition qx-downloadmanager.cpp:968
QCryptographicHash::Algorithm verificationMethod() const
Definition qx-downloadmanager.cpp:1008
void setSkipEnumeration(bool skipEnumeration)
Definition qx-downloadmanager.cpp:1061
int taskCount() const
Definition qx-downloadmanager.cpp:1013
int enumerationTimeout() const
Definition qx-downloadmanager.cpp:983
The Qx namespace is the main namespace through which all non-global functionality of the Qx library i...
Definition qx-abstracterror.cpp:13
QFlags< WriteOption > WriteOptions
Definition qx-common-io.h:38
The qx-error.h header file provides access to the Error interface.
The DownloadTask struct contains the information necessary to download a file from a URL.
Definition qx-downloadtask.h:14