use span for read_resume_data() (#1867)
use span for read_resume_data()
This commit is contained in:
parent
8ebbad19d4
commit
b8e77444d5
|
@ -559,7 +559,7 @@ namespace
|
||||||
add_torrent_params read_resume_data_wrapper(bytes const& b)
|
add_torrent_params read_resume_data_wrapper(bytes const& b)
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
add_torrent_params p = read_resume_data(&b.arr[0], int(b.arr.size()), ec);
|
add_torrent_params p = read_resume_data(b.arr, ec);
|
||||||
#ifndef BOOST_NO_EXCEPTIONS
|
#ifndef BOOST_NO_EXCEPTIONS
|
||||||
if (ec) throw system_error(ec);
|
if (ec) throw system_error(ec);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -87,7 +87,7 @@ int main(int argc, char const* argv[])
|
||||||
, std::istream_iterator<char>()};
|
, std::istream_iterator<char>()};
|
||||||
|
|
||||||
lt::error_code ec;
|
lt::error_code ec;
|
||||||
lt::add_torrent_params atp = lt::read_resume_data(&buf[0], int(buf.size()), ec);
|
lt::add_torrent_params atp = lt::read_resume_data(buf, ec);
|
||||||
if (ec) {
|
if (ec) {
|
||||||
std::cerr << "failed to read resume data: " << ec.message() << std::endl;
|
std::cerr << "failed to read resume data: " << ec.message() << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -555,7 +555,7 @@ void add_magnet(lt::session& ses, lt::string_view uri)
|
||||||
load_file(resume_file(p.info_hash), resume_data, ec);
|
load_file(resume_file(p.info_hash), resume_data, ec);
|
||||||
if (!ec)
|
if (!ec)
|
||||||
{
|
{
|
||||||
p = lt::read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
p = lt::read_resume_data(resume_data, ec);
|
||||||
if (ec) std::printf(" failed to load resume data: %s\n", ec.message().c_str());
|
if (ec) std::printf(" failed to load resume data: %s\n", ec.message().c_str());
|
||||||
parse_magnet_uri(uri.to_string(), p, ec);
|
parse_magnet_uri(uri.to_string(), p, ec);
|
||||||
}
|
}
|
||||||
|
@ -599,7 +599,7 @@ bool add_torrent(libtorrent::session& ses, std::string torrent)
|
||||||
load_file(resume_file(ti->info_hash()), resume_data, ec);
|
load_file(resume_file(ti->info_hash()), resume_data, ec);
|
||||||
if (!ec)
|
if (!ec)
|
||||||
{
|
{
|
||||||
p = lt::read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
p = lt::read_resume_data(resume_data, ec);
|
||||||
if (ec) std::printf(" failed to load resume data: %s\n", ec.message().c_str());
|
if (ec) std::printf(" failed to load resume data: %s\n", ec.message().c_str());
|
||||||
}
|
}
|
||||||
ec.clear();
|
ec.clear();
|
||||||
|
@ -1286,7 +1286,7 @@ MAGNETURL is a magnet link
|
||||||
, file.c_str(), ec.message().c_str());
|
, file.c_str(), ec.message().c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
add_torrent_params p = lt::read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
add_torrent_params p = lt::read_resume_data(resume_data, ec);
|
||||||
if (ec)
|
if (ec)
|
||||||
{
|
{
|
||||||
std::printf(" failed to parse resume data \"%s\": %s\n"
|
std::printf(" failed to parse resume data \"%s\": %s\n"
|
||||||
|
|
|
@ -247,12 +247,14 @@ struct bdecode_token
|
||||||
// There are 5 different types of nodes, see type_t.
|
// There are 5 different types of nodes, see type_t.
|
||||||
struct TORRENT_EXPORT bdecode_node
|
struct TORRENT_EXPORT bdecode_node
|
||||||
{
|
{
|
||||||
// TODO: 3 make this take span<char const> for buffer, and make it return a
|
// TODO: 3 deprecate this overload
|
||||||
// bdecode_node
|
|
||||||
TORRENT_EXPORT friend int bdecode(char const* start, char const* end, bdecode_node& ret
|
TORRENT_EXPORT friend int bdecode(char const* start, char const* end, bdecode_node& ret
|
||||||
, error_code& ec, int* error_pos, int depth_limit
|
, error_code& ec, int* error_pos, int depth_limit
|
||||||
, int token_limit);
|
, int token_limit);
|
||||||
|
|
||||||
|
TORRENT_EXPORT friend bdecode_node bdecode(span<char const> buffer
|
||||||
|
, error_code& ec, int* error_pos, int depth_limit, int token_limit);
|
||||||
|
|
||||||
// creates a default constructed node, it will have the type ``none_t``.
|
// creates a default constructed node, it will have the type ``none_t``.
|
||||||
bdecode_node();
|
bdecode_node();
|
||||||
|
|
||||||
|
@ -260,6 +262,8 @@ struct TORRENT_EXPORT bdecode_node
|
||||||
// underlying buffer remains the same.
|
// underlying buffer remains the same.
|
||||||
bdecode_node(bdecode_node const&);
|
bdecode_node(bdecode_node const&);
|
||||||
bdecode_node& operator=(bdecode_node const&);
|
bdecode_node& operator=(bdecode_node const&);
|
||||||
|
bdecode_node(bdecode_node&&);
|
||||||
|
bdecode_node& operator=(bdecode_node&&);
|
||||||
|
|
||||||
// the types of bdecoded nodes
|
// the types of bdecoded nodes
|
||||||
enum type_t
|
enum type_t
|
||||||
|
@ -421,6 +425,9 @@ TORRENT_EXPORT std::string print_entry(bdecode_node const& e
|
||||||
TORRENT_EXPORT int bdecode(char const* start, char const* end, bdecode_node& ret
|
TORRENT_EXPORT int bdecode(char const* start, char const* end, bdecode_node& ret
|
||||||
, error_code& ec, int* error_pos = nullptr, int depth_limit = 100
|
, error_code& ec, int* error_pos = nullptr, int depth_limit = 100
|
||||||
, int token_limit = 1000000);
|
, int token_limit = 1000000);
|
||||||
|
TORRENT_EXPORT bdecode_node bdecode(span<char const> buffer
|
||||||
|
, error_code& ec, int* error_pos = nullptr, int depth_limit = 100
|
||||||
|
, int token_limit = 1000000);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "libtorrent/error_code.hpp"
|
#include "libtorrent/error_code.hpp"
|
||||||
#include "libtorrent/export.hpp"
|
#include "libtorrent/export.hpp"
|
||||||
|
#include "libtorrent/span.hpp"
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
@ -51,8 +52,8 @@ namespace libtorrent
|
||||||
// data but before adding the torrent.
|
// data but before adding the torrent.
|
||||||
TORRENT_EXPORT add_torrent_params read_resume_data(bdecode_node const& rd
|
TORRENT_EXPORT add_torrent_params read_resume_data(bdecode_node const& rd
|
||||||
, error_code& ec);
|
, error_code& ec);
|
||||||
TORRENT_EXPORT add_torrent_params read_resume_data(char const* buffer
|
TORRENT_EXPORT add_torrent_params read_resume_data(span<char const> buffer
|
||||||
, int size, error_code& ec);
|
, error_code& ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -243,6 +243,9 @@ namespace libtorrent
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bdecode_node::bdecode_node(bdecode_node&&) = default;
|
||||||
|
bdecode_node& bdecode_node::operator=(bdecode_node&&) = default;
|
||||||
|
|
||||||
bdecode_node::bdecode_node(bdecode_token const* tokens, char const* buf
|
bdecode_node::bdecode_node(bdecode_token const* tokens, char const* buf
|
||||||
, int len, int idx)
|
, int len, int idx)
|
||||||
: m_root_tokens(tokens)
|
: m_root_tokens(tokens)
|
||||||
|
@ -647,14 +650,21 @@ namespace libtorrent
|
||||||
int bdecode(char const* start, char const* end, bdecode_node& ret
|
int bdecode(char const* start, char const* end, bdecode_node& ret
|
||||||
, error_code& ec, int* error_pos, int const depth_limit, int token_limit)
|
, error_code& ec, int* error_pos, int const depth_limit, int token_limit)
|
||||||
{
|
{
|
||||||
ec.clear();
|
ret = bdecode({start, static_cast<size_t>(end - start)}, ec, error_pos, depth_limit, token_limit);
|
||||||
ret.clear();
|
return ec ? -1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (end - start > bdecode_token::max_offset)
|
bdecode_node bdecode(span<char const> buffer
|
||||||
|
, error_code& ec, int* error_pos, int depth_limit, int token_limit)
|
||||||
|
{
|
||||||
|
bdecode_node ret;
|
||||||
|
ec.clear();
|
||||||
|
|
||||||
|
if (buffer.size() > bdecode_token::max_offset)
|
||||||
{
|
{
|
||||||
if (error_pos) *error_pos = 0;
|
if (error_pos) *error_pos = 0;
|
||||||
ec = bdecode_errors::limit_exceeded;
|
ec = bdecode_errors::limit_exceeded;
|
||||||
return -1;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// this is the stack of bdecode_token indices, into m_tokens.
|
// this is the stack of bdecode_token indices, into m_tokens.
|
||||||
|
@ -662,6 +672,9 @@ namespace libtorrent
|
||||||
int sp = 0;
|
int sp = 0;
|
||||||
TORRENT_ALLOCA(stack, stack_frame, depth_limit);
|
TORRENT_ALLOCA(stack, stack_frame, depth_limit);
|
||||||
|
|
||||||
|
// TODO: 2 attempt to simplify this implementation by embracing the span
|
||||||
|
char const* start = buffer.data();
|
||||||
|
char const* end = start + buffer.size();
|
||||||
char const* const orig_start = start;
|
char const* const orig_start = start;
|
||||||
|
|
||||||
if (start == end)
|
if (start == end)
|
||||||
|
@ -853,7 +866,7 @@ done:
|
||||||
ret.m_buffer_size = int(start - orig_start);
|
ret.m_buffer_size = int(start - orig_start);
|
||||||
ret.m_root_tokens = ret.m_tokens.data();
|
ret.m_root_tokens = ret.m_tokens.data();
|
||||||
|
|
||||||
return ec ? -1 : 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
|
@ -332,10 +332,9 @@ namespace libtorrent
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
add_torrent_params read_resume_data(char const* buffer, int size, error_code& ec)
|
add_torrent_params read_resume_data(span<char const> buffer, error_code& ec)
|
||||||
{
|
{
|
||||||
bdecode_node rd;
|
bdecode_node rd = bdecode(buffer, ec);
|
||||||
bdecode(buffer, buffer + size, rd, ec);
|
|
||||||
if (ec) return add_torrent_params();
|
if (ec) return add_torrent_params();
|
||||||
|
|
||||||
return read_resume_data(rd, ec);
|
return read_resume_data(rd, ec);
|
||||||
|
|
|
@ -200,7 +200,7 @@ namespace libtorrent
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
add_torrent_params resume_data
|
add_torrent_params resume_data
|
||||||
= read_resume_data(&atp.resume_data[0], int(atp.resume_data.size()), ec);
|
= read_resume_data(atp.resume_data, ec);
|
||||||
|
|
||||||
resume_data.internal_resume_data_error = ec;
|
resume_data.internal_resume_data_error = ec;
|
||||||
if (ec) return;
|
if (ec) return;
|
||||||
|
|
|
@ -295,7 +295,7 @@ done:
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
p = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
p = read_resume_data(resume_data, ec);
|
||||||
TEST_CHECK(!ec);
|
TEST_CHECK(!ec);
|
||||||
}
|
}
|
||||||
p.flags &= ~add_torrent_params::flag_paused;
|
p.flags &= ~add_torrent_params::flag_paused;
|
||||||
|
|
|
@ -77,7 +77,7 @@ TORRENT_TEST(read_resume)
|
||||||
bencode(std::back_inserter(resume_data), rd);
|
bencode(std::back_inserter(resume_data), rd);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
add_torrent_params atp = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
add_torrent_params atp = read_resume_data(resume_data, ec);
|
||||||
|
|
||||||
TEST_CHECK(!ec);
|
TEST_CHECK(!ec);
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ TORRENT_TEST(read_resume_missing_info_hash)
|
||||||
bencode(std::back_inserter(resume_data), rd);
|
bencode(std::back_inserter(resume_data), rd);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
add_torrent_params atp = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
add_torrent_params atp = read_resume_data(resume_data, ec);
|
||||||
TEST_EQUAL(ec, error_code(errors::missing_info_hash));
|
TEST_EQUAL(ec, error_code(errors::missing_info_hash));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ TORRENT_TEST(read_resume_missing_file_format)
|
||||||
bencode(std::back_inserter(resume_data), rd);
|
bencode(std::back_inserter(resume_data), rd);
|
||||||
|
|
||||||
error_code ec;
|
error_code ec;
|
||||||
add_torrent_params atp = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
add_torrent_params atp = read_resume_data(resume_data, ec);
|
||||||
TEST_EQUAL(ec, error_code(errors::invalid_file_tag));
|
TEST_EQUAL(ec, error_code(errors::invalid_file_tag));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ TORRENT_TEST(read_resume_mismatching_torrent)
|
||||||
// the info-hash field does not match the torrent in the "info" field, so it
|
// the info-hash field does not match the torrent in the "info" field, so it
|
||||||
// will be ignored
|
// will be ignored
|
||||||
error_code ec;
|
error_code ec;
|
||||||
add_torrent_params atp = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
add_torrent_params atp = read_resume_data(resume_data, ec);
|
||||||
TEST_CHECK(!ec);
|
TEST_CHECK(!ec);
|
||||||
TEST_CHECK(!atp.ti);
|
TEST_CHECK(!atp.ti);
|
||||||
}
|
}
|
||||||
|
@ -207,7 +207,7 @@ TORRENT_TEST(read_resume_torrent)
|
||||||
// the info-hash field does not match the torrent in the "info" field, so it
|
// the info-hash field does not match the torrent in the "info" field, so it
|
||||||
// will be ignored
|
// will be ignored
|
||||||
error_code ec;
|
error_code ec;
|
||||||
add_torrent_params atp = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
add_torrent_params atp = read_resume_data(resume_data, ec);
|
||||||
TEST_CHECK(!ec);
|
TEST_CHECK(!ec);
|
||||||
TEST_CHECK(atp.ti);
|
TEST_CHECK(atp.ti);
|
||||||
|
|
||||||
|
|
|
@ -157,7 +157,7 @@ torrent_handle test_resume_flags(lt::session& ses, int flags
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
p = read_resume_data(&rd[0], int(rd.size()), ec);
|
p = read_resume_data(rd, ec);
|
||||||
TEST_CHECK(!ec);
|
TEST_CHECK(!ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,7 +241,7 @@ void test_piece_priorities(bool test_deprecated = false)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
p = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
p = read_resume_data(resume_data, ec);
|
||||||
TEST_CHECK(!ec);
|
TEST_CHECK(!ec);
|
||||||
p.ti = ti;
|
p.ti = ti;
|
||||||
p.save_path = ".";
|
p.save_path = ".";
|
||||||
|
@ -735,7 +735,7 @@ void test_zero_file_prio(bool test_deprecated = false)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
p = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
p = read_resume_data(resume_data, ec);
|
||||||
TEST_CHECK(!ec);
|
TEST_CHECK(!ec);
|
||||||
p.ti = ti;
|
p.ti = ti;
|
||||||
p.save_path = ".";
|
p.save_path = ".";
|
||||||
|
@ -820,7 +820,7 @@ void test_seed_mode(bool const file_prio, bool const pieces_have, bool const pie
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
p = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
p = read_resume_data(resume_data, ec);
|
||||||
TEST_CHECK(!ec);
|
TEST_CHECK(!ec);
|
||||||
p.ti = ti;
|
p.ti = ti;
|
||||||
p.save_path = ".";
|
p.save_path = ".";
|
||||||
|
|
|
@ -710,7 +710,7 @@ void test_fastresume(bool const test_deprecated)
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
p = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
p = read_resume_data(resume_data, ec);
|
||||||
TEST_CHECK(!ec);
|
TEST_CHECK(!ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -880,7 +880,7 @@ void test_rename_file_fastresume(bool test_deprecated)
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
p = read_resume_data(&resume_data[0], int(resume_data.size()), ec);
|
p = read_resume_data(resume_data, ec);
|
||||||
TEST_CHECK(!ec);
|
TEST_CHECK(!ec);
|
||||||
}
|
}
|
||||||
p.ti = std::make_shared<torrent_info>(std::cref(*t));
|
p.ti = std::make_shared<torrent_info>(std::cref(*t));
|
||||||
|
|
Loading…
Reference in New Issue