full support for bep-21 (event=paused)

This commit is contained in:
Arvid Norberg
2010-09-06 04:02:15 +00:00
parent e3e70d3412
commit 3fb9fcab9e
7 changed files with 30 additions and 19 deletions

View File

@@ -1,3 +1,4 @@
* full support for BEP 21 (event=paused)
* added share-mode feature for improving share ratios * added share-mode feature for improving share ratios
* merged all proxy settings into a single one * merged all proxy settings into a single one
* improved SOCKS5 support by proxying hostname lookups * improved SOCKS5 support by proxying hostname lookups

View File

@@ -45,6 +45,7 @@ extensions
* supports the ``compact=1`` tracker parameter. * supports the ``compact=1`` tracker parameter.
* super seeding/initial seeding (`BEP 16`_). * super seeding/initial seeding (`BEP 16`_).
* private torrents (`BEP 27`_). * private torrents (`BEP 27`_).
* upload-only extension (`BEP 21`_).
* support for IPv6, including `BEP 7`_ and `BEP 24`_. * support for IPv6, including `BEP 7`_ and `BEP 24`_.
* support for merkle hash tree torrents. This makes the size of torrent files * support for merkle hash tree torrents. This makes the size of torrent files
scale well with the size of the content. scale well with the size of the content.
@@ -112,6 +113,7 @@ network
.. _`BEP 16`: http://bittorrent.org/beps/bep_0016.html .. _`BEP 16`: http://bittorrent.org/beps/bep_0016.html
.. _`BEP 17`: http://bittorrent.org/beps/bep_0017.html .. _`BEP 17`: http://bittorrent.org/beps/bep_0017.html
.. _`BEP 19`: http://bittorrent.org/beps/bep_0019.html .. _`BEP 19`: http://bittorrent.org/beps/bep_0019.html
.. _`BEP 21`: http://bittorrent.org/beps/bep_0021.html
.. _`BEP 24`: http://bittorrent.org/beps/bep_0024.html .. _`BEP 24`: http://bittorrent.org/beps/bep_0024.html
.. _`BEP 27`: http://bittorrent.org/beps/bep_0027.html .. _`BEP 27`: http://bittorrent.org/beps/bep_0027.html
.. _`extension protocol`: extension_protocol.html .. _`extension protocol`: extension_protocol.html

View File

@@ -467,7 +467,7 @@ namespace libtorrent
virtual void tracker_warning(tracker_request const& req virtual void tracker_warning(tracker_request const& req
, std::string const& msg); , std::string const& msg);
virtual void tracker_scrape_response(tracker_request const& req virtual void tracker_scrape_response(tracker_request const& req
, int complete, int incomplete, int downloaded); , int complete, int incomplete, int downloaded, int downloaders);
// if no password and username is set // if no password and username is set
// this will return an empty string, otherwise // this will return an empty string, otherwise
@@ -1234,6 +1234,10 @@ namespace libtorrent
// from this torrent // from this torrent
boost::uint16_t m_last_upload; boost::uint16_t m_last_upload;
// the scrape data from the tracker response, this
// is optional and may be 0xffffff
unsigned int m_downloaders:24;
// round-robin index into m_interfaces // round-robin index into m_interfaces
mutable boost::uint8_t m_interface_index; mutable boost::uint8_t m_interface_index;
}; };

View File

@@ -96,7 +96,8 @@ namespace libtorrent
none, none,
completed, completed,
started, started,
stopped stopped,
paused
}; };
sha1_hash info_hash; sha1_hash info_hash;
@@ -124,7 +125,8 @@ namespace libtorrent
virtual void tracker_warning(tracker_request const& req virtual void tracker_warning(tracker_request const& req
, std::string const& msg) = 0; , std::string const& msg) = 0;
virtual void tracker_scrape_response(tracker_request const& /*req*/ virtual void tracker_scrape_response(tracker_request const& /*req*/
, int /*complete*/, int /*incomplete*/, int /*downloads*/) {} , int /*complete*/, int /*incomplete*/, int /*downloads*/
, int /*downloaders*/) {}
virtual void tracker_response( virtual void tracker_response(
tracker_request const& req tracker_request const& req
, address const& tracker_ip , address const& tracker_ip

View File

@@ -158,7 +158,7 @@ namespace libtorrent
if (tracker_req().event != tracker_request::none) if (tracker_req().event != tracker_request::none)
{ {
const char* event_string[] = {"completed", "started", "stopped"}; const char* event_string[] = {"completed", "started", "stopped", "paused"};
url += "&event="; url += "&event=";
url += event_string[tracker_req().event - 1]; url += event_string[tracker_req().event - 1];
} }
@@ -398,8 +398,9 @@ namespace libtorrent
int complete = scrape_data->dict_find_int_value("complete", -1); int complete = scrape_data->dict_find_int_value("complete", -1);
int incomplete = scrape_data->dict_find_int_value("incomplete", -1); int incomplete = scrape_data->dict_find_int_value("incomplete", -1);
int downloaded = scrape_data->dict_find_int_value("downloaded", -1); int downloaded = scrape_data->dict_find_int_value("downloaded", -1);
int downloaders = scrape_data->dict_find_int_value("downloaders", -1);
cb->tracker_scrape_response(tracker_req(), complete cb->tracker_scrape_response(tracker_req(), complete
, incomplete, downloaded); , incomplete, downloaded, downloaders);
return; return;
} }

