From ec8f1ffe9ce553f8efc2078736626957e6ee949a Mon Sep 17 00:00:00 2001 From: luddens Date: Mon, 29 Apr 2019 11:25:35 +0200 Subject: [PATCH] Add pause and unpause functions for aria2 This functions enable to stop and resume download with aria2. The Downloader's constructor now checks the paused downloads with the function "tellWaiting()" to get them at the start of kiwix-desktop. --- include/downloader.h | 2 ++ src/aria2.cpp | 35 ++++++++++++++++++++++++++++++++++- src/aria2.h | 3 +++ src/downloader.cpp | 31 ++++++++++++++++++++++++++++++- 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/include/downloader.h b/include/downloader.h index 1fa439f2..43efee9d 100644 --- a/include/downloader.h +++ b/include/downloader.h @@ -54,6 +54,8 @@ class Download { m_status(K_UNKNOWN), m_did(did) {}; void updateStatus(bool follow=false); + void pauseDownload(); + void resumeDownload(); StatusResult getStatus() { return m_status; } std::string getDid() { return m_did; } std::string getFollowedBy() { return m_followedBy; } diff --git a/src/aria2.cpp b/src/aria2.cpp index 92c4095d..c24135a8 100644 --- a/src/aria2.cpp +++ b/src/aria2.cpp @@ -171,7 +171,6 @@ std::vector Aria2::tellActive() MethodCall methodCall("aria2.tellActive", m_secret); auto statusArray = methodCall.newParamValue().getArray(); statusArray.addValue().set(std::string("gid")); - statusArray.addValue().set(std::string("following")); auto responseContent = doRequest(methodCall); MethodResponse response(responseContent); std::vector activeGID; @@ -186,6 +185,27 @@ std::vector Aria2::tellActive() return activeGID; } +std::vector Aria2::tellWaiting() +{ + MethodCall methodCall("aria2.tellWaiting", m_secret); + methodCall.newParamValue().set(0); + methodCall.newParamValue().set(99); // max number of downloads to be returned, don't know how to set this properly assumed that there will not be more than 99 paused downloads. + auto statusArray = methodCall.newParamValue().getArray(); + statusArray.addValue().set(std::string("gid")); + auto responseContent = doRequest(methodCall); + MethodResponse response(responseContent); + std::vector waitingGID; + int index = 0; + while(true) { + try { + auto structNode = response.getParamValue(0).getArray().getValue(index++).getStruct(); + auto gidNode = structNode.getMember("gid"); + waitingGID.push_back(gidNode.getValue().getAsS()); + } catch (InvalidRPCNode& e) { break; } + } + return waitingGID; +} + void Aria2::saveSession() { MethodCall methodCall("aria2.saveSession", m_secret); @@ -199,5 +219,18 @@ void Aria2::shutdown() doRequest(methodCall); } +void Aria2::pause(const std::string& gid) +{ + MethodCall methodCall("aria2.pause", m_secret); + methodCall.newParamValue().set(gid); + doRequest(methodCall); +} + +void Aria2::unpause(const std::string& gid) +{ + MethodCall methodCall("aria2.unpause", m_secret); + methodCall.newParamValue().set(gid); + doRequest(methodCall); +} } // end namespace kiwix diff --git a/src/aria2.h b/src/aria2.h index 16b753cc..9f073371 100644 --- a/src/aria2.h +++ b/src/aria2.h @@ -37,8 +37,11 @@ class Aria2 std::string addUri(const std::vector& uri); std::string tellStatus(const std::string& gid, const std::vector& statusKey); std::vector tellActive(); + std::vector tellWaiting(); void saveSession(); void shutdown(); + void pause(const std::string& gid); + void unpause(const std::string& gid); }; }; //end namespace kiwix diff --git a/src/downloader.cpp b/src/downloader.cpp index fe34b902..5d1e5e48 100644 --- a/src/downloader.cpp +++ b/src/downloader.cpp @@ -93,6 +93,24 @@ void Download::updateStatus(bool follow) } } +void Download::resumeDownload() +{ + if (!m_followedBy.empty()) + mp_aria->unpause(m_followedBy); + else + mp_aria->unpause(m_did); + updateStatus(true); +} + +void Download::pauseDownload() +{ + if (!m_followedBy.empty()) + mp_aria->pause(m_followedBy); + else + mp_aria->pause(m_did); + updateStatus(true); +} + /* Constructor */ Downloader::Downloader() : mp_aria(new Aria2()) @@ -101,6 +119,10 @@ Downloader::Downloader() : m_knownDownloads[gid] = std::unique_ptr(new Download(mp_aria, gid)); m_knownDownloads[gid]->updateStatus(); } + for (auto gid : mp_aria->tellWaiting()) { + m_knownDownloads[gid] = std::unique_ptr(new Download(mp_aria, gid)); + m_knownDownloads[gid]->updateStatus(); + } } @@ -145,10 +167,17 @@ Download* Downloader::getDownload(const std::string& did) for (auto gid : mp_aria->tellActive()) { if (gid == did) { m_knownDownloads[gid] = std::unique_ptr(new Download(mp_aria, gid)); - m_knownDownloads.at(gid).get()->updateStatus(true); + m_knownDownloads.at(gid).get()->updateStatus(true); return m_knownDownloads[gid].get(); } } + for (auto gid : mp_aria->tellWaiting()) { + if (gid == did) { + m_knownDownloads[gid] = std::unique_ptr(new Download(mp_aria, gid)); + m_knownDownloads.at(gid).get()->updateStatus(true); + return m_knownDownloads[gid].get(); + } + } throw e; } }