mirror of https://github.com/kiwix/libkiwix.git
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:
parent
12ffad55f7
commit
ec8f1ffe9c
|
@ -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; }
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue