diff --git a/include/downloader.h b/include/downloader.h index 1fa439f25..43efee9d9 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 92c4095d1..c24135a85 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 16b753ccf..9f073371a 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 fe34b9025..5d1e5e482 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; } }