Add removeDownload, pauseDownload and unpauseDownload API function

libaria2
Tatsuhiro Tsujikawa 2013-05-01 16:58:34 +09:00
parent 4c50544f1a
commit bbc8866cfb
4 changed files with 91 additions and 26 deletions

View File

@ -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

View File

@ -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

View File

@ -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 =

View File

@ -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