diff --git a/src/Makefile.am b/src/Makefile.am index e5af6fa8..230801b6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -40,13 +40,13 @@ libsub_root_a_SOURCES = \ bin_PROGRAMS = rtorrent rtorrent_LDADD = \ + libsub_root.a \ ui/libsub_ui.a \ core/libsub_core.a \ display/libsub_display.a \ input/libsub_input.a \ rpc/libsub_rpc.a \ - utils/libsub_utils.a \ - libsub_root.a + utils/libsub_utils.a rtorrent_SOURCES = \ main.cc diff --git a/src/command_helpers.h b/src/command_helpers.h index aceab329..00d9d55a 100644 --- a/src/command_helpers.h +++ b/src/command_helpers.h @@ -247,9 +247,15 @@ add_variable(key, NULL, NULL, &rpc::CommandVariable::get_string, NULL, std::stri #define CMD2_ANY_VALUE(key, slot) \ CMD2_A_FUNCTION(key, command_base_call_any_value, any_value_function, slot, "i:i", "") +#define CMD2_ANY_VALUE_V(key, slot) \ + CMD2_A_FUNCTION(key, command_base_call_any_value, any_value_function, object_convert_void(slot), "i:i", "") + #define CMD2_ANY_STRING(key, slot) \ CMD2_A_FUNCTION(key, command_base_call_any_string, any_string_function, slot, "i:s", "") +#define CMD2_ANY_STRING_V(key, slot) \ + CMD2_A_FUNCTION(key, command_base_call_any_string, any_string_function, object_convert_void(slot), "i:s", "") + #define CMD2_ANY_LIST(key, slot) \ CMD2_A_FUNCTION(key, command_base_call_any_list, any_list_function, slot, "i:", "") diff --git a/src/command_network.cc b/src/command_network.cc index 566de2d1..96bfdeb2 100644 --- a/src/command_network.cc +++ b/src/command_network.cc @@ -47,6 +47,7 @@ #include #include #include +#include #include "core/dht_manager.h" #include "core/download.h" @@ -315,7 +316,7 @@ initialize_xmlrpc() { control->core()->push_log(buffer); } -void +torrent::Object apply_scgi(const std::string& arg, int type) { if (worker_thread->scgi() != NULL) throw torrent::input_error("SCGI already enabled."); @@ -358,7 +359,7 @@ apply_scgi(const std::string& arg, int type) { throw torrent::input_error("Invalid port number."); saPtr->set_port(port); - scgi->open_port(saPtr, saPtr->length(), rpc::call_command_value("get_scgi_dont_route")); + scgi->open_port(saPtr, saPtr->length(), rpc::call_command_value("network.scgi.dont_route")); break; @@ -378,6 +379,7 @@ apply_scgi(const std::string& arg, int type) { } worker_thread->set_scgi(scgi); + return torrent::Object(); } void @@ -399,6 +401,7 @@ apply_xmlrpc_dialect(const std::string& arg) { void initialize_command_network() { torrent::ConnectionManager* cm = torrent::connection_manager(); + torrent::FileManager* fileManager = torrent::file_manager(); core::CurlStack* httpStack = control->core()->http_stack(); ADD_VARIABLE_BOOL("use_udp_trackers", true); @@ -423,9 +426,6 @@ initialize_command_network() { ADD_VARIABLE_VALUE("max_downloads_div", 1); ADD_VARIABLE_VALUE("max_downloads_global", 0); -// ADD_COMMAND_VALUE_TRI("max_uploads_global", rak::make_mem_fun(control->ui(), &ui::Root::set_max_uploads_global), rak::make_mem_fun(control->ui(), &ui::Root::max_uploads_global)); -// ADD_COMMAND_VALUE_TRI("max_downloads_global", rak::make_mem_fun(control->ui(), &ui::Root::set_max_downloads_global), rak::make_mem_fun(control->ui(), &ui::Root::max_downloads_global)); - ADD_COMMAND_VALUE_TRI_KB("download_rate", rak::make_mem_fun(control->ui(), &ui::Root::set_down_throttle_i64), rak::make_mem_fun(torrent::down_throttle_global(), &torrent::Throttle::max_rate)); ADD_COMMAND_VALUE_TRI_KB("upload_rate", rak::make_mem_fun(control->ui(), &ui::Root::set_up_throttle_i64), rak::make_mem_fun(torrent::up_throttle_global(), &torrent::Throttle::max_rate)); @@ -445,33 +445,45 @@ initialize_command_network() { CMD2_ANY_STRING("get_throttle_down_max", std::tr1::bind(&retrieve_throttle_info, std::tr1::placeholders::_2, throttle_info_down | throttle_info_max)); CMD2_ANY_STRING("get_throttle_down_rate", std::tr1::bind(&retrieve_throttle_info, std::tr1::placeholders::_2, throttle_info_down | throttle_info_rate)); - CMD2_ANY_STRING("tos", std::tr1::bind(&apply_tos, std::tr1::placeholders::_2)); - CMD2_ANY_LIST("encryption", std::tr1::bind(&apply_encryption, std::tr1::placeholders::_2)); - ADD_COMMAND_STRING_TRI("bind", rak::make_mem_fun(control->core(), &core::Manager::set_bind_address), rak::make_mem_fun(control->core(), &core::Manager::bind_address)); - ADD_COMMAND_STRING_TRI("ip", rak::make_mem_fun(control->core(), &core::Manager::set_local_address), rak::make_mem_fun(control->core(), &core::Manager::local_address)); - ADD_COMMAND_STRING_TRI("proxy_address", rak::make_mem_fun(control->core(), &core::Manager::set_proxy_address), rak::make_mem_fun(control->core(), &core::Manager::proxy_address)); - ADD_COMMAND_STRING_TRI("http_proxy", rak::make_mem_fun(httpStack, &core::CurlStack::set_http_proxy), rak::make_mem_fun(httpStack, &core::CurlStack::http_proxy)); - ADD_COMMAND_STRING_TRI("http_capath", rak::make_mem_fun(httpStack, &core::CurlStack::set_http_capath), rak::make_mem_fun(httpStack, &core::CurlStack::http_capath)); - ADD_COMMAND_STRING_TRI("http_cacert", rak::make_mem_fun(httpStack, &core::CurlStack::set_http_cacert), rak::make_mem_fun(httpStack, &core::CurlStack::http_cacert)); + CMD2_ANY ("network.http.capath", std::tr1::bind(&core::CurlStack::http_capath, httpStack)); + CMD2_ANY_STRING_V("network.http.capath.set", std::tr1::bind(&core::CurlStack::set_http_capath, httpStack, std::tr1::placeholders::_2)); + CMD2_ANY ("network.http.cacert", std::tr1::bind(&core::CurlStack::http_cacert, httpStack)); + CMD2_ANY_STRING_V("network.http.cacert.set", std::tr1::bind(&core::CurlStack::set_http_cacert, httpStack, std::tr1::placeholders::_2)); + CMD2_ANY ("network.http.proxy_address", std::tr1::bind(&core::CurlStack::http_proxy, httpStack)); + CMD2_ANY_STRING_V("network.http.proxy_address.set", std::tr1::bind(&core::CurlStack::set_http_proxy, httpStack, std::tr1::placeholders::_2)); + CMD2_ANY ("network.http.max_open", std::tr1::bind(&core::CurlStack::max_active, httpStack)); + CMD2_ANY_VALUE_V ("network.http.max_open.set", std::tr1::bind(&core::CurlStack::set_max_active, httpStack, std::tr1::placeholders::_2)); - ADD_COMMAND_VALUE_TRI("send_buffer_size", rak::make_mem_fun(cm, &torrent::ConnectionManager::set_send_buffer_size), rak::make_mem_fun(cm, &torrent::ConnectionManager::send_buffer_size)); - ADD_COMMAND_VALUE_TRI("receive_buffer_size", rak::make_mem_fun(cm, &torrent::ConnectionManager::set_receive_buffer_size), rak::make_mem_fun(cm, &torrent::ConnectionManager::receive_buffer_size)); + CMD2_ANY ("network.send_buffer.size", std::tr1::bind(&torrent::ConnectionManager::send_buffer_size, cm)); + CMD2_ANY_VALUE_V ("network.send_buffer.size.set", std::tr1::bind(&torrent::ConnectionManager::set_send_buffer_size, cm, std::tr1::placeholders::_2)); + CMD2_ANY ("network.receive_buffer.size", std::tr1::bind(&torrent::ConnectionManager::receive_buffer_size, cm)); + CMD2_ANY_VALUE_V ("network.receive_buffer.size.set", std::tr1::bind(&torrent::ConnectionManager::set_receive_buffer_size, cm, std::tr1::placeholders::_2)); + CMD2_ANY_STRING ("network.tos.set", std::tr1::bind(&apply_tos, std::tr1::placeholders::_2)); - ADD_COMMAND_VALUE_TRI("hash_max_tries", std::ptr_fun(&torrent::set_hash_max_tries), rak::ptr_fun(&torrent::hash_max_tries)); - ADD_COMMAND_VALUE_TRI("max_open_files", std::ptr_fun(&torrent::set_max_open_files), rak::ptr_fun(&torrent::max_open_files)); - ADD_COMMAND_VALUE_TRI("max_open_sockets", rak::make_mem_fun(cm, &torrent::ConnectionManager::set_max_size), rak::make_mem_fun(cm, &torrent::ConnectionManager::max_size)); - ADD_COMMAND_VALUE_TRI("max_open_http", rak::make_mem_fun(httpStack, &core::CurlStack::set_max_active), rak::make_mem_fun(httpStack, &core::CurlStack::max_active)); + CMD2_ANY ("network.bind_address", std::tr1::bind(&core::Manager::bind_address, control->core())); + CMD2_ANY_STRING_V("network.bind_address.set", std::tr1::bind(&core::Manager::set_bind_address, control->core(), std::tr1::placeholders::_2)); + CMD2_ANY ("network.local_address", std::tr1::bind(&core::Manager::local_address, control->core())); + CMD2_ANY_STRING_V("network.local_address.set", std::tr1::bind(&core::Manager::set_local_address, control->core(), std::tr1::placeholders::_2)); + CMD2_ANY ("network.proxy_address", std::tr1::bind(&core::Manager::proxy_address, control->core())); + CMD2_ANY_STRING_V("network.proxy_address.set", std::tr1::bind(&core::Manager::set_proxy_address, control->core(), std::tr1::placeholders::_2)); + + CMD2_ANY ("network.max_open_files", std::tr1::bind(&torrent::FileManager::max_open_files, fileManager)); + CMD2_ANY_VALUE_V ("network.max_open_files.set", std::tr1::bind(&torrent::FileManager::set_max_open_files, fileManager, std::tr1::placeholders::_2)); + CMD2_ANY ("network.max_open_sockets", std::tr1::bind(&torrent::ConnectionManager::max_size, cm)); + CMD2_ANY_VALUE_V ("network.max_open_sockets.set", std::tr1::bind(&torrent::ConnectionManager::set_max_size, cm, std::tr1::placeholders::_2)); + + CMD2_ANY_STRING ("network.scgi.open_port", std::tr1::bind(&apply_scgi, std::tr1::placeholders::_2, 1)); + CMD2_ANY_STRING ("network.scgi.open_local", std::tr1::bind(&apply_scgi, std::tr1::placeholders::_2, 2)); + rpc::commands.call("method.insert", rpc::create_object_list("network.scgi.dont_route", "bool|const", int64_t())); - ADD_COMMAND_STRING_UN("scgi_port", rak::bind2nd(std::ptr_fun(&apply_scgi), 1)); - ADD_COMMAND_STRING_UN("scgi_local", rak::bind2nd(std::ptr_fun(&apply_scgi), 2)); - ADD_VARIABLE_BOOL ("scgi_dont_route", false); ADD_COMMAND_STRING_UN("xmlrpc_dialect", std::ptr_fun(&apply_xmlrpc_dialect)); ADD_COMMAND_VALUE_TRI("xmlrpc_size_limit", std::ptr_fun(&rpc::XmlRpc::set_size_limit), rak::ptr_fun(&rpc::XmlRpc::size_limit)); ADD_COMMAND_VALUE_TRI("hash_read_ahead", std::ptr_fun(&apply_hash_read_ahead), rak::ptr_fun(torrent::hash_read_ahead)); ADD_COMMAND_VALUE_TRI("hash_interval", std::ptr_fun(&apply_hash_interval), rak::ptr_fun(torrent::hash_interval)); + ADD_COMMAND_VALUE_TRI("hash_max_tries", std::ptr_fun(&torrent::set_hash_max_tries), rak::ptr_fun(&torrent::hash_max_tries)); ADD_COMMAND_VALUE_UN("enable_trackers", std::ptr_fun(&apply_enable_trackers)); ADD_COMMAND_STRING_UN("encoding_list", std::ptr_fun(&apply_encoding_list)); diff --git a/src/command_ui.cc b/src/command_ui.cc index 94360d96..91f31788 100644 --- a/src/command_ui.cc +++ b/src/command_ui.cc @@ -399,18 +399,17 @@ apply_if(rpc::target_type target, const torrent::Object& rawArgs, int flags) { } torrent::Object -cmd_view_size(__UNUSED rpc::target_type target, const torrent::Object& rawArgs) { - return (*control->view_manager()->find_throw(rawArgs.as_string()))->size_visible(); +cmd_view_size(const torrent::Object::string_type& args) { + return (*control->view_manager()->find_throw(args))->size_visible(); } torrent::Object -cmd_view_size_not_visible(__UNUSED rpc::target_type target, const torrent::Object& rawArgs) { - return (*control->view_manager()->find_throw(rawArgs.as_string()))->size_not_visible(); +cmd_view_size_not_visible(const torrent::Object::string_type& args) { + return (*control->view_manager()->find_throw(args))->size_not_visible(); } torrent::Object -cmd_view_persistent(__UNUSED rpc::target_type target, const torrent::Object& rawArgs) { - const std::string& args = rawArgs.as_string(); +cmd_view_persistent(const torrent::Object::string_type& args) { core::View* view = *control->view_manager()->find_throw(args); if (!view->get_filter().empty() || !view->get_event_added().empty() || !view->get_event_removed().empty()) @@ -424,9 +423,8 @@ cmd_view_persistent(__UNUSED rpc::target_type target, const torrent::Object& raw } torrent::Object -cmd_ui_set_view(__UNUSED rpc::target_type target, const torrent::Object& rawArgs) { - control->ui()->download_list()->set_current_view(rawArgs.as_string()); - +cmd_ui_set_view(const torrent::Object::string_type& args) { + control->ui()->download_list()->set_current_view(args); return torrent::Object(); } @@ -479,19 +477,17 @@ initialize_command_ui() { // Cleanup and add . to view. - CMD_G_STRING("view.size", rak::ptr_fn(&cmd_view_size)); - CMD_G_STRING("view.size_not_visible", rak::ptr_fn(&cmd_view_size_not_visible)); - CMD_G_STRING("view.persistent", rak::ptr_fn(&cmd_view_persistent)); + CMD2_ANY_STRING("view.size", std::tr1::bind(&cmd_view_size, std::tr1::placeholders::_2)); + CMD2_ANY_STRING("view.size_not_visible", std::tr1::bind(&cmd_view_size_not_visible, std::tr1::placeholders::_2)); + CMD2_ANY_STRING("view.persistent", std::tr1::bind(&cmd_view_persistent, std::tr1::placeholders::_2)); CMD_D_STRING("view.filter_download", rak::ptr_fn(&cmd_view_filter_download)); CMD_D_STRING("view.set_visible", rak::ptr_fn(&cmd_view_set_visible)); CMD_D_STRING("view.set_not_visible", rak::ptr_fn(&cmd_view_set_not_visible)); // Commands that affect the default rtorrent UI. - -// ADD_ANY_NONE("ui.focus", rak::ptr_fn(&cmd_ui_focus)); CMD_D_ANY("ui.unfocus_download", rak::ptr_fn(&cmd_ui_unfocus_download)); - CMD_N_STRING("ui.current_view.set", rak::ptr_fn(&cmd_ui_set_view)); + CMD2_ANY_STRING("ui.current_view.set", std::tr1::bind(&cmd_ui_set_view, std::tr1::placeholders::_2)); // Move. CMD2_ANY("print", &apply_print); diff --git a/src/display/utils.cc b/src/display/utils.cc index b9cfa6b6..72f99f66 100644 --- a/src/display/utils.cc +++ b/src/display/utils.cc @@ -50,6 +50,7 @@ #include #include #include +#include #include #include "core/download.h" @@ -309,8 +310,8 @@ print_status_extra(char* first, char* last) { torrent::connection_manager()->max_size()); first = print_buffer(first, last, " [F %i/%i]", - torrent::open_files(), - torrent::max_open_files()); + torrent::file_manager()->open_files(), + torrent::file_manager()->max_open_files()); return first; } diff --git a/src/main.cc b/src/main.cc index 3d59c9be..445f7505 100644 --- a/src/main.cc +++ b/src/main.cc @@ -88,7 +88,7 @@ parse_options(Control* c, int argc, char** argv) { optionParser.insert_flag('n', OptionParser::Slot()); optionParser.insert_flag('D', OptionParser::Slot()); - optionParser.insert_option('b', sigc::bind<0>(sigc::ptr_fun(&rpc::call_command_set_string), "bind")); + optionParser.insert_option('b', sigc::bind<0>(sigc::ptr_fun(&rpc::call_command_set_string), "network.bind_address.set")); optionParser.insert_option('d', sigc::bind<0>(sigc::ptr_fun(&rpc::call_command_set_string), "directory")); optionParser.insert_option('i', sigc::bind<0>(sigc::ptr_fun(&rpc::call_command_set_string), "ip")); optionParser.insert_option('p', sigc::bind<0>(sigc::ptr_fun(&rpc::call_command_set_string), "port_range")); @@ -351,6 +351,30 @@ main(int argc, char** argv) { "method.insert = get_max_memory_usage,redirect|const,pieces.memory.max\n" "method.insert = set_max_memory_usage,redirect|const,pieces.memory.max.set\n" + "method.insert = get_send_buffer_size,redirect|const,network.send_buffer.size\n" + "method.insert = set_send_buffer_size,redirect|const,network.send_buffer.size.set\n" + "method.insert = get_receive_buffer_size,redirect|const,network.receive_buffer.size\n" + "method.insert = set_receive_buffer_size,redirect|const,network.receive_buffer.size.set\n" + + "method.insert = bind, redirect|const,network.bind_address.set\n" + "method.insert = set_bind,redirect|const,network.bind_address.set\n" + "method.insert = get_bind,redirect|const,network.bind_address\n" + + "method.insert = ip, redirect|const,network.local_address.set\n" + "method.insert = set_ip,redirect|const,network.local_address.set\n" + "method.insert = get_ip,redirect|const,network.local_address\n" + + "method.insert = proxy_address, redirect|const,network.proxy_address.set\n" + "method.insert = set_proxy_address,redirect|const,network.proxy_address.set\n" + "method.insert = get_proxy_address,redirect|const,network.proxy_address\n" + + "method.insert = scgi_port, redirect|const,network.scgi.open_port\n" + "method.insert = scgi_local,redirect|const,network.scgi.open_local\n" + + "method.insert = scgi_dont_route, redirect|const,network.scgi.dont_route.set\n" + "method.insert = set_scgi_dont_route,redirect|const,network.scgi.dont_route.set\n" + "method.insert = get_scgi_dont_route,redirect|const,network.scgi.dont_route\n" + "method.insert = d.get_hash,redirect|const,d.hash\n" "method.insert = d.get_local_id,redirect|const,d.local_id\n" "method.insert = d.get_local_id_html,redirect|const,d.local_id_html\n" diff --git a/src/ui/download.cc b/src/ui/download.cc index e2a991ff..d99e5f97 100644 --- a/src/ui/download.cc +++ b/src/ui/download.cc @@ -178,8 +178,8 @@ Download::create_info() { element->push_back(""); element->push_column("Connection type:", te_command("d.get_connection_current=")); element->push_column("Safe sync:", te_command("if=$pieces.sync.always_safe=,yes,no")); - element->push_column("Send buffer:", te_command("cat=$to_kb=$get_send_buffer_size=,\" KB\"")); - element->push_column("Receive buffer:", te_command("cat=$to_kb=$get_receive_buffer_size=,\" KB\"")); + element->push_column("Send buffer:", te_command("cat=$to_kb=$network.send_buffer.size=,\" KB\"")); + element->push_column("Receive buffer:", te_command("cat=$to_kb=$network.receive_buffer.size=,\" KB\"")); // TODO: Define a custom command for this and use $argument.0 instead of looking up the name multiple times? element->push_column("Throttle:", te_command("branch=d.get_throttle_name=,\""