浏览代码

2010-04-11 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Added aria2.forcePause XML-RPC command.
	* src/XmlRpcMethodFactory.cc
	* src/XmlRpcMethodImpl.cc
	* src/XmlRpcMethodImpl.h
Tatsuhiro Tsujikawa 15 年之前
父节点
当前提交
2e6a517aaa
共有 4 个文件被更改,包括 58 次插入17 次删除
  1. 7 0
      ChangeLog
  2. 2 0
      src/XmlRpcMethodFactory.cc
  3. 38 17
      src/XmlRpcMethodImpl.cc
  4. 11 0
      src/XmlRpcMethodImpl.h

+ 7 - 0
ChangeLog

@@ -1,3 +1,10 @@
+2010-04-11  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Added aria2.forcePause XML-RPC command.
+	* src/XmlRpcMethodFactory.cc
+	* src/XmlRpcMethodImpl.cc
+	* src/XmlRpcMethodImpl.h
+
 2010-04-11  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Use global::wallclock

+ 2 - 0
src/XmlRpcMethodFactory.cc

@@ -60,6 +60,8 @@ XmlRpcMethodFactory::create(const std::string& methodName)
     return SharedHandle<XmlRpcMethod>(new RemoveXmlRpcMethod());
   } else if(methodName == PauseXmlRpcMethod::getMethodName()) {
     return SharedHandle<XmlRpcMethod>(new PauseXmlRpcMethod());
+  } else if(methodName == ForcePauseXmlRpcMethod::getMethodName()) {
+    return SharedHandle<XmlRpcMethod>(new ForcePauseXmlRpcMethod());
   } else if(methodName == UnpauseXmlRpcMethod::getMethodName()) {
     return SharedHandle<XmlRpcMethod>(new UnpauseXmlRpcMethod());
   } else if(methodName == ForceRemoveXmlRpcMethod::getMethodName()) {

+ 38 - 17
src/XmlRpcMethodImpl.cc

@@ -152,6 +152,17 @@ static BDE addRequestGroup(const SharedHandle<RequestGroup>& group,
   return createGIDResponse(group->getGID());
 }
 
+static
+SharedHandle<RequestGroup>
+findRequestGroup(const SharedHandle<RequestGroupMan>& rgman, gid_t gid)
+{
+  SharedHandle<RequestGroup> group = rgman->findRequestGroup(gid);
+  if(group.isNull()) {
+    group = rgman->findReservedGroup(gid);
+  }
+  return group;
+}
+
 static bool hasDictParam(const BDE& params, size_t index)
 {
   return params.size() > index && params[index].isDict();
@@ -337,7 +348,21 @@ BDE ForceRemoveXmlRpcMethod::process
   return removeDownload(req, e, true);
 }
 
-BDE PauseXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e)
+static void pauseRequestGroup
+(const SharedHandle<RequestGroup>& group, bool forcePause)
+{
+  // Call setHaltRequested before setPauseRequested because
+  // setHaltRequested calls setPauseRequested(false) internally.
+  if(forcePause) {
+    group->setForceHaltRequested(true, RequestGroup::USER_REQUEST);
+  } else {
+    group->setHaltRequested(true, RequestGroup::USER_REQUEST);
+  }
+  group->setPauseRequested(true);
+}
+
+static BDE pauseDownload
+(const XmlRpcRequest& req, DownloadEngine* e, bool forcePause)
 {
   const BDE& params = req._params;
   assert(params.isList());
@@ -345,20 +370,27 @@ BDE PauseXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e)
     throw DL_ABORT_EX(MSG_GID_NOT_PROVIDED);
   }
   gid_t gid = util::parseLLInt(params[0].s());
-  SharedHandle<RequestGroup> group = e->_requestGroupMan->findRequestGroup(gid);
+  SharedHandle<RequestGroup> group = findRequestGroup(e->_requestGroupMan, gid);
   if(group.isNull() || group->isHaltRequested()) {
     throw DL_ABORT_EX
       (StringFormat("GID#%s cannot be paused now",
                     util::itos(gid).c_str()).str());
   } else {
-    // Call setHaltRequested before setPauseRequested because
-    // setHaltRequested calls setPauseRequested(false) internally.
-    group->setHaltRequested(true, RequestGroup::USER_REQUEST);
-    group->setPauseRequested(true);
+    pauseRequestGroup(group, forcePause);
   }
   return createGIDResponse(gid);
 }
 
+BDE PauseXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e)
+{
+  return pauseDownload(req, e, false);
+}
+
+BDE ForcePauseXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e)
+{
+  return pauseDownload(req, e, true);
+}
+
 BDE UnpauseXmlRpcMethod::process(const XmlRpcRequest& req, DownloadEngine* e)
 {
   const BDE& params = req._params;
@@ -587,17 +619,6 @@ void gatherStoppedDownload
   entryDict[KEY_FILES] = files;
 }
 
-static
-SharedHandle<RequestGroup>
-findRequestGroup(const SharedHandle<RequestGroupMan>& rgman, gid_t gid)
-{
-  SharedHandle<RequestGroup> group = rgman->findRequestGroup(gid);
-  if(group.isNull()) {
-    group = rgman->findReservedGroup(gid);
-  }
-  return group;
-}
-
 BDE GetFilesXmlRpcMethod::process
 (const XmlRpcRequest& req, DownloadEngine* e)
 {

+ 11 - 0
src/XmlRpcMethodImpl.h

@@ -95,6 +95,17 @@ public:
   }
 };
 
+class ForcePauseXmlRpcMethod:public XmlRpcMethod {
+protected:
+  virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);
+public:
+  static const std::string& getMethodName()
+  {
+    static std::string methodName = "aria2.forcePause";
+    return methodName;
+  }
+};
+
 class UnpauseXmlRpcMethod:public XmlRpcMethod {
 protected:
   virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);