summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2016-03-05 13:55:59 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2016-03-05 14:20:42 +0900
commit21754fa103647395b3eeb100506ce1b12aaed60a (patch)
tree348da82a87d3ab98af314ea2ccfd4341435f1f25
parent74811ddaff123e331368f69d93de4c9741f82fee (diff)
Add following to aria2.tellStatus response key as reverse link for followedBy
-rw-r--r--doc/manual-src/en/aria2c.rst4
-rw-r--r--src/BtPostDownloadHandler.cc3
-rw-r--r--src/DownloadResult.h3
-rw-r--r--src/MetalinkPostDownloadHandler.cc3
-rw-r--r--src/RequestGroup.cc2
-rw-r--r--src/RequestGroup.h8
-rw-r--r--src/RpcMethodImpl.cc11
-rw-r--r--src/UTMetadataPostDownloadHandler.cc4
-rw-r--r--src/aria2api.cc2
-rw-r--r--src/includes/aria2/aria2.h6
-rw-r--r--test/BtPostDownloadHandlerTest.cc3
-rw-r--r--test/MetalinkPostDownloadHandlerTest.cc4
-rw-r--r--test/RpcMethodTest.cc7
-rw-r--r--test/UTMetadataPostDownloadHandlerTest.cc1
14 files changed, 60 insertions, 1 deletions
diff --git a/doc/manual-src/en/aria2c.rst b/doc/manual-src/en/aria2c.rst
index 5f6fc155..473c9431 100644
--- a/doc/manual-src/en/aria2c.rst
+++ b/doc/manual-src/en/aria2c.rst
@@ -2548,6 +2548,10 @@ For information on the *secret* parameter, see :ref:`rpc_auth`.
auto-generated downloads. If there are no such downloads, this key will not
be included in the response.
+ ``following``
+ The reverse link for ``followedBy``. A download included in
+ ``followedBy`` has this object's GID in its ``following`` value.
+
``belongsTo``
GID of a parent download. Some downloads are a part of another
download. For example, if a file in a Metalink has BitTorrent
diff --git a/src/BtPostDownloadHandler.cc b/src/BtPostDownloadHandler.cc
index a6c40833..493b69c9 100644
--- a/src/BtPostDownloadHandler.cc
+++ b/src/BtPostDownloadHandler.cc
@@ -104,6 +104,9 @@ void BtPostDownloadHandler::getNextRequestGroups(
std::vector<std::string>(), "",
torrent.get());
requestGroup->followedBy(std::begin(newRgs), std::end(newRgs));
+ for (auto& rg : newRgs) {
+ rg->following(requestGroup->getGID());
+ }
auto mi = createMetadataInfoFromFirstFileEntry(
requestGroup->getGroupId(), requestGroup->getDownloadContext());
if (mi) {
diff --git a/src/DownloadResult.h b/src/DownloadResult.h
index b7736238..7cdc72bb 100644
--- a/src/DownloadResult.h
+++ b/src/DownloadResult.h
@@ -79,6 +79,9 @@ struct DownloadResult {
// RequestGroup.cc::followedByGIDs_.
std::vector<a2_gid_t> followedBy;
+ // The reverse link for followedBy.
+ a2_gid_t following;
+
std::string bitfield;
std::string infoHash;
diff --git a/src/MetalinkPostDownloadHandler.cc b/src/MetalinkPostDownloadHandler.cc
index 432792d6..651ed0af 100644
--- a/src/MetalinkPostDownloadHandler.cc
+++ b/src/MetalinkPostDownloadHandler.cc
@@ -104,6 +104,9 @@ void MetalinkPostDownloadHandler::getNextRequestGroups(
Metalink2RequestGroup().generate(newRgs, diskAdaptor,
requestGroup->getOption(), baseUri);
requestGroup->followedBy(newRgs.begin(), newRgs.end());
+ for (auto& rg : newRgs) {
+ rg->following(requestGroup->getGID());
+ }
auto mi = createMetadataInfoFromFirstFileEntry(
requestGroup->getGroupId(), requestGroup->getDownloadContext());
if (mi) {
diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc
index 40db093d..36f0947b 100644
--- a/src/RequestGroup.cc
+++ b/src/RequestGroup.cc
@@ -131,6 +131,7 @@ RequestGroup::RequestGroup(const std::shared_ptr<GroupId>& gid,
btRuntime_(nullptr),
peerStorage_(nullptr),
#endif // ENABLE_BITTORRENT
+ followingGID_(0),
lastModifiedTime_(Time::null()),
timeout_(option->getAsInt(PREF_TIMEOUT)),
state_(STATE_WAITING),
@@ -1120,6 +1121,7 @@ std::shared_ptr<DownloadResult> RequestGroup::createDownloadResult() const
res->result = result.first;
res->resultMessage = result.second;
res->followedBy = followedByGIDs_;
+ res->following = followingGID_;
res->belongsTo = belongsToGID_;
res->option = option_;
res->metadataInfo = metadataInfo_;
diff --git a/src/RequestGroup.h b/src/RequestGroup.h
index fcb09cd5..0d94c5da 100644
--- a/src/RequestGroup.h
+++ b/src/RequestGroup.h
@@ -125,6 +125,10 @@ private:
// has the GID of generated RequestGroups. empty list means there is
// no such RequestGroup.
std::vector<a2_gid_t> followedByGIDs_;
+ // This is a reverse link against followedByGIDs_. For example, a
+ // download included in followedByGIDs_ has this download's GID in
+ // followingGID_.
+ a2_gid_t followingGID_;
std::vector<const PreDownloadHandler*> preDownloadHandlers_;
@@ -455,6 +459,10 @@ public:
const std::vector<a2_gid_t>& followedBy() const { return followedByGIDs_; }
+ void following(a2_gid_t gid) { followingGID_ = gid; }
+
+ a2_gid_t following() const { return followingGID_; }
+
void belongsTo(a2_gid_t gid) { belongsToGID_ = gid; }
a2_gid_t belongsTo() const { return belongsToGID_; }
diff --git a/src/RpcMethodImpl.cc b/src/RpcMethodImpl.cc
index 7cded6ab..e8fccd62 100644
--- a/src/RpcMethodImpl.cc
+++ b/src/RpcMethodImpl.cc
@@ -108,6 +108,7 @@ const char KEY_BITFIELD[] = "bitfield";
const char KEY_PIECE_LENGTH[] = "pieceLength";
const char KEY_NUM_PIECES[] = "numPieces";
const char KEY_FOLLOWED_BY[] = "followedBy";
+const char KEY_FOLLOWING[] = "following";
const char KEY_BELONGS_TO[] = "belongsTo";
const char KEY_INFO_HASH[] = "infoHash";
const char KEY_NUM_SEEDERS[] = "numSeeders";
@@ -664,6 +665,11 @@ void gatherProgressCommon(Dict* entryDict,
entryDict->put(KEY_FOLLOWED_BY, std::move(list));
}
}
+ if (requested_key(keys, KEY_FOLLOWING)) {
+ if (group->following()) {
+ entryDict->put(KEY_FOLLOWING, GroupId::toHex(group->following()));
+ }
+ }
if (requested_key(keys, KEY_BELONGS_TO)) {
if (group->belongsTo()) {
entryDict->put(KEY_BELONGS_TO, GroupId::toHex(group->belongsTo()));
@@ -824,6 +830,11 @@ void gatherStoppedDownload(Dict* entryDict,
entryDict->put(KEY_FOLLOWED_BY, std::move(list));
}
}
+ if (requested_key(keys, KEY_FOLLOWING)) {
+ if (ds->following) {
+ entryDict->put(KEY_FOLLOWING, GroupId::toHex(ds->following));
+ }
+ }
if (requested_key(keys, KEY_BELONGS_TO)) {
if (ds->belongsTo) {
entryDict->put(KEY_BELONGS_TO, GroupId::toHex(ds->belongsTo));
diff --git a/src/UTMetadataPostDownloadHandler.cc b/src/UTMetadataPostDownloadHandler.cc
index b6372b33..f66d9adb 100644
--- a/src/UTMetadataPostDownloadHandler.cc
+++ b/src/UTMetadataPostDownloadHandler.cc
@@ -104,11 +104,13 @@ void UTMetadataPostDownloadHandler::getNextRequestGroups(
std::vector<std::string>(), A2STR::NIL,
torrent, false);
requestGroup->followedBy(newRgs.begin(), newRgs.end());
+ for (auto& rg : newRgs) {
+ rg->following(requestGroup->getGID());
+ }
if (requestGroup->getMetadataInfo()) {
setMetadataInfo(newRgs.begin(), newRgs.end(),
requestGroup->getMetadataInfo());
}
-
auto rgman = requestGroup->getRequestGroupMan();
if (rgman && rgman->getKeepRunning() &&
diff --git a/src/aria2api.cc b/src/aria2api.cc
index b7a8b268..b3403a2c 100644
--- a/src/aria2api.cc
+++ b/src/aria2api.cc
@@ -727,6 +727,7 @@ struct RequestGroupDH : public DownloadHandle {
{
return group->followedBy();
}
+ virtual A2Gid getFollowing() CXX11_OVERRIDE { return group->following(); }
virtual A2Gid getBelongsTo() CXX11_OVERRIDE { return group->belongsTo(); }
virtual const std::string& getDir() CXX11_OVERRIDE
{
@@ -828,6 +829,7 @@ struct DownloadResultDH : public DownloadHandle {
{
return dr->followedBy;
}
+ virtual A2Gid getFollowing() CXX11_OVERRIDE { return dr->following; }
virtual A2Gid getBelongsTo() CXX11_OVERRIDE { return dr->belongsTo; }
virtual const std::string& getDir() CXX11_OVERRIDE { return dr->dir; }
virtual std::vector<FileData> getFiles() CXX11_OVERRIDE
diff --git a/src/includes/aria2/aria2.h b/src/includes/aria2/aria2.h
index dbfbe8ae..e13f0bac 100644
--- a/src/includes/aria2/aria2.h
+++ b/src/includes/aria2/aria2.h
@@ -808,6 +808,12 @@ public:
*/
virtual const std::vector<A2Gid>& getFollowedBy() = 0;
/**
+ * Returns the GID of the download which generated this download.
+ * This is a reverse link of
+ * :func:`DownloadHandle::getFollowedBy()`.
+ */
+ virtual A2Gid getFollowing() = 0;
+ /**
* Returns the GID of a parent download. Some downloads are a part
* of another download. For example, if a file in Metalink has
* BitTorrent resource, the download of ".torrent" is a part of that
diff --git a/test/BtPostDownloadHandlerTest.cc b/test/BtPostDownloadHandlerTest.cc
index 3dff44cb..467b82ab 100644
--- a/test/BtPostDownloadHandlerTest.cc
+++ b/test/BtPostDownloadHandlerTest.cc
@@ -82,6 +82,9 @@ void BtPostDownloadHandlerTest::testGetNextRequestGroups()
bittorrent::getInfoHashString(groups.front()->getDownloadContext()));
CPPUNIT_ASSERT(std::find(rg.followedBy().begin(), rg.followedBy().end(),
groups.front()->getGID()) != rg.followedBy().end());
+ for (auto& nrg : groups) {
+ CPPUNIT_ASSERT_EQUAL(rg.getGID(), nrg->following());
+ }
}
} // namespace aria2
diff --git a/test/MetalinkPostDownloadHandlerTest.cc b/test/MetalinkPostDownloadHandlerTest.cc
index 1f225bb6..66f813b0 100644
--- a/test/MetalinkPostDownloadHandlerTest.cc
+++ b/test/MetalinkPostDownloadHandlerTest.cc
@@ -83,6 +83,10 @@ void MetalinkPostDownloadHandlerTest::testGetNextRequestGroups()
#else
CPPUNIT_ASSERT_EQUAL((size_t)5, groups.size());
#endif // ENABLE_BITTORRENT
+
+ for (auto& nrg : groups) {
+ CPPUNIT_ASSERT_EQUAL(rg.getGID(), nrg->following());
+ }
}
void MetalinkPostDownloadHandlerTest::testGetNextRequestGroups_withBaseUri()
diff --git a/test/RpcMethodTest.cc b/test/RpcMethodTest.cc
index 80b0c1ae..1bcac3af 100644
--- a/test/RpcMethodTest.cc
+++ b/test/RpcMethodTest.cc
@@ -924,6 +924,7 @@ void RpcMethodTest::testGatherStoppedDownload()
d->sessionTime = 1_s;
d->result = error_code::FINISHED;
d->followedBy = followedBy;
+ d->following = 1;
d->belongsTo = 2;
auto entry = Dict::g();
std::vector<std::string> keys;
@@ -934,6 +935,8 @@ void RpcMethodTest::testGatherStoppedDownload()
downcast<String>(followedByRes->get(0))->s());
CPPUNIT_ASSERT_EQUAL(GroupId::toHex(4),
downcast<String>(followedByRes->get(1))->s());
+ CPPUNIT_ASSERT_EQUAL(GroupId::toHex(1),
+ downcast<String>(entry->get("following"))->s());
CPPUNIT_ASSERT_EQUAL(GroupId::toHex(2),
downcast<String>(entry->get("belongsTo"))->s());
@@ -960,6 +963,8 @@ void RpcMethodTest::testGatherProgressCommon()
}
group->followedBy(followedBy.begin(), followedBy.end());
+ auto leader = GroupId::create();
+ group->following(leader->getNumericId());
auto parent = GroupId::create();
group->belongsTo(parent->getNumericId());
@@ -972,6 +977,8 @@ void RpcMethodTest::testGatherProgressCommon()
downcast<String>(followedByRes->get(0))->s());
CPPUNIT_ASSERT_EQUAL(GroupId::toHex(followedBy[1]->getGID()),
downcast<String>(followedByRes->get(1))->s());
+ CPPUNIT_ASSERT_EQUAL(leader->toHex(),
+ downcast<String>(entry->get("following"))->s());
CPPUNIT_ASSERT_EQUAL(parent->toHex(),
downcast<String>(entry->get("belongsTo"))->s());
const List* files = downcast<List>(entry->get("files"));
diff --git a/test/UTMetadataPostDownloadHandlerTest.cc b/test/UTMetadataPostDownloadHandlerTest.cc
index eb0b9258..65f26387 100644
--- a/test/UTMetadataPostDownloadHandlerTest.cc
+++ b/test/UTMetadataPostDownloadHandlerTest.cc
@@ -117,6 +117,7 @@ void UTMetadataPostDownloadHandlerTest::testGetNextRequestGroups()
requestGroup_->followedBy().end(),
newRg->getGID()) !=
requestGroup_->followedBy().end());
+ CPPUNIT_ASSERT_EQUAL(requestGroup_->getGID(), newRg->following());
CPPUNIT_ASSERT(!trfile.exists());
results.clear();