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
pull/1/head
Tatsuhiro Tsujikawa 2010-04-11 09:39:46 +00:00
parent f02e08629e
commit 2e6a517aaa
4 changed files with 58 additions and 17 deletions

View File

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

View File

@ -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()) {

View File

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

View File

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