1 // Copyright Daniel Wallin 2007. Use, modification and distribution is
2 // subject to the Boost Software License, Version 1.0. (See accompanying
3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4 
5 #include "boost_python.hpp"
6 #include "bytes.hpp"
7 #include <libtorrent/peer_info.hpp>
8 #include <libtorrent/bitfield.hpp>
9 #include <boost/python/iterator.hpp>
10 
11 using namespace boost::python;
12 using namespace lt;
13 
get_last_active(peer_info const & pi)14 std::int64_t get_last_active(peer_info const& pi)
15 {
16     return total_seconds(pi.last_active);
17 }
18 
get_last_request(peer_info const & pi)19 std::int64_t get_last_request(peer_info const& pi)
20 {
21     return total_seconds(pi.last_request);
22 }
23 
get_download_queue_time(peer_info const & pi)24 std::int64_t get_download_queue_time(peer_info const& pi)
25 {
26     return total_seconds(pi.download_queue_time);
27 }
28 
get_local_endpoint(peer_info const & pi)29 tuple get_local_endpoint(peer_info const& pi)
30 {
31     return boost::python::make_tuple(pi.local_endpoint.address().to_string(), pi.local_endpoint.port());
32 }
33 
get_ip(peer_info const & pi)34 tuple get_ip(peer_info const& pi)
35 {
36     return boost::python::make_tuple(pi.ip.address().to_string(), pi.ip.port());
37 }
38 
get_pieces(peer_info const & pi)39 list get_pieces(peer_info const& pi)
40 {
41     list ret;
42 
43     for (bitfield::const_iterator i = pi.pieces.begin()
44         , end(pi.pieces.end()); i != end; ++i)
45     {
46         ret.append(*i);
47     }
48     return ret;
49 }
50 
get_peer_info_client(peer_info const & pi)51 bytes get_peer_info_client(peer_info const& pi)
52 {
53 	return pi.client;
54 }
55 
56 using by_value = return_value_policy<return_by_value>;
bind_peer_info()57 void bind_peer_info()
58 {
59     scope pi = class_<peer_info>("peer_info")
60         .add_property("flags", make_getter(&peer_info::flags, by_value()))
61         .add_property("source", make_getter(&peer_info::source, by_value()))
62         .add_property("read_state", make_getter(&peer_info::read_state, by_value()))
63         .add_property("write_state", make_getter(&peer_info::write_state, by_value()))
64         .add_property("ip", get_ip)
65         .def_readonly("up_speed", &peer_info::up_speed)
66         .def_readonly("down_speed", &peer_info::down_speed)
67         .def_readonly("payload_up_speed", &peer_info::payload_up_speed)
68         .def_readonly("payload_down_speed", &peer_info::payload_down_speed)
69         .def_readonly("total_download", &peer_info::total_download)
70         .def_readonly("total_upload", &peer_info::total_upload)
71         .def_readonly("pid", &peer_info::pid)
72         .add_property("pieces", get_pieces)
73 #if TORRENT_ABI_VERSION == 1
74         .def_readonly("upload_limit", &peer_info::upload_limit)
75         .def_readonly("download_limit", &peer_info::download_limit)
76         .def_readonly("load_balancing", &peer_info::load_balancing)
77         .def_readonly("remote_dl_rate", &peer_info::remote_dl_rate)
78 #endif
79         .add_property("last_request", get_last_request)
80         .add_property("last_active", get_last_active)
81         .add_property("download_queue_time", get_download_queue_time)
82         .def_readonly("queue_bytes", &peer_info::queue_bytes)
83         .def_readonly("request_timeout", &peer_info::request_timeout)
84         .def_readonly("send_buffer_size", &peer_info::send_buffer_size)
85         .def_readonly("used_send_buffer", &peer_info::used_send_buffer)
86         .def_readonly("receive_buffer_size", &peer_info::receive_buffer_size)
87         .def_readonly("used_receive_buffer", &peer_info::used_receive_buffer)
88         .def_readonly("num_hashfails", &peer_info::num_hashfails)
89         .def_readonly("download_queue_length", &peer_info::download_queue_length)
90         .def_readonly("upload_queue_length", &peer_info::upload_queue_length)
91         .def_readonly("failcount", &peer_info::failcount)
92         .add_property("downloading_piece_index", make_getter(&peer_info::downloading_piece_index, by_value()))
93         .add_property("downloading_block_index", make_getter(&peer_info::downloading_block_index, by_value()))
94         .def_readonly("downloading_progress", &peer_info::downloading_progress)
95         .def_readonly("downloading_total", &peer_info::downloading_total)
96         .add_property("client", get_peer_info_client)
97         .def_readonly("connection_type", &peer_info::connection_type)
98         .def_readonly("pending_disk_bytes", &peer_info::pending_disk_bytes)
99         .def_readonly("send_quota", &peer_info::send_quota)
100         .def_readonly("receive_quota", &peer_info::receive_quota)
101         .def_readonly("rtt", &peer_info::rtt)
102         .def_readonly("num_pieces", &peer_info::num_pieces)
103         .def_readonly("download_rate_peak", &peer_info::download_rate_peak)
104         .def_readonly("upload_rate_peak", &peer_info::upload_rate_peak)
105         .def_readonly("progress", &peer_info::progress)
106         .def_readonly("progress_ppm", &peer_info::progress_ppm)
107 #if TORRENT_ABI_VERSION == 1
108         .def_readonly("estimated_reciprocation_rate", &peer_info::estimated_reciprocation_rate)
109 #endif
110         .add_property("local_endpoint", get_local_endpoint)
111         ;
112 
113     // flags
114     pi.attr("interesting") = peer_info::interesting;
115     pi.attr("choked") = peer_info::choked;
116     pi.attr("remote_interested") = peer_info::remote_interested;
117     pi.attr("remote_choked") = peer_info::remote_choked;
118     pi.attr("supports_extensions") = peer_info::supports_extensions;
119     pi.attr("local_connection") = peer_info::local_connection;
120     pi.attr("handshake") = peer_info::handshake;
121     pi.attr("connecting") = peer_info::connecting;
122 #if TORRENT_ABI_VERSION == 1
123     pi.attr("queued") = peer_info::queued;
124 #endif
125     pi.attr("on_parole") = peer_info::on_parole;
126     pi.attr("seed") = peer_info::seed;
127     pi.attr("optimistic_unchoke") = peer_info::optimistic_unchoke;
128     pi.attr("snubbed") = peer_info::snubbed;
129     pi.attr("upload_only") = peer_info::upload_only;
130     pi.attr("endgame_mode") = peer_info::endgame_mode;
131     pi.attr("holepunched") = peer_info::holepunched;
132 #ifndef TORRENT_DISABLE_ENCRYPTION
133     pi.attr("rc4_encrypted") = peer_info::rc4_encrypted;
134     pi.attr("plaintext_encrypted") = peer_info::plaintext_encrypted;
135 #endif
136 
137     // connection_type
138     pi.attr("standard_bittorrent") = (int)peer_info::standard_bittorrent;
139     pi.attr("web_seed") = (int)peer_info::web_seed;
140 
141     // source
142     pi.attr("tracker") = peer_info::tracker;
143     pi.attr("dht") = peer_info::dht;
144     pi.attr("pex") = peer_info::pex;
145     pi.attr("lsd") = peer_info::lsd;
146     pi.attr("resume_data") = peer_info::resume_data;
147 
148     // read/write state
149     pi.attr("bw_idle") = peer_info::bw_idle;
150 #if TORRENT_ABI_VERSION == 1
151     pi.attr("bw_torrent") = peer_info::bw_torrent;
152     pi.attr("bw_global") = peer_info::bw_global;
153 #endif
154     pi.attr("bw_limit") = peer_info::bw_limit;
155     pi.attr("bw_network") = peer_info::bw_network;
156     pi.attr("bw_disk") = peer_info::bw_disk;
157 }
158 
159