diff --git a/ChangeLog b/ChangeLog index 80fe6377c..bfd6b9319 100644 --- a/ChangeLog +++ b/ChangeLog @@ -74,6 +74,7 @@ 1.0.6 release + * fix loading of piece priorities from resume data * improved seed-mode handling (seed-mode will now automatically be left when performing operations implying it's not a seed) * fixed issue with file priorities and override resume data diff --git a/src/torrent.cpp b/src/torrent.cpp index 144dbce9c..7db59252a 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -1859,6 +1859,17 @@ namespace libtorrent construct_storage(); + if (m_share_mode && valid_metadata()) + { + // in share mode, all pieces have their priorities initialized to 0 + m_file_priority.clear(); + m_file_priority.resize(m_torrent_file->num_files(), 0); + } + + // in case file priorities were passed in via the add_torrent_params + // and also in the case of share mode, we need to update the priorities + update_piece_priorities(); + // if we've already loaded file priorities, don't load piece priorities, // they will interfere. if (!m_seed_mode && m_resume_data && m_file_priority.empty()) @@ -1881,13 +1892,6 @@ namespace libtorrent } } - if (m_share_mode && valid_metadata()) - { - // in share mode, all pieces have their priorities initialized to 0 - m_file_priority.clear(); - m_file_priority.resize(m_torrent_file->num_files(), 0); - } - if (!m_connections_initialized) { m_connections_initialized = true; @@ -1907,10 +1911,6 @@ namespace libtorrent } } - // in case file priorities were passed in via the add_torrent_params - // and also in the case of share mode, we need to update the priorities - update_piece_priorities(); - std::vector const& web_seeds = m_torrent_file->web_seeds(); m_web_seeds.insert(m_web_seeds.end(), web_seeds.begin(), web_seeds.end()); diff --git a/test/test_resume.cpp b/test/test_resume.cpp index 795ebd7f3..c19451d1b 100644 --- a/test/test_resume.cpp +++ b/test/test_resume.cpp @@ -37,6 +37,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/create_torrent.hpp" #include "libtorrent/alert_types.hpp" #include "libtorrent/entry.hpp" +#include "libtorrent/bencode.hpp" #include @@ -188,6 +189,43 @@ void default_tests(torrent_status const& s) TEST_EQUAL(s.completed_time, 1348); } +TORRENT_TEST(piece_priorities) +{ + session ses; + boost::shared_ptr ti = generate_torrent(); + add_torrent_params p; + p.ti = ti; + p.save_path = "."; + torrent_handle h = ses.add_torrent(p); + + h.piece_priority(0, 0); + h.piece_priority(ti->num_pieces()-1, 0); + + h.save_resume_data(); + alert const* a = wait_for_alert(ses, save_resume_data_alert::alert_type); + + TEST_CHECK(a); + if (save_resume_data_alert const* ra = alert_cast(a)) + { + fprintf(stderr, "%s\n", ra->resume_data->to_string().c_str()); + entry::string_type prios = (*ra->resume_data)["piece_priority"].string(); + TEST_EQUAL(prios.size(), ti->num_pieces()); + TEST_EQUAL(prios[0], '\0'); + TEST_EQUAL(prios[1], '\x04'); + TEST_EQUAL(prios[ti->num_pieces()-1], '\0'); + + bencode(std::back_inserter(p.resume_data), *ra->resume_data); + } + + ses.remove_torrent(h); + + // now, make sure the piece priorities are loaded correctly + h = ses.add_torrent(p); + TEST_EQUAL(h.piece_priority(0), 0); + TEST_EQUAL(h.piece_priority(1), 4); + TEST_EQUAL(h.piece_priority(ti->num_pieces()-1), 0); +} + // TODO: test what happens when loading a resume file with both piece priorities // and file priorities (file prio should take presedence)