21 #include <QNetworkAccessManager>
22 #include <QNetworkRequest>
23 #include <QNetworkReply>
30 , mDownloadCanceled( false )
32 mFile.setFileName( outputFileName );
44 mReply->deleteLater();
52 QNetworkRequest request( mUrl );
54 if ( !mAuthCfg.isEmpty() )
61 disconnect( mReply, &QNetworkReply::readyRead,
this, &QgsFileDownloader::onReadyRead );
62 disconnect( mReply, &QNetworkReply::finished,
this, &QgsFileDownloader::onFinished );
63 disconnect( mReply, &QNetworkReply::downloadProgress,
this, &QgsFileDownloader::onDownloadProgress );
65 mReply->deleteLater();
68 mReply = nam->get( request );
69 if ( !mAuthCfg.isEmpty() )
74 connect( mReply, &QNetworkReply::readyRead,
this, &QgsFileDownloader::onReadyRead );
75 connect( mReply, &QNetworkReply::finished,
this, &QgsFileDownloader::onFinished );
76 connect( mReply, &QNetworkReply::downloadProgress,
this, &QgsFileDownloader::onDownloadProgress );
79 connect( nam, &QgsNetworkAccessManager::sslErrors,
this, &QgsFileDownloader::onSslErrors, Qt::UniqueConnection );
85 mDownloadCanceled =
true;
90 void QgsFileDownloader::onRequestTimedOut( QNetworkReply *reply )
92 if ( reply == mReply )
93 error( tr(
"Network request %1 timed out" ).arg( mUrl.toString() ) );
97 void QgsFileDownloader::onSslErrors( QNetworkReply *reply,
const QList<QSslError> &errors )
99 if ( reply == mReply )
101 QStringList errorMessages;
102 errorMessages.reserve( errors.size() + 1 );
103 errorMessages << QStringLiteral(
"SSL Errors: " );
104 for (
auto end = errors.size(), i = 0; i != end; ++i )
106 errorMessages << errors[i].errorString();
108 error( errorMessages );
114 void QgsFileDownloader::error(
const QStringList &errorMessages )
116 for (
auto end = errorMessages.size(), i = 0; i != end; ++i )
118 mErrors << errorMessages[i];
125 void QgsFileDownloader::error(
const QString &errorMessage )
127 error( QStringList() << errorMessage );
130 void QgsFileDownloader::onReadyRead()
133 if ( mFile.fileName().isEmpty() )
135 error( tr(
"No output filename specified" ) );
138 else if ( ! mFile.isOpen() && ! mFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
140 error( tr(
"Cannot open output file: %1" ).arg( mFile.fileName() ) );
145 QByteArray data = mReply->readAll();
150 void QgsFileDownloader::onFinished()
153 if ( ! mErrors.isEmpty() || mDownloadCanceled )
155 if ( mFile.isOpen() )
157 if ( mFile.exists() )
163 if ( mFile.isOpen() )
170 QVariant redirectionTarget = mReply->attribute( QNetworkRequest::RedirectionTargetAttribute );
171 if ( mReply->error() )
174 error( tr(
"Download failed: %1" ).arg( mReply->errorString() ) );
176 else if ( !redirectionTarget.isNull() )
178 QUrl newUrl = mUrl.resolved( redirectionTarget.toUrl() );
180 mReply->deleteLater();
181 if ( !mFile.open( QIODevice::WriteOnly ) )
184 error( tr(
"Cannot open output file: %1" ).arg( mFile.fileName() ) );
204 void QgsFileDownloader::onDownloadProgress( qint64 bytesReceived, qint64 bytesTotal )
206 if ( mDownloadCanceled )
static QgsAuthManager * authManager()
Returns the application's authentication manager instance.
bool updateNetworkRequest(QNetworkRequest &request, const QString &authcfg, const QString &dataprovider=QString())
Provider call to update a QNetworkRequest with an authentication config.
bool updateNetworkReply(QNetworkReply *reply, const QString &authcfg, const QString &dataprovider=QString())
Provider call to update a QNetworkReply with an authentication config (used to skip known SSL errors,...
QgsFileDownloader(const QUrl &url, const QString &outputFileName, const QString &authcfg=QString(), bool delayStart=false)
QgsFileDownloader.
void cancelDownload()
Call to abort the download and delete this object after the cancellation has been processed.
void downloadExited()
Emitted always when the downloader exits.
void downloadCanceled()
Emitted when the download was canceled by the user.
void downloadError(QStringList errorMessages)
Emitted when an error makes the download fail.
void startDownload()
Called to start the download.
void downloadCompleted(const QUrl &url)
Emitted when the download has completed successfully.
void downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
Emitted when data are ready to be processed.
~QgsFileDownloader() override
network access manager for QGIS
static QgsNetworkAccessManager * instance(Qt::ConnectionType connectionType=Qt::BlockingQueuedConnection)
Returns a pointer to the active QgsNetworkAccessManager for the current thread.
void requestTimedOut(QgsNetworkRequestParameters request)
Emitted when a network request has timed out.
#define QgsSetRequestInitiatorClass(request, _class)