From eca5300ebba5db26cb2d35634836eb75a6110941 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Wed, 15 Jun 2005 12:54:35 +0000 Subject: [PATCH] *** empty log message *** --- include/libtorrent/peer_connection.hpp | 7 +++++++ include/libtorrent/torrent.hpp | 7 +++++++ src/identify_client.cpp | 1 + src/peer_connection.cpp | 27 +++++++++++++++++++++----- src/torrent.cpp | 20 +++++++++++++++---- 5 files changed, 53 insertions(+), 9 deletions(-) diff --git a/include/libtorrent/peer_connection.hpp b/include/libtorrent/peer_connection.hpp index 5b49f754d..4ba3d8f3c 100755 --- a/include/libtorrent/peer_connection.hpp +++ b/include/libtorrent/peer_connection.hpp @@ -524,6 +524,13 @@ namespace libtorrent // may not even have been attempted when the // time out is reached. bool m_connecting; + + // the number of bytes of metadata we have received + // so far from this per, only counting the current + // request. Any previously finished requests + // that have been forwarded to the torrent object + // do not count. + int m_metadata_progress; }; } diff --git a/include/libtorrent/torrent.hpp b/include/libtorrent/torrent.hpp index da2589202..6548f1823 100755 --- a/include/libtorrent/torrent.hpp +++ b/include/libtorrent/torrent.hpp @@ -130,6 +130,10 @@ namespace libtorrent // debug purpose only void print(std::ostream& os) const; + // this is called from the peer_connection for + // each piece of metadata it receives + void metadata_progress(int total_size, int received); + void check_files( detail::piece_checker_data& data , boost::mutex& mutex, bool lock_session = true); @@ -509,6 +513,9 @@ namespace libtorrent // determines the storage state for this torrent. const bool m_compact_mode; + + int m_metadata_progress; + int m_metadata_size; }; inline boost::posix_time::ptime torrent::next_announce() const diff --git a/src/identify_client.cpp b/src/identify_client.cpp index 2c0878bce..8bd27276b 100755 --- a/src/identify_client.cpp +++ b/src/identify_client.cpp @@ -159,6 +159,7 @@ namespace , map_entry("AR", "Arctic Torrent") , map_entry("AZ", "Azureus") , map_entry("BB", "BitBuddy") + , map_entry("BC", "BitComet") , map_entry("BS", "BTSlave") , map_entry("BX", "BittorrentX") , map_entry("CT", "CTorrent") diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index 620eb91ce..053018b3c 100755 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -124,6 +124,7 @@ namespace libtorrent , boost::posix_time::seconds(0)) , m_waiting_metadata_request(false) , m_connecting(false) + , m_metadata_progress(0) { INVARIANT_CHECK; @@ -203,6 +204,7 @@ namespace libtorrent , boost::posix_time::seconds(0)) , m_waiting_metadata_request(false) , m_connecting(true) + , m_metadata_progress(0) { INVARIANT_CHECK; @@ -1151,7 +1153,8 @@ namespace libtorrent const char* ptr = &m_recv_buffer[1]; int extended_id = detail::read_int32(ptr); - if (!m_ses.m_extension_enabled[extended_id]) + if (extended_id >= 0 && extended_id < num_supported_extensions + && !m_ses.m_extension_enabled[extended_id]) throw protocol_error("'extended' message using disabled extension"); switch (extended_id) @@ -1165,7 +1168,8 @@ namespace libtorrent case extended_listen_port_message: on_listen_port(); break; default: - throw protocol_error("unknown extended message id"); + throw protocol_error("unknown extended message id: " + + boost::lexical_cast(extended_id)); }; } @@ -1218,15 +1222,17 @@ namespace libtorrent if (m_packet_size > 500 * 1024) throw protocol_error("metadata message larger than 500 kB"); - if (m_recv_pos < m_packet_size) return; + if (m_recv_pos < 6) return; - std::vector::iterator ptr = m_recv_buffer.begin()+5; + std::vector::iterator ptr = m_recv_buffer.begin() + 5; int type = detail::read_uint8(ptr); switch (type) { case 0: // request { + if (m_recv_pos < m_packet_size) return; + int start = detail::read_uint8(ptr); int size = detail::read_uint8(ptr) + 1; @@ -1241,6 +1247,7 @@ namespace libtorrent break; case 1: // data { + if (m_recv_pos < 14) return; int total_size = detail::read_int32(ptr); int offset = detail::read_int32(ptr); int data_size = m_packet_size - 5 - 9; @@ -1252,6 +1259,11 @@ namespace libtorrent if (offset + data_size > total_size) throw protocol_error("invalid metadata message"); + m_torrent->metadata_progress(total_size, m_recv_pos - 14 + - m_metadata_progress); + m_metadata_progress = m_recv_pos - 14; + if (m_recv_pos < m_packet_size) return; + #ifdef TORRENT_VERBOSE_LOGGING using namespace boost::posix_time; (*m_logger) << to_simple_string(second_clock::universal_time()) @@ -1259,17 +1271,22 @@ namespace libtorrent << offset << " size: " << data_size << " ]\n"; #endif - m_waiting_metadata_request = false; m_torrent->received_metadata(&m_recv_buffer[5+9], data_size, offset, total_size); + m_metadata_progress = 0; } break; case 2: // have no data + if (m_recv_pos < m_packet_size) return; + m_no_metadata = second_clock::universal_time(); if (m_waiting_metadata_request) m_torrent->cancel_metadata_request(m_last_metadata_request); m_waiting_metadata_request = false; break; + default: + throw protocol_error("unknown metadata extension message: " + + boost::lexical_cast(type)); } } diff --git a/src/torrent.cpp b/src/torrent.cpp index d82e27740..131d9c8ce 100755 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -181,6 +181,8 @@ namespace libtorrent , m_download_bandwidth_limit(std::numeric_limits::max()) , m_save_path(complete(save_path)) , m_compact_mode(compact_mode) + , m_metadata_progress(0) + , m_metadata_size(0) { m_uploads_quota.min = 2; m_connections_quota.min = 2; @@ -230,6 +232,8 @@ namespace libtorrent , m_download_bandwidth_limit(std::numeric_limits::max()) , m_save_path(complete(save_path)) , m_compact_mode(compact_mode) + , m_metadata_progress(0) + , m_metadata_size(0) { m_uploads_quota.min = 2; m_connections_quota.min = 2; @@ -834,6 +838,8 @@ namespace libtorrent if (lock_session) m = &m_ses.m_mutex; boost::mutex::scoped_lock l(mutex); + if (data.abort) return; + boost::mutex::scoped_lock l2(*m); m_num_pieces = std::count( m_have_pieces.begin() @@ -1123,10 +1129,8 @@ namespace libtorrent else st.state = torrent_status::downloading_metadata; - st.progress = std::count( - m_have_metadata.begin() - , m_have_metadata.end() - , true) / 256.f; + if (m_metadata_size == 0) st.progress = 0.f; + else st.progress = std::min(1.f, m_metadata_progress / (float)m_metadata_size); return st; } @@ -1259,6 +1263,8 @@ namespace libtorrent m_have_metadata.begin() , m_have_metadata.begin() + req.first + req.second , false); + m_metadata_progress = 0; + m_metadata_size = 0; return false; } @@ -1411,3 +1417,9 @@ namespace libtorrent } +void torrent::metadata_progress(int total_size, int received) +{ + m_metadata_progress += received; + m_metadata_size = total_size; +} +