From de954f644abf1576e7a8dc66b133830fa395b3d8 Mon Sep 17 00:00:00 2001 From: Bart De Vries Date: Wed, 6 Oct 2021 16:07:05 +0200 Subject: [PATCH] Fix issues with cached images being accessed while the download is still running --- src/fetcher.cpp | 29 +++++++++++++++++++++++------ src/fetcher.h | 4 +++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/fetcher.cpp b/src/fetcher.cpp index 32904f03..7d2f99d5 100644 --- a/src/fetcher.cpp +++ b/src/fetcher.cpp @@ -109,7 +109,7 @@ void Fetcher::fetch(const QStringList &urls) qCDebug(kastsFetcher) << "end of Fetcher::fetch"; } -QString Fetcher::image(const QString &url) const +QString Fetcher::image(const QString &url) { if (url.isEmpty()) { return QLatin1String("no-image"); @@ -123,18 +123,35 @@ QString Fetcher::image(const QString &url) const } } + // avoid restarting an image download if it's already running + if (m_ongoingImageDownloads.contains(url)) { + return QLatin1String("fetching"); + } + // if image has not yet been cached, then check for network connectivity if // possible; and download the image if (canCheckNetworkStatus()) { - if (networkConnected() && (!isMeteredConnection() || SettingsManager::self()->allowMeteredImageDownloads())) { - download(url, path); - } else { + if (!networkConnected() || (isMeteredConnection() && !SettingsManager::self()->allowMeteredImageDownloads())) { return QLatin1String("no-image"); } - } else { - download(url, path); } + m_ongoingImageDownloads.insert(url); + QNetworkRequest request((QUrl(url))); + request.setTransferTimeout(); + QNetworkReply *reply = get(request); + connect(reply, &QNetworkReply::finished, this, [=]() { + if (reply->isOpen() && !reply->error()) { + QByteArray data = reply->readAll(); + QFile file(path); + file.open(QIODevice::WriteOnly); + file.write(data); + file.close(); + Q_EMIT downloadFinished(url); + } + m_ongoingImageDownloads.remove(url); + reply->deleteLater(); + }); return QLatin1String("fetching"); } diff --git a/src/fetcher.h b/src/fetcher.h index 6aa54d09..b716b660 100644 --- a/src/fetcher.h +++ b/src/fetcher.h @@ -39,7 +39,7 @@ public: Q_INVOKABLE void fetch(const QString &url); Q_INVOKABLE void fetch(const QStringList &urls); Q_INVOKABLE void fetchAll(); - Q_INVOKABLE QString image(const QString &url) const; + Q_INVOKABLE QString image(const QString &url); Q_INVOKABLE QNetworkReply *download(const QString &url, const QString &fileName) const; QNetworkReply *get(QNetworkRequest &request) const; @@ -74,6 +74,8 @@ private: QNetworkReply *head(QNetworkRequest &request) const; void setHeader(QNetworkRequest &request) const; + QSet m_ongoingImageDownloads; + QNetworkAccessManager *manager; int m_updateProgress; int m_updateTotal;