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
pull/1/head
Tatsuhiro Tsujikawa 2009-06-23 15:14:24 +00:00
parent 100ed86b5c
commit 6b2ab3ffc0
6 changed files with 118 additions and 1 deletions

View File

@ -1,3 +1,12 @@
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
2009-06-24 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Updated CookieStorageTest

View File

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

View File

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

View File

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

View File

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

View File

@ -49,6 +49,8 @@ class XmlRpcMethodTest:public CppUnit::TestFixture {
CPPUNIT_TEST(testChangeGlobalOption);
CPPUNIT_TEST(testChangeGlobalOption_withBadOption);
CPPUNIT_TEST(testTellStatus_withoutGid);
CPPUNIT_TEST(testTellWaiting);
CPPUNIT_TEST(testTellWaiting_fail);
CPPUNIT_TEST(testNoSuchMethod);
CPPUNIT_TEST_SUITE_END();
private:
@ -60,6 +62,7 @@ public:
RequestGroup::resetGIDCounter();
_option.reset(new Option());
_option->put(PREF_DIR, "/tmp");
_option->put(PREF_SEGMENT_SIZE, "1048576");
_e.reset(new DownloadEngine(SharedHandle<EventPoll>(new SelectEventPoll())));
_e->option = _option.get();
_e->_requestGroupMan.reset
@ -93,6 +96,8 @@ public:
void testChangeGlobalOption();
void testChangeGlobalOption_withBadOption();
void testTellStatus_withoutGid();
void testTellWaiting();
void testTellWaiting_fail();
void testNoSuchMethod();
};
@ -461,6 +466,56 @@ void XmlRpcMethodTest::testTellStatus_withoutGid()
CPPUNIT_ASSERT_EQUAL(1, res._code);
}
static void addUri(const std::string& uri,
const SharedHandle<DownloadEngine>& e)
{
AddUriXmlRpcMethod m;
XmlRpcRequest req("aria2.addUri", BDE::list());
req._params << BDE::list();
req._params[0] << BDE(uri);
CPPUNIT_ASSERT_EQUAL(0, m.execute(req, e.get())._code);
}
void XmlRpcMethodTest::testTellWaiting()
{
addUri("http://1/", _e);
addUri("http://2/", _e);
addUri("http://3/", _e);
addUri("http://4/", _e);
TellWaitingXmlRpcMethod m;
XmlRpcRequest req("aria2.tellWaiting", BDE::list());
req._params << BDE((int64_t)1);
req._params << BDE((int64_t)2);
XmlRpcResponse res = m.execute(req, _e.get());
CPPUNIT_ASSERT_EQUAL(0, res._code);
CPPUNIT_ASSERT_EQUAL((size_t)2, res._param.size());
CPPUNIT_ASSERT_EQUAL(std::string("2"), res._param[0]["gid"].s());
CPPUNIT_ASSERT_EQUAL(std::string("3"), res._param[1]["gid"].s());
// waiting.size() == offset+num
req = XmlRpcRequest("aria2.tellWaiting", BDE::list());
req._params << BDE((int64_t)1);
req._params << BDE((int64_t)3);
res = m.execute(req, _e.get());
CPPUNIT_ASSERT_EQUAL(0, res._code);
CPPUNIT_ASSERT_EQUAL((size_t)3, res._param.size());
// waiting.size() < offset+num
req = XmlRpcRequest("aria2.tellWaiting", BDE::list());
req._params << BDE((int64_t)1);
req._params << BDE((int64_t)4);
res = m.execute(req, _e.get());
CPPUNIT_ASSERT_EQUAL(0, res._code);
CPPUNIT_ASSERT_EQUAL((size_t)3, res._param.size());
}
void XmlRpcMethodTest::testTellWaiting_fail()
{
TellWaitingXmlRpcMethod m;
XmlRpcRequest req("aria2.tellWaiting", BDE::list());
XmlRpcResponse res = m.execute(req, _e.get());
CPPUNIT_ASSERT_EQUAL(1, res._code);
}
} // namespace xmlrpc
} // namespace aria2