浏览代码

Add removeDownload, pauseDownload and unpauseDownload API function

Tatsuhiro Tsujikawa 12 年之前
父节点
当前提交
bbc8866cfb
共有 4 个文件被更改,包括 91 次插入26 次删除
  1. 24 26
      src/RpcMethodImpl.cc
  2. 3 0
      src/RpcMethodImpl.h
  3. 58 0
      src/aria2api.cc
  4. 6 0
      src/includes/aria2/aria2.h

+ 24 - 26
src/RpcMethodImpl.cc

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

+ 3 - 0
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

+ 58 - 0
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 =

+ 6 - 0
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