From 73ef69526d00ffe09f9c24de43e4895d22c87a9b Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Sat, 14 Sep 2019 11:11:29 +0300 Subject: [PATCH 1/2] Allow to cancel download request --- src/base/net/downloadmanager.cpp | 13 +++++++++++++ src/base/net/downloadmanager.h | 5 ++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/base/net/downloadmanager.cpp b/src/base/net/downloadmanager.cpp index d35cdd6bc..ab002e4cd 100644 --- a/src/base/net/downloadmanager.cpp +++ b/src/base/net/downloadmanager.cpp @@ -121,6 +121,8 @@ namespace explicit DownloadHandlerImpl(const Net::DownloadRequest &downloadRequest, QObject *parent); ~DownloadHandlerImpl() override; + void cancel() override; + QString url() const; const Net::DownloadRequest downloadRequest() const; @@ -416,6 +418,17 @@ namespace delete m_reply; } + void DownloadHandlerImpl::cancel() + { + if (m_reply) { + m_reply->abort(); + } + else { + setError(errorCodeToString(QNetworkReply::OperationCanceledError)); + finish(); + } + } + void DownloadHandlerImpl::assignNetworkReply(QNetworkReply *reply) { Q_ASSERT(reply); diff --git a/src/base/net/downloadmanager.h b/src/base/net/downloadmanager.h index a4fd7b2ac..ceba46010 100644 --- a/src/base/net/downloadmanager.h +++ b/src/base/net/downloadmanager.h @@ -104,6 +104,8 @@ namespace Net public: using QObject::QObject; + virtual void cancel() = 0; + signals: void finished(const DownloadResult &result); }; @@ -118,6 +120,8 @@ namespace Net static void freeInstance(); static DownloadManager *instance(); + DownloadHandler *download(const DownloadRequest &downloadRequest); + template void download(const DownloadRequest &downloadRequest, Context context, Func &&slot); @@ -137,7 +141,6 @@ namespace Net private: explicit DownloadManager(QObject *parent = nullptr); - DownloadHandler *download(const DownloadRequest &downloadRequest); void applyProxySettings(); void handleReplyFinished(const QNetworkReply *reply); From cf6e721b00a1dc0f1b5b64007d2dc3cf9c1bb1fd Mon Sep 17 00:00:00 2001 From: "Vladimir Golovnev (Glassez)" Date: Sat, 14 Sep 2019 11:33:03 +0300 Subject: [PATCH 2/2] Allow to retry fetching RSS feeds --- src/base/rss/rss_feed.cpp | 6 ++++-- src/base/rss/rss_feed.h | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/base/rss/rss_feed.cpp b/src/base/rss/rss_feed.cpp index 0a9abf728..117c8e24e 100644 --- a/src/base/rss/rss_feed.cpp +++ b/src/base/rss/rss_feed.cpp @@ -125,11 +125,13 @@ void Feed::markAsRead() void Feed::refresh() { - if (isLoading()) return; + if (isLoading()) + m_downloadHandler->cancel(); // NOTE: Should we allow manually refreshing for disabled session? - Net::DownloadManager::instance()->download(m_url, this, &Feed::handleDownloadFinished); + m_downloadHandler = Net::DownloadManager::instance()->download(m_url); + connect(m_downloadHandler, &Net::DownloadHandler::finished, this, &Feed::handleDownloadFinished); m_isLoading = true; emit stateChanged(this); diff --git a/src/base/rss/rss_feed.h b/src/base/rss/rss_feed.h index 140d3aa92..5731f6ea1 100644 --- a/src/base/rss/rss_feed.h +++ b/src/base/rss/rss_feed.h @@ -41,6 +41,7 @@ class AsyncFileStorage; namespace Net { + class DownloadHandler; struct DownloadResult; } @@ -125,5 +126,6 @@ namespace RSS QString m_dataFileName; QBasicTimer m_savingTimer; bool m_dirty = false; + Net::DownloadHandler *m_downloadHandler = nullptr; }; }