summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-06-23 15:14:24 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2009-06-23 15:14:24 +0000
commit6b2ab3ffc0d96d66723fa8b43552fd09d2108781 (patch)
tree8d556ed0e0ad4be116396d1fcfda16d90288bc73 /src
parent100ed86b5caebf0c9d68d36378f052dfe0ad56e9 (diff)
2009-06-24 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added tellWaiting XML-RPC method. * src/SingleFileDownloadContext.cc * src/XmlRpcMethodFactory.cc * src/XmlRpcMethodImpl.cc * src/XmlRpcMethodImpl.h * test/XmlRpcMethodTest.cc
Diffstat (limited to 'src')
-rw-r--r--src/SingleFileDownloadContext.cc6
-rw-r--r--src/XmlRpcMethodFactory.cc2
-rw-r--r--src/XmlRpcMethodImpl.cc42
-rw-r--r--src/XmlRpcMethodImpl.h5
4 files changed, 54 insertions, 1 deletions
diff --git a/src/SingleFileDownloadContext.cc b/src/SingleFileDownloadContext.cc
index 92332f85..1acbb2b1 100644
--- a/src/SingleFileDownloadContext.cc
+++ b/src/SingleFileDownloadContext.cc
@@ -83,7 +83,11 @@ bool SingleFileDownloadContext::knowsTotalLength() const
size_t SingleFileDownloadContext::getNumPieces() const
{
- return (_fileEntries.front()->getLength()+_pieceLength-1)/_pieceLength;
+ if(_pieceLength == 0) {
+ return 0;
+ } else {
+ return (_fileEntries.front()->getLength()+_pieceLength-1)/_pieceLength;
+ }
}
std::string SingleFileDownloadContext::getActualBasePath() const
diff --git a/src/XmlRpcMethodFactory.cc b/src/XmlRpcMethodFactory.cc
index c42007ab..f6495fc8 100644
--- a/src/XmlRpcMethodFactory.cc
+++ b/src/XmlRpcMethodFactory.cc
@@ -71,6 +71,8 @@ XmlRpcMethodFactory::create(const std::string& methodName)
#endif // ENABLE_BITTORRENT
} else if(methodName == "aria2.tellActive") {
return SharedHandle<XmlRpcMethod>(new TellActiveXmlRpcMethod());
+ } else if(methodName == "aria2.tellWaiting") {
+ return SharedHandle<XmlRpcMethod>(new TellWaitingXmlRpcMethod());
} else if(methodName == "aria2.changeOption") {
return SharedHandle<XmlRpcMethod>(new ChangeOptionXmlRpcMethod());
} else if(methodName == "aria2.changeGlobalOption") {
diff --git a/src/XmlRpcMethodImpl.cc b/src/XmlRpcMethodImpl.cc
index 176f18c0..8bc629a2 100644
--- a/src/XmlRpcMethodImpl.cc
+++ b/src/XmlRpcMethodImpl.cc
@@ -521,6 +521,48 @@ BDE TellActiveXmlRpcMethod::process
return list;
}
+BDE TellWaitingXmlRpcMethod::process
+(const XmlRpcRequest& req, DownloadEngine* e)
+{
+ const BDE& params = req._params;
+ assert(params.isList());
+
+ if(params.size() != 2 ||
+ !params[0].isInteger() || !params[1].isInteger() ||
+ params[0].i() < 0 || params[1].i() < 0) {
+ throw DL_ABORT_EX("Invalid argument. Specify offset and num in integer.");
+ }
+
+ size_t offset = params[0].i();
+ size_t num = params[1].i();
+
+ BDE list = BDE::list();
+ const std::deque<SharedHandle<RequestGroup> >& waitings =
+ e->_requestGroupMan->getReservedGroups();
+ if(waitings.size() <= offset) {
+ return list;
+ }
+ size_t lastDistance;
+ if(waitings.size() < offset+num) {
+ lastDistance = waitings.size();
+ } else {
+ lastDistance = offset+num;
+ }
+ std::deque<SharedHandle<RequestGroup> >::const_iterator first =
+ waitings.begin();
+ std::advance(first, offset);
+ std::deque<SharedHandle<RequestGroup> >::const_iterator last =
+ waitings.begin();
+ std::advance(last, lastDistance);
+ for(; first != last; ++first) {
+ BDE entryDict = BDE::dict();
+ entryDict["status"] = BDE_WAITING;
+ gatherProgress(entryDict, *first, e);
+ list << entryDict;
+ }
+ return list;
+}
+
BDE PurgeDownloadResultXmlRpcMethod::process
(const XmlRpcRequest& req, DownloadEngine* e)
{
diff --git a/src/XmlRpcMethodImpl.h b/src/XmlRpcMethodImpl.h
index 917b198d..765f7748 100644
--- a/src/XmlRpcMethodImpl.h
+++ b/src/XmlRpcMethodImpl.h
@@ -97,6 +97,11 @@ protected:
virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);
};
+class TellWaitingXmlRpcMethod:public XmlRpcMethod {
+protected:
+ virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);
+};
+
class ChangeOptionXmlRpcMethod:public XmlRpcMethod {
protected:
virtual BDE process(const XmlRpcRequest& req, DownloadEngine* e);