From 5dcc2b7842120222f6e15db37e7c9d7f8d73c797 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 14 May 2013 23:00:21 +0900 Subject: [PATCH] Add DownloadHandle::getBtMetaInfo() API --- src/aria2api.cc | 24 ++++++++++++++++ src/includes/aria2/aria2.h | 56 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/src/aria2api.cc b/src/aria2api.cc index 356b7515..93028ca9 100644 --- a/src/aria2api.cc +++ b/src/aria2api.cc @@ -590,6 +590,26 @@ struct RequestGroupDH : public DownloadHandle { } return createFileData(dctx->getFileEntries()[index-1], index, &bf); } + virtual BtMetaInfoData getBtMetaInfo() + { + BtMetaInfoData res; +#ifdef ENABLE_BITTORRENT + if(group->getDownloadContext()->hasAttribute(CTX_ATTR_BT)) { + SharedHandle torrentAttrs = + bittorrent::getTorrentAttrs(group->getDownloadContext()); + res.announceList = torrentAttrs->announceList; + res.comment = torrentAttrs->comment; + res.creationDate = torrentAttrs->creationDate; + // TODO Use BtFileMode for torrentAttrs->mode + res.mode = torrentAttrs->mode == "single" ? + BT_FILE_MODE_SINGLE : BT_FILE_MODE_MULTI; + if(!torrentAttrs->metadata.empty()) { + res.name = torrentAttrs->name; + } + } +#endif // ENABLE_BITTORRENT + return res; + } SharedHandle group; TransferStat ts; }; @@ -687,6 +707,10 @@ struct DownloadResultDH : public DownloadHandle { dr->bitfield.size()); return createFileData(dr->fileEntries[index-1], index, &bf); } + virtual BtMetaInfoData getBtMetaInfo() + { + return BtMetaInfoData(); + } SharedHandle dr; }; } // namespace diff --git a/src/includes/aria2/aria2.h b/src/includes/aria2/aria2.h index 86ef420d..4929576b 100644 --- a/src/includes/aria2/aria2.h +++ b/src/includes/aria2/aria2.h @@ -447,6 +447,55 @@ struct FileData { std::vector uris; }; +/** + * @enum + * + * BitTorrent file mode + */ +enum BtFileMode { + /** + * Indicating single file torrent + */ + BT_FILE_MODE_SINGLE, + /** + * Indicating multi file torrent + */ + BT_FILE_MODE_MULTI +}; + +/** + * @struct + * + * BitTorrent metainfo data retrieved from ".torrent" file. + */ +struct BtMetaInfoData { + /** + * List of lists of announce URI. If ".torrent" file contains + * ``announce`` and no ``announce-list``, ``announce`` is converted + * to ``announce-list`` format. + */ + std::vector > announceList; + /** + * ``comment`` for the torrent. ``comment.utf-8`` is used if + * available. + */ + std::string comment; + /** + * The creation time of the torrent. The value is an integer since + * the Epoch, measured in seconds. + */ + time_t creationDate; + /** + * File mode of the torrent. + */ + BtFileMode mode; + /** + * ``name`` in ``info`` dictionary. ``name.utf-8`` is used if + * available. + */ + std::string name; +}; + /** * @enum * @@ -579,6 +628,13 @@ public: * is out-of-bound. */ virtual FileData getFile(int index) = 0; + /** + * Returns the information retrieved from ".torrent" file. This + * function is only meaningful only when BitTorrent transfer is + * involved in the download and the download is not + * stopped/completed. + */ + virtual BtMetaInfoData getBtMetaInfo() = 0; }; /**