diff --git a/src/command_download.cc b/src/command_download.cc index 0bb8d0e0..9afeafb3 100644 --- a/src/command_download.cc +++ b/src/command_download.cc @@ -280,7 +280,7 @@ t_multicall(core::Download* download, const torrent::Object& rawArgs) { for (torrent::Object::list_const_iterator cItr = ++args.begin(), cLast = args.end(); cItr != args.end(); cItr++) { const std::string& cmd = cItr->as_string(); - torrent::Tracker* t = download->tracker_list()->get(itr); + torrent::Tracker* t = download->tracker_list()->at(itr); row.push_back(rpc::parse_command(rpc::make_target(t), cmd.c_str(), cmd.c_str() + cmd.size()).first); } @@ -477,14 +477,14 @@ initialize_command_download() { ADD_CD_VALUE_UNI("chunk_size", rak::on(std::mem_fun(&core::Download::file_list), std::mem_fun(&torrent::FileList::chunk_size))); - ADD_CD_VALUE_MEM_BI("tracker_numwant", &core::Download::tracker_list, &torrent::TrackerList::set_numwant, &torrent::TrackerList::numwant); - ADD_CD_VALUE_UNI("tracker_focus", rak::on(std::mem_fun(&core::Download::tracker_list), std::mem_fun(&torrent::TrackerList::focus))); - ADD_CD_VALUE_UNI("tracker_size", rak::on(std::mem_fun(&core::Download::tracker_list), std::mem_fun(&torrent::TrackerList::size))); + ADD_CD_VALUE_MEM_BI("tracker_numwant", &core::Download::tracker_list, &torrent::TrackerList::set_numwant, &torrent::TrackerList::numwant); + ADD_CD_VALUE_UNI("tracker_focus", rak::on(std::mem_fun(&core::Download::tracker_list), std::mem_fun(&torrent::TrackerList::focus_index))); + ADD_CD_VALUE_UNI("tracker_size", std::mem_fun(&core::Download::tracker_list_size)); - ADD_CD_STRING_BI("directory", std::mem_fun(&core::Download::set_root_directory), rak::on(std::mem_fun(&core::Download::file_list), std::mem_fun(&torrent::FileList::root_dir))); - ADD_CD_VALUE_BI("priority", std::mem_fun(&core::Download::set_priority), std::mem_fun(&core::Download::priority)); - ADD_CD_STRING_UNI("priority_str", std::ptr_fun(&retrieve_d_priority_str)); + ADD_CD_STRING_BI("directory", std::mem_fun(&core::Download::set_root_directory), rak::on(std::mem_fun(&core::Download::file_list), std::mem_fun(&torrent::FileList::root_dir))); + ADD_CD_VALUE_BI("priority", std::mem_fun(&core::Download::set_priority), std::mem_fun(&core::Download::priority)); + ADD_CD_STRING_UNI("priority_str", std::ptr_fun(&retrieve_d_priority_str)); - ADD_CD_SLOT_PUBLIC("f.multicall", call_list, rak::ptr_fn(&f_multicall), "i:", "") - ADD_CD_SLOT_PUBLIC("t.multicall", call_list, rak::ptr_fn(&t_multicall), "i:", "") + ADD_CD_SLOT_PUBLIC("f.multicall", call_list, rak::ptr_fn(&f_multicall), "i:", "") + ADD_CD_SLOT_PUBLIC("t.multicall", call_list, rak::ptr_fn(&t_multicall), "i:", "") } diff --git a/src/command_network.cc b/src/command_network.cc index ccb052f9..c2d93880 100644 --- a/src/command_network.cc +++ b/src/command_network.cc @@ -122,13 +122,8 @@ void apply_encoding_list(const std::string& arg) { torrent::encoding_list()->pus void apply_enable_trackers(int64_t arg) { for (core::Manager::DListItr itr = control->core()->download_list()->begin(), last = control->core()->download_list()->end(); itr != last; ++itr) { - torrent::TrackerList tl = (*itr)->download()->tracker_list(); - - for (int i = 0, last = tl.size(); i < last; ++i) - if (arg) - tl.get(i)->enable(); - else - tl.get(i)->disable(); + std::for_each((*itr)->tracker_list()->begin(), (*itr)->tracker_list()->end(), + arg ? std::mem_fun(&torrent::Tracker::enable) : std::mem_fun(&torrent::Tracker::disable)); if (arg && !rpc::call_command_value("get_use_udp_trackers")) (*itr)->enable_udp_trackers(false); @@ -149,7 +144,7 @@ xmlrpc_find_tracker(core::Download* download, uint32_t index) { if (index >= download->tracker_list()->size()) return NULL; - return download->tracker_list()->get(index); + return download->tracker_list()->at(index); } void diff --git a/src/core/download.cc b/src/core/download.cc index a64c5453..6b73e174 100644 --- a/src/core/download.cc +++ b/src/core/download.cc @@ -58,8 +58,6 @@ namespace core { Download::Download(download_type d) : m_download(d), - m_trackerList(d.tracker_list()), - m_hashFailed(false), m_chunksFailed(0), @@ -85,14 +83,12 @@ Download::~Download() { void Download::enable_udp_trackers(bool state) { - torrent::TrackerList tl = m_download.tracker_list(); - - for (int i = 0, last = tl.size(); i < last; ++i) - if (tl.get(i)->type() == torrent::Tracker::TRACKER_UDP) + for (torrent::TrackerList::iterator itr = m_download.tracker_list()->begin(), last = m_download.tracker_list()->end(); itr != last; ++itr) + if ((*itr)->type() == torrent::Tracker::TRACKER_UDP) if (state) - tl.get(i)->enable(); + (*itr)->enable(); else - tl.get(i)->disable(); + (*itr)->disable(); } uint32_t diff --git a/src/core/download.h b/src/core/download.h index e6520201..171338b6 100644 --- a/src/core/download.h +++ b/src/core/download.h @@ -88,7 +88,8 @@ public: const file_list_type* c_file_list() const { return m_download.file_list(); } torrent::Object* bencode() { return m_download.bencode(); } - tracker_list_type* tracker_list() { return &m_trackerList; } + tracker_list_type* tracker_list() { return m_download.tracker_list(); } + uint32_t tracker_list_size() const { return m_download.tracker_list()->size(); } const std::string& message() const { return m_message; } void set_message(const std::string& msg) { m_message = msg; } @@ -120,7 +121,6 @@ private: // Store the FileList instance so we can use slots etc on it. download_type m_download; - tracker_list_type m_trackerList; bool m_hashFailed; diff --git a/src/core/download_list.cc b/src/core/download_list.cc index aadaa88c..d78d5149 100644 --- a/src/core/download_list.cc +++ b/src/core/download_list.cc @@ -269,7 +269,7 @@ DownloadList::close_quick(Download* download) { // handled by some parameter to the close function, or some other // way of giving the client more control of when STOPPED requests // are sent. - download->download()->tracker_list().manual_cancel(); + download->download()->tracker_list()->manual_cancel(); } void @@ -607,7 +607,7 @@ DownloadList::confirm_finished(Download* download) { // Send the completed request before resuming so we don't reset the // up/downloaded baseline. - download->download()->tracker_list().send_completed(); + download->download()->tracker_list()->send_completed(); std::for_each(slot_map_finished().begin(), slot_map_finished().end(), download_list_call(download)); diff --git a/src/display/utils.cc b/src/display/utils.cc index b379ea8e..803a8801 100644 --- a/src/display/utils.cc +++ b/src/display/utils.cc @@ -188,11 +188,11 @@ print_download_status(char* first, char* last, core::Download* d) { first = print_buffer(first, last, "Checking hash [%2i%%]", (d->download()->chunks_hashed() * 100) / d->download()->file_list()->size_chunks()); - } else if (d->tracker_list()->is_busy() && d->tracker_list()->focus() < d->tracker_list()->size()) { + } else if (d->tracker_list()->has_active() && d->tracker_list()->focus() < d->tracker_list()->end()) { torrent::TrackerList* tl = d->tracker_list(); first = print_buffer(first, last, "Tracker[%i:%i]: Connecting to %s", - tl->get(tl->focus())->group(), tl->focus(), tl->get(tl->focus())->url().c_str()); + (*tl->focus())->group(), tl->focus_index(), (*tl->focus())->url().c_str()); } else if (!d->message().empty()) { first = print_buffer(first, last, "%s", d->message().c_str()); diff --git a/src/display/window_download_statusbar.cc b/src/display/window_download_statusbar.cc index ccd03576..1bb1b9c3 100644 --- a/src/display/window_download_statusbar.cc +++ b/src/display/window_download_statusbar.cc @@ -83,8 +83,8 @@ WindowDownloadStatusbar::redraw() { position = print_download_status(buffer, last, m_download); m_canvas->print(0, 2, "[%c:%i] %s", - m_download->tracker_list()->is_busy() ? 'C' : ' ', - (int)(m_download->download()->tracker_list().timeout() / 1000000), + m_download->tracker_list()->has_active() ? 'C' : ' ', + (int)(m_download->download()->tracker_list()->time_next_connection()), buffer); } diff --git a/src/display/window_tracker_list.cc b/src/display/window_tracker_list.cc index a8803e3d..d8bed3ac 100644 --- a/src/display/window_tracker_list.cc +++ b/src/display/window_tracker_list.cc @@ -75,7 +75,7 @@ WindowTrackerList::redraw() { Range range = rak::advance_bidirectional(0, *m_focus, tl->size(), (m_canvas->height() + 1) / 2); while (range.first != range.second) { - torrent::Tracker* tracker = tl->get(range.first); + torrent::Tracker* tracker = tl->at(range.first); // m_canvas->print(0, pos, "[%c] [S/L %5i/%5i] %s", // tracker->is_enabled() ? (tracker->is_open() ? '*' : ' ') : '-', @@ -90,7 +90,7 @@ WindowTrackerList::redraw() { m_canvas->print(4, pos++, "Id: %s Focus: %s Enabled: %s Open: %s S/L: %u/%u", rak::copy_escape_html(tracker->tracker_id()).c_str(), - range.first == tl->focus() ? "yes" : " no", + range.first == tl->focus_index() ? "yes" : " no", tracker->is_enabled() ? "yes" : " no", tracker->is_busy() ? "yes" : " no", tracker->scrape_complete(), diff --git a/src/ui/element_tracker_list.cc b/src/ui/element_tracker_list.cc index 4d764767..7d81b897 100644 --- a/src/ui/element_tracker_list.cc +++ b/src/ui/element_tracker_list.cc @@ -103,7 +103,7 @@ ElementTrackerList::receive_disable() { if (m_window == NULL) throw torrent::internal_error("ui::ElementTrackerList::receive_disable(...) called on a disabled object"); - torrent::Tracker* t = m_download->download()->tracker_list().get(m_focus); + torrent::Tracker* t = m_download->download()->tracker_list()->at(m_focus); if (t->is_enabled()) t->disable(); @@ -118,7 +118,7 @@ ElementTrackerList::receive_next() { if (m_window == NULL) throw torrent::internal_error("ui::ElementTrackerList::receive_next(...) called on a disabled object"); - if (++m_focus >= m_download->download()->tracker_list().size()) + if (++m_focus >= m_download->download()->tracker_list()->size()) m_focus = 0; m_window->mark_dirty(); @@ -129,13 +129,13 @@ ElementTrackerList::receive_prev() { if (m_window == NULL) throw torrent::internal_error("ui::ElementTrackerList::receive_prev(...) called on a disabled object"); - if (m_download->download()->tracker_list().size() == 0) + if (m_download->download()->tracker_list()->size() == 0) return; if (m_focus != 0) --m_focus; else - m_focus = m_download->download()->tracker_list().size() - 1; + m_focus = m_download->download()->tracker_list()->size() - 1; m_window->mark_dirty(); } @@ -145,12 +145,12 @@ ElementTrackerList::receive_cycle_group() { if (m_window == NULL) throw torrent::internal_error("ui::ElementTrackerList::receive_group_cycle(...) called on a disabled object"); - torrent::TrackerList tl = m_download->download()->tracker_list(); + torrent::TrackerList* tl = m_download->tracker_list(); - if (m_focus >= tl.size()) + if (m_focus >= tl->size()) throw torrent::internal_error("ui::ElementTrackerList::receive_group_cycle(...) called with an invalid focus"); - tl.cycle_group(tl.get(m_focus)->group()); + tl->cycle_group(tl->at(m_focus)->group()); m_window->mark_dirty(); }