diff --git a/src/command_network.cc b/src/command_network.cc index aa5951df..f2354fdf 100644 --- a/src/command_network.cc +++ b/src/command_network.cc @@ -48,6 +48,7 @@ #include #include #include +#include #include "core/dht_manager.h" #include "core/download.h" @@ -483,6 +484,55 @@ apply_ip_tables_add_address(const torrent::Object::list_type& args) { return torrent::Object(); } +// +// +// + +torrent::Object +apply_ipv4_filter_get(const std::string& args) { + // Move to a helper function, add support for addresses. + uint32_t ip_values[4]; + + if (sscanf(args.c_str(), "%u.%u.%u.%u", + ip_values + 0, ip_values + 1, ip_values + 2, ip_values + 3) != 4) + throw torrent::input_error("Invalid address format."); + + return torrent::PeerList::ipv4_filter()->at((ip_values[0] << 24) + (ip_values[1] << 16) + (ip_values[2] << 8) + ip_values[3]); +} + +torrent::Object +apply_ipv4_filter_add_address(const torrent::Object::list_type& args) { + if (args.size() != 2) + throw torrent::input_error("Incorrect number of arguments."); + + torrent::Object::list_const_iterator args_itr = args.begin(); + + const std::string& address = (args_itr++)->as_string(); + const std::string& value_str = (args_itr++)->as_string(); + + // Move to a helper function, add support for addresses. + uint32_t ip_values[4]; + unsigned int block = rpc::ipv4_table::mask_bits; + + if (sscanf(address.c_str(), "%u.%u.%u.%u/%u", + ip_values + 0, ip_values + 1, ip_values + 2, ip_values + 3, &block) < 4 || + block > rpc::ipv4_table::mask_bits) + throw torrent::input_error("Invalid address format."); + + int value; + + if (value_str == "unwanted") + value = torrent::PeerInfo::flag_unwanted; + else if (value_str == "preferred") + value = torrent::PeerInfo::flag_preferred; + else + throw torrent::input_error("Invalid value."); + + torrent::PeerList::ipv4_filter()->insert((ip_values[0] << 24) + (ip_values[1] << 16) + (ip_values[2] << 8) + ip_values[3], + rpc::ipv4_table::mask_bits - block, value); + return torrent::Object(); +} + void initialize_command_network() { torrent::ConnectionManager* cm = torrent::connection_manager(); @@ -595,6 +645,9 @@ initialize_command_network() { CMD2_ANY_LIST ("ip_tables.get", std::tr1::bind(&apply_ip_tables_get, std::tr1::placeholders::_2)); CMD2_ANY_LIST ("ip_tables.add_address", std::tr1::bind(&apply_ip_tables_add_address, std::tr1::placeholders::_2)); + CMD2_ANY_STRING ("ipv4_filter.get", std::tr1::bind(&apply_ipv4_filter_get, std::tr1::placeholders::_2)); + CMD2_ANY_LIST ("ipv4_filter.add_address", std::tr1::bind(&apply_ipv4_filter_add_address, std::tr1::placeholders::_2)); + // CMD2_ANY_V ("dht.enable", std::tr1::bind(&core::DhtManager::set_start, control->dht_manager())); // CMD2_ANY_V ("dht.disable", std::tr1::bind(&core::DhtManager::set_stop, control->dht_manager())); CMD2_ANY_STRING_V("dht.mode.set", std::tr1::bind(&core::DhtManager::set_mode, control->dht_manager(), std::tr1::placeholders::_2)); diff --git a/src/core/download_factory.cc b/src/core/download_factory.cc index 91446e9d..ba898d00 100644 --- a/src/core/download_factory.cc +++ b/src/core/download_factory.cc @@ -41,11 +41,11 @@ #include #include #include +#include #include #include #include #include -#include #include #include "rpc/parse_commands.h" diff --git a/src/core/download_list.cc b/src/core/download_list.cc index 15764b7f..b5e4d7cd 100644 --- a/src/core/download_list.cc +++ b/src/core/download_list.cc @@ -43,12 +43,12 @@ #include #include #include +#include #include #include #include #include #include -#include #include #include "rpc/parse_commands.h" diff --git a/src/core/download_store.cc b/src/core/download_store.cc index 33726e87..bf13f451 100644 --- a/src/core/download_store.cc +++ b/src/core/download_store.cc @@ -44,11 +44,11 @@ #include #include #include +#include #include #include #include #include -#include #include #include "utils/directory.h" diff --git a/src/core/manager.cc b/src/core/manager.cc index 706bca37..b8c1378a 100644 --- a/src/core/manager.cc +++ b/src/core/manager.cc @@ -49,12 +49,12 @@ #include #include #include +#include #include #include #include #include #include -#include #include #include diff --git a/src/display/window_peer_list.cc b/src/display/window_peer_list.cc index 628b74bc..1271791d 100644 --- a/src/display/window_peer_list.cc +++ b/src/display/window_peer_list.cc @@ -72,7 +72,7 @@ WindowPeerList::redraw() { m_canvas->print(x, y, "UP"); x += 7; m_canvas->print(x, y, "DOWN"); x += 7; m_canvas->print(x, y, "PEER"); x += 7; - m_canvas->print(x, y, "C/RE/LO"); x += 9; + m_canvas->print(x, y, "CT/RE/LO"); x += 10; m_canvas->print(x, y, "QS"); x += 6; m_canvas->print(x, y, "DONE"); x += 6; m_canvas->print(x, y, "REQ"); x += 6; @@ -109,6 +109,7 @@ WindowPeerList::redraw() { m_canvas->print(x, y, "%.1f", (double)p->peer_rate()->rate() / 1024); x += 7; char remoteChoked; + char peerType; if (!p->is_down_choked_limited()) remoteChoked = 'U'; @@ -117,14 +118,22 @@ WindowPeerList::redraw() { else remoteChoked = 'C'; - m_canvas->print(x, y, "%c/%c%c/%c%c", + if (p->peer_info()->is_blocked()) + peerType = 'u'; + else if (p->peer_info()->is_preferred()) + peerType = 'p'; + else + peerType = ' '; + + m_canvas->print(x, y, "%c%c/%c%c/%c%c", p->is_encrypted() ? (p->is_incoming() ? 'R' : 'L') : (p->is_incoming() ? 'r' : 'l'), + peerType, p->is_down_choked() ? std::tolower(remoteChoked) : remoteChoked, p->is_down_interested() ? 'i' : 'n', p->is_up_choked() ? 'c' : 'u', p->is_up_interested() ? 'i' : 'n'); - x += 9; + x += 10; m_canvas->print(x, y, "%i/%i", p->outgoing_queue_size(), p->incoming_queue_size()); x += 6;