summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-05-01 16:58:34 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-05-01 16:58:34 +0900
commitbbc8866cfb28c1ca867672f963b23803a65877f1 (patch)
tree5b74bcec51f3e39a0ee1deda174b571702bb8848
parent4c50544f1aff35ffbe467e6aaf74c9f57ec73a57 (diff)
Add removeDownload, pauseDownload and unpauseDownload API function
-rw-r--r--src/RpcMethodImpl.cc50
-rw-r--r--src/RpcMethodImpl.h3
-rw-r--r--src/aria2api.cc58
-rw-r--r--src/includes/aria2/aria2.h6
4 files changed, 91 insertions, 26 deletions
diff --git a/src/RpcMethodImpl.cc b/src/RpcMethodImpl.cc
index 56b5bbcf..fa6d5a3b 100644
--- a/src/RpcMethodImpl.cc
+++ b/src/RpcMethodImpl.cc
@@ -422,32 +422,6 @@ SharedHandle<ValueBase> ForceRemoveRpcMethod::process
}
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
diff --git a/src/RpcMethodImpl.h b/src/RpcMethodImpl.h
index 00d64193..90e439c4 100644
--- a/src/RpcMethodImpl.h
+++ b/src/RpcMethodImpl.h
@@ -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
diff --git a/src/aria2api.cc b/src/aria2api.cc
index 4dabd453..9f46e957 100644
--- a/src/aria2api.cc
+++ b/src/aria2api.cc
@@ -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 =
diff --git a/src/includes/aria2/aria2.h b/src/includes/aria2/aria2.h
index 55efc8f6..e44bbe7e 100644
--- a/src/includes/aria2/aria2.h
+++ b/src/includes/aria2/aria2.h
@@ -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