View File

@@ -383,6 +383,7 @@ namespace libtorrent
, m_last_scrape(0) , m_last_scrape(0)
, m_last_download(0) , m_last_download(0)
, m_last_upload(0) , m_last_upload(0)
, m_downloaders(0xffffff)
, m_interface_index(0) , m_interface_index(0)
{ {
m_net_interfaces.push_back(tcp::endpoint(net_interface.address(), 0)); m_net_interfaces.push_back(tcp::endpoint(net_interface.address(), 0));
@@ -1436,6 +1437,9 @@ namespace libtorrent
TORRENT_ASSERT(m_allow_peers || e == tracker_request::stopped); TORRENT_ASSERT(m_allow_peers || e == tracker_request::stopped);
if (e == tracker_request::none && is_finished())
e = tracker_request::paused;
tracker_request req; tracker_request req;
req.info_hash = m_torrent_file->info_hash(); req.info_hash = m_torrent_file->info_hash();
req.pid = m_ses.get_peer_id(); req.pid = m_ses.get_peer_id();
@@ -1611,7 +1615,7 @@ namespace libtorrent
} }
void torrent::tracker_scrape_response(tracker_request const& req void torrent::tracker_scrape_response(tracker_request const& req
, int complete, int incomplete, int downloaded) , int complete, int incomplete, int downloaded, int downloaders)
{ {
TORRENT_ASSERT(m_ses.is_network_thread()); TORRENT_ASSERT(m_ses.is_network_thread());
@@ -1620,6 +1624,7 @@ namespace libtorrent
if (complete >= 0) m_complete = complete; if (complete >= 0) m_complete = complete;
if (incomplete >= 0) m_incomplete = incomplete; if (incomplete >= 0) m_incomplete = incomplete;
if (downloaders >= 0) m_downloaders = downloaders;
if (m_ses.m_alerts.should_post<scrape_reply_alert>()) if (m_ses.m_alerts.should_post<scrape_reply_alert>())
{ {
@@ -3758,7 +3763,8 @@ namespace libtorrent
m_seeding_time = rd.dict_find_int_value("seeding_time"); m_seeding_time = rd.dict_find_int_value("seeding_time");
m_last_seen_complete = rd.dict_find_int_value("last_seen_complete"); m_last_seen_complete = rd.dict_find_int_value("last_seen_complete");
m_complete = rd.dict_find_int_value("num_seeds", 0xffffff); m_complete = rd.dict_find_int_value("num_seeds", 0xffffff);
m_incomplete = rd.dict_find_int_value("num_downloaders", 0xffffff); m_incomplete = rd.dict_find_int_value("num_incomplete", 0xffffff);
m_downloaders = rd.dict_find_int_value("num_downloaders", 0xffffff);
set_upload_limit(rd.dict_find_int_value("upload_rate_limit", -1)); set_upload_limit(rd.dict_find_int_value("upload_rate_limit", -1));
set_download_limit(rd.dict_find_int_value("download_rate_limit", -1)); set_download_limit(rd.dict_find_int_value("download_rate_limit", -1));
set_max_connections(rd.dict_find_int_value("max_connections", -1)); set_max_connections(rd.dict_find_int_value("max_connections", -1));
@@ -3925,15 +3931,9 @@ namespace libtorrent
ret["seeding_time"] = m_seeding_time; ret["seeding_time"] = m_seeding_time;
ret["last_seen_complete"] = m_last_seen_complete; ret["last_seen_complete"] = m_last_seen_complete;
int seeds = 0; ret["num_seeds"] = m_complete;
int downloaders = 0; ret["num_incomplete"] = m_incomplete;
if (m_complete >= 0) seeds = m_complete; ret["num_downloaders"] = m_downloaders;
else seeds = m_policy.num_seeds();
if (m_incomplete >= 0) downloaders = m_incomplete;
else downloaders = m_policy.num_peers() - m_policy.num_seeds();
ret["num_seeds"] = seeds;
ret["num_downloaders"] = downloaders;
ret["sequential_download"] = m_sequential_download; ret["sequential_download"] = m_sequential_download;
@@ -5392,10 +5392,11 @@ namespace libtorrent
int seeds = 0; int seeds = 0;
int downloaders = 0; int downloaders = 0;
if (m_complete >= 0) seeds = m_complete; if (m_complete != 0xffffff) seeds = m_complete;
else seeds = m_policy.num_seeds(); else seeds = m_policy.num_seeds();
if (m_incomplete >= 0) downloaders = m_incomplete; if (m_downloaders != 0xffffff) downloaders = m_downloaders;
else if (m_incomplete != 0xffffff) downloaders = m_incomplete;
else downloaders = m_policy.num_peers() - m_policy.num_seeds(); else downloaders = m_policy.num_peers() - m_policy.num_seeds();
if (seeds == 0) if (seeds == 0)

View File

@@ -568,7 +568,7 @@ namespace libtorrent
} }
cb->tracker_scrape_response(tracker_req() cb->tracker_scrape_response(tracker_req()
, complete, incomplete, downloaded); , complete, incomplete, downloaded, -1);
m_man.remove_request(this); m_man.remove_request(this);
close(); close();