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.
This commit is contained in:
luddens 2019-04-29 11:25:35 +02:00 committed by Matthieu Gautier
parent 12ffad55f7
commit ec8f1ffe9c
4 changed files with 69 additions and 2 deletions

View File

@ -54,6 +54,8 @@ class Download {
m_status(K_UNKNOWN), m_status(K_UNKNOWN),
m_did(did) {}; m_did(did) {};
void updateStatus(bool follow=false); void updateStatus(bool follow=false);
void pauseDownload();
void resumeDownload();
StatusResult getStatus() { return m_status; } StatusResult getStatus() { return m_status; }
std::string getDid() { return m_did; } std::string getDid() { return m_did; }
std::string getFollowedBy() { return m_followedBy; } std::string getFollowedBy() { return m_followedBy; }

View File

@ -171,7 +171,6 @@ std::vector<std::string> Aria2::tellActive()
MethodCall methodCall("aria2.tellActive", m_secret); MethodCall methodCall("aria2.tellActive", m_secret);
auto statusArray = methodCall.newParamValue().getArray(); auto statusArray = methodCall.newParamValue().getArray();
statusArray.addValue().set(std::string("gid")); statusArray.addValue().set(std::string("gid"));
statusArray.addValue().set(std::string("following"));
auto responseContent = doRequest(methodCall); auto responseContent = doRequest(methodCall);
MethodResponse response(responseContent); MethodResponse response(responseContent);
std::vector<std::string> activeGID; std::vector<std::string> activeGID;
@ -186,6 +185,27 @@ std::vector<std::string> Aria2::tellActive()
return activeGID; return activeGID;
} }
std::vector<std::string> 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<std::string> 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() void Aria2::saveSession()
{ {
MethodCall methodCall("aria2.saveSession", m_secret); MethodCall methodCall("aria2.saveSession", m_secret);
@ -199,5 +219,18 @@ void Aria2::shutdown()
doRequest(methodCall); 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 } // end namespace kiwix

View File

@ -37,8 +37,11 @@ class Aria2
std::string addUri(const std::vector<std::string>& uri); std::string addUri(const std::vector<std::string>& uri);
std::string tellStatus(const std::string& gid, const std::vector<std::string>& statusKey); std::string tellStatus(const std::string& gid, const std::vector<std::string>& statusKey);
std::vector<std::string> tellActive(); std::vector<std::string> tellActive();
std::vector<std::string> tellWaiting();
void saveSession(); void saveSession();
void shutdown(); void shutdown();
void pause(const std::string& gid);
void unpause(const std::string& gid);
}; };
}; //end namespace kiwix }; //end namespace kiwix

View File

@ -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 */ /* Constructor */
Downloader::Downloader() : Downloader::Downloader() :
mp_aria(new Aria2()) mp_aria(new Aria2())
@ -101,6 +119,10 @@ Downloader::Downloader() :
m_knownDownloads[gid] = std::unique_ptr<Download>(new Download(mp_aria, gid)); m_knownDownloads[gid] = std::unique_ptr<Download>(new Download(mp_aria, gid));
m_knownDownloads[gid]->updateStatus(); m_knownDownloads[gid]->updateStatus();
} }
for (auto gid : mp_aria->tellWaiting()) {
m_knownDownloads[gid] = std::unique_ptr<Download>(new Download(mp_aria, gid));
m_knownDownloads[gid]->updateStatus();
}
} }
@ -148,6 +170,13 @@ Download* Downloader::getDownload(const std::string& did)
m_knownDownloads.at(gid).get()->updateStatus(true); m_knownDownloads.at(gid).get()->updateStatus(true);
return m_knownDownloads[gid].get(); return m_knownDownloads[gid].get();
} }
}
for (auto gid : mp_aria->tellWaiting()) {
if (gid == did) {
m_knownDownloads[gid] = std::unique_ptr<Download>(new Download(mp_aria, gid));
m_knownDownloads.at(gid).get()->updateStatus(true);
return m_knownDownloads[gid].get();
}
} }
throw e; throw e;
} }