mirror of https://github.com/aria2/aria2
Add removeDownload, pauseDownload and unpauseDownload API function
parent
4c50544f1a
commit
bbc8866cfb
|
@ -421,32 +421,6 @@ SharedHandle<ValueBase> ForceRemoveRpcMethod::process
|
|||
return removeDownload(req, e, true);
|
||||
}
|
||||
|
||||
namespace {
|
||||
bool pauseRequestGroup
|
||||
(const SharedHandle<RequestGroup>& group, bool reserved, bool forcePause)
|
||||
{
|
||||
if((reserved && !group->isPauseRequested()) ||
|
||||
(!reserved &&
|
||||
!group->isForceHaltRequested() &&
|
||||
((forcePause && group->isHaltRequested() && group->isPauseRequested()) ||
|
||||
(!group->isHaltRequested() && !group->isPauseRequested())))) {
|
||||
if(!reserved) {
|
||||
// Call setHaltRequested before setPauseRequested because
|
||||
// setHaltRequested calls setPauseRequested(false) internally.
|
||||
if(forcePause) {
|
||||
group->setForceHaltRequested(true, RequestGroup::NONE);
|
||||
} else {
|
||||
group->setHaltRequested(true, RequestGroup::NONE);
|
||||
}
|
||||
}
|
||||
group->setPauseRequested(true);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
namespace {
|
||||
SharedHandle<ValueBase> pauseDownload
|
||||
(const RpcRequest& req, DownloadEngine* e, bool forcePause)
|
||||
|
@ -1546,4 +1520,28 @@ SharedHandle<ValueBase> NoSuchMethodRpcMethod::process
|
|||
|
||||
} // namespace rpc
|
||||
|
||||
bool pauseRequestGroup
|
||||
(const SharedHandle<RequestGroup>& group, bool reserved, bool forcePause)
|
||||
{
|
||||
if((reserved && !group->isPauseRequested()) ||
|
||||
(!reserved &&
|
||||
!group->isForceHaltRequested() &&
|
||||
((forcePause && group->isHaltRequested() && group->isPauseRequested()) ||
|
||||
(!group->isHaltRequested() && !group->isPauseRequested())))) {
|
||||
if(!reserved) {
|
||||
// Call setHaltRequested before setPauseRequested because
|
||||
// setHaltRequested calls setPauseRequested(false) internally.
|
||||
if(forcePause) {
|
||||
group->setForceHaltRequested(true, RequestGroup::NONE);
|
||||
} else {
|
||||
group->setHaltRequested(true, RequestGroup::NONE);
|
||||
}
|
||||
}
|
||||
group->setPauseRequested(true);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
|
@ -605,6 +605,9 @@ void gatherBitTorrentMetadata
|
|||
|
||||
} // namespace rpc
|
||||
|
||||
bool pauseRequestGroup
|
||||
(const SharedHandle<RequestGroup>& group, bool reserved, bool forcePause);
|
||||
|
||||
} // namespace aria2
|
||||
|
||||
#endif // D_RPC_METHOD_IMPL_H
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
#include "FileEntry.h"
|
||||
#include "BitfieldMan.h"
|
||||
#include "DownloadContext.h"
|
||||
#include "RpcMethodImpl.h"
|
||||
|
||||
namespace aria2 {
|
||||
|
||||
|
@ -207,6 +208,63 @@ int addUri(Session* session,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int removeDownload(Session* session, const A2Gid& gid, bool force)
|
||||
{
|
||||
const SharedHandle<DownloadEngine>& e =
|
||||
session->context->reqinfo->getDownloadEngine();
|
||||
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||
if(group) {
|
||||
if(group->getState() == RequestGroup::STATE_ACTIVE) {
|
||||
if(force) {
|
||||
group->setForceHaltRequested(true, RequestGroup::USER_REQUEST);
|
||||
} else {
|
||||
group->setHaltRequested(true, RequestGroup::USER_REQUEST);
|
||||
}
|
||||
e->setRefreshInterval(0);
|
||||
} else {
|
||||
if(group->isDependencyResolved()) {
|
||||
e->getRequestGroupMan()->removeReservedGroup(gid);
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int pauseDownload(Session* session, const A2Gid& gid, bool force)
|
||||
{
|
||||
const SharedHandle<DownloadEngine>& e =
|
||||
session->context->reqinfo->getDownloadEngine();
|
||||
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||
if(group) {
|
||||
bool reserved = group->getState() == RequestGroup::STATE_WAITING;
|
||||
if(pauseRequestGroup(group, reserved, force)) {
|
||||
e->setRefreshInterval(0);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int unpauseDownload(Session* session, const A2Gid& gid)
|
||||
{
|
||||
const SharedHandle<DownloadEngine>& e =
|
||||
session->context->reqinfo->getDownloadEngine();
|
||||
SharedHandle<RequestGroup> group = e->getRequestGroupMan()->findGroup(gid);
|
||||
if(!group ||
|
||||
group->getState() != RequestGroup::STATE_WAITING ||
|
||||
!group->isPauseRequested()) {
|
||||
return -1;
|
||||
} else {
|
||||
group->setPauseRequested(false);
|
||||
e->getRequestGroupMan()->requestQueueCheck();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::vector<A2Gid> getActiveDownload(Session* session)
|
||||
{
|
||||
const SharedHandle<DownloadEngine>& e =
|
||||
|
|
|
@ -134,6 +134,12 @@ int addUri(Session* session,
|
|||
// Returns the array of active download GID.
|
||||
std::vector<A2Gid> getActiveDownload(Session* session);
|
||||
|
||||
int removeDownload(Session* session, const A2Gid& gid, bool force = false);
|
||||
|
||||
int pauseDownload(Session* session, const A2Gid& gid, bool force = false);
|
||||
|
||||
int unpauseDownload(Session* session, const A2Gid& gid);
|
||||
|
||||
enum UriStatus {
|
||||
URI_USED,
|
||||
URI_WAITING
|
||||
|
|
Loading…
Reference in New Issue