diff --git a/src/main.cpp b/src/main.cpp index 949ff24..95ea215 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -49,6 +49,16 @@ int main(int argc, const char* argv[]) { std::cout << "Creation date: " << torrent.read_creation_date() << '\n'; std::cout << "Comment: " << torrent.read_comment() << '\n'; std::cout << "Announce: " << torrent.read_announce() << '\n'; + { + std::size_t z = 0; + for (const std::vector& sublist : torrent.read_announce_list()) { + std::cout << '\t' << ++z << ": < "; + for (std::string_view announce : sublist) { + std::cout << '"' << announce << "\", "; + } + std::cout << " >\n"; + } + } std::cout << "Is private: " << std::boolalpha << torrent.read_is_private() << '\n'; torrent.print(std::cout); diff --git a/src/torrent_read.cpp b/src/torrent_read.cpp index c9f40bc..92c3532 100644 --- a/src/torrent_read.cpp +++ b/src/torrent_read.cpp @@ -87,6 +87,31 @@ std::string_view build_fast_search_path ( return retval; } + +std::vector grab_all_strings_in_list (const TorrentValue& node) { + const auto path_size = find_int("/[[size]]", node); + std::vector retval; + retval.reserve(path_size); + + { + constexpr char prefix[] = "/[["; + constexpr char postfix[] = "]]"; + constexpr std::size_t prefix_size = sizeof(prefix) / sizeof(prefix[0]) - 1u; + constexpr std::size_t postfix_size = sizeof(postfix) / sizeof(postfix[0]) - 1u; + char buff[4 + prefix_size + postfix_size]; + std::string buff2; + + for (std::int_fast32_t z = 0; z < path_size; ++z) { + std::string_view piece = find_string( + build_fast_search_path(prefix, postfix, z, buff, buff2), + node + ); + retval.push_back(piece); + } + } + + return retval; +} } //unnamed namespace TorrentRead::TorrentRead (std::string_view torrent_path, std::filesystem::path workdir) : @@ -129,7 +154,6 @@ std::int_fast32_t TorrentRead::read_file_count() const { std::vector TorrentRead::read_file_path(std::size_t index) const { const TorrentValue* path_variant; - std::string buff2; { constexpr char prefix[] = "/[["; @@ -140,6 +164,7 @@ std::vector TorrentRead::read_file_path(std::size_t index) con //see comment in read_file_size() //in this case a search should look like "/[[1234]]/path" char buff[4 + prefix_size + postfix_size]; + std::string buff2; auto found = find_variant( build_fast_search_path(prefix, postfix, index, buff, buff2), @@ -151,25 +176,7 @@ std::vector TorrentRead::read_file_path(std::size_t index) con path_variant = &found->get(); } - const auto path_size = find_int("/[[size]]", *path_variant); - std::vector retval; - retval.reserve(path_size); - - { - constexpr char prefix[] = "/[["; - constexpr char postfix[] = "]]"; - constexpr std::size_t prefix_size = sizeof(prefix) / sizeof(prefix[0]) - 1u; - constexpr std::size_t postfix_size = sizeof(postfix) / sizeof(postfix[0]) - 1u; - char buff[4 + prefix_size + postfix_size]; - for (std::int_fast32_t z = 0; z < path_size; ++z) { - std::string_view piece = find_string( - build_fast_search_path(prefix, postfix, z, buff, buff2), - *path_variant - ); - retval.push_back(piece); - } - } - return retval; + return grab_all_strings_in_list(*path_variant); } std::string TorrentRead::read_joint_file_path(std::size_t index, char sep) const { @@ -224,6 +231,29 @@ std::string_view TorrentRead::read_announce() const { return find_string("/announce", m_parsed_values); } +std::vector> TorrentRead::read_announce_list() const { + typedef boost::spirit::x3::forward_ast> TorrentListType; + + //see https://bittorrent.org/beps/bep_0012.html it's a list of lists + auto list_variant = find_variant("/announce-list", m_parsed_values); + if (list_variant) { + auto* node_list = boost::get(&list_variant->get()); + std::vector> retval; + if (node_list) { + const auto list_size = static_cast(node_list->get().size()); + retval.reserve(list_size); + for (std::int_fast32_t z = 0; z < list_size; ++z) { + retval.push_back(grab_all_strings_in_list(node_list->get()[z])); + } + } + return retval; + } + else { + //from my tests this node is optional + return {}; + } +} + std::time_t TorrentRead::read_creation_date() const { return find_int("/creation date", m_parsed_values); } diff --git a/src/torrent_read.hpp b/src/torrent_read.hpp index 0469b34..f37ccfa 100644 --- a/src/torrent_read.hpp +++ b/src/torrent_read.hpp @@ -55,6 +55,7 @@ public: std::string_view read_hashes() const; std::string_view read_created_by() const; std::string_view read_announce() const; + std::vector> read_announce_list() const; std::time_t read_creation_date() const; private: