* Added missing command_new_slot.{cc,h} files.

* Converted more commands.


git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@1150 e378c898-3ddf-0310-93e7-cc216c733640
This commit is contained in:
rakshasa
2010-03-21 09:45:45 +00:00
parent 8622100e09
commit 83e993a1eb
10 changed files with 380 additions and 142 deletions
+15 -33
View File
@@ -179,9 +179,7 @@ apply_remove_untied() {
}
torrent::Object
apply_schedule(const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_schedule(const torrent::Object::list_type& args) {
if (args.size() != 4)
throw torrent::input_error("Wrong number of arguments.");
@@ -198,8 +196,7 @@ apply_schedule(const torrent::Object& rawArgs) {
}
torrent::Object
apply_load(int flags, const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_load(const torrent::Object::list_type& args, int flags) {
torrent::Object::list_const_iterator argsItr = args.begin();
if (argsItr == args.end())
@@ -245,8 +242,7 @@ apply_close_low_diskspace(int64_t arg) {
}
torrent::Object
apply_download_list(const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_download_list(const torrent::Object::list_type& args) {
torrent::Object::list_const_iterator argsItr = args.begin();
core::ViewManager* viewManager = control->view_manager();
@@ -273,23 +269,10 @@ apply_download_list(const torrent::Object& rawArgs) {
}
torrent::Object
d_multicall(const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
d_multicall(const torrent::Object::list_type& args) {
if (args.empty())
throw torrent::input_error("Too few arguments.");
// const torrent::Object::string_type& infoHash = args.begin()->as_string();
// core::DownloadList* dList = control->core()->download_list();
// core::DownloadList::iterator dItr = dList->end();
// if (infoHash.size() == 40)
// dItr = dList->find_hex(infoHash.c_str());
// if (dItr == dList->end())
// throw torrent::input_error("Not a valid info-hash.");
core::ViewManager* viewManager = control->view_manager();
core::ViewManager::iterator viewItr;
@@ -334,30 +317,29 @@ initialize_command_events() {
rpc::commands.call("method.insert", rpc::create_object_list("system.session.use_lock", "bool|const", true));
rpc::commands.call("method.insert", rpc::create_object_list("system.session.on_completion", "bool|const", true));
ADD_COMMAND_STRING("on_ratio", rak::ptr_fn(&apply_on_ratio));
CMD2_ANY_STRING("on_ratio", std::tr1::bind(&apply_on_ratio, std::tr1::placeholders::_2));
ADD_COMMAND_VOID("start_tied", &apply_start_tied);
ADD_COMMAND_VOID("stop_untied", &apply_stop_untied);
ADD_COMMAND_VOID("close_untied", &apply_close_untied);
ADD_COMMAND_VOID("remove_untied", &apply_remove_untied);
ADD_COMMAND_LIST("schedule", rak::ptr_fn(&apply_schedule));
CMD2_ANY_LIST("schedule", std::tr1::bind(&apply_schedule, std::tr1::placeholders::_2));
ADD_COMMAND_STRING_UN("schedule_remove", rak::make_mem_fun(control->command_scheduler(), &rpc::CommandScheduler::erase_str));
ADD_COMMAND_STRING_UN("import", std::ptr_fun(&apply_import));
ADD_COMMAND_STRING_UN("try_import", std::ptr_fun(&apply_try_import));
ADD_COMMAND_LIST("load", rak::bind_ptr_fn(&apply_load, core::Manager::create_quiet | core::Manager::create_tied));
ADD_COMMAND_LIST("load_verbose", rak::bind_ptr_fn(&apply_load, core::Manager::create_tied));
ADD_COMMAND_LIST("load_start", rak::bind_ptr_fn(&apply_load, core::Manager::create_quiet | core::Manager::create_tied | core::Manager::create_start));
ADD_COMMAND_LIST("load_start_verbose", rak::bind_ptr_fn(&apply_load, core::Manager::create_tied | core::Manager::create_start));
ADD_COMMAND_LIST("load_raw", rak::bind_ptr_fn(&apply_load, core::Manager::create_quiet | core::Manager::create_raw_data));
ADD_COMMAND_LIST("load_raw_verbose", rak::bind_ptr_fn(&apply_load, core::Manager::create_raw_data));
ADD_COMMAND_LIST("load_raw_start", rak::bind_ptr_fn(&apply_load, core::Manager::create_quiet | core::Manager::create_start | core::Manager::create_raw_data));
CMD2_ANY_LIST("load", std::tr1::bind(&apply_load, std::tr1::placeholders::_2, core::Manager::create_quiet | core::Manager::create_tied));
CMD2_ANY_LIST("load_verbose", std::tr1::bind(&apply_load, std::tr1::placeholders::_2, core::Manager::create_tied));
CMD2_ANY_LIST("load_start", std::tr1::bind(&apply_load, std::tr1::placeholders::_2, core::Manager::create_quiet | core::Manager::create_tied | core::Manager::create_start));
CMD2_ANY_LIST("load_start_verbose", std::tr1::bind(&apply_load, std::tr1::placeholders::_2, core::Manager::create_tied | core::Manager::create_start));
CMD2_ANY_LIST("load_raw", std::tr1::bind(&apply_load, std::tr1::placeholders::_2, core::Manager::create_quiet | core::Manager::create_raw_data));
CMD2_ANY_LIST("load_raw_verbose", std::tr1::bind(&apply_load, std::tr1::placeholders::_2, core::Manager::create_raw_data));
CMD2_ANY_LIST("load_raw_start", std::tr1::bind(&apply_load, std::tr1::placeholders::_2, core::Manager::create_quiet | core::Manager::create_start | core::Manager::create_raw_data));
ADD_COMMAND_VALUE_UN("close_low_diskspace", std::ptr_fun(&apply_close_low_diskspace));
ADD_COMMAND_LIST("download_list", rak::ptr_fn(&apply_download_list));
ADD_COMMAND_LIST("d.multicall", rak::ptr_fn(&d_multicall));
ADD_COMMAND_COPY("call_download", call_list, "i:", "");
CMD2_ANY_LIST("download_list", std::tr1::bind(&apply_download_list, std::tr1::placeholders::_2));
CMD2_ANY_LIST("d.multicall", std::tr1::bind(&d_multicall, std::tr1::placeholders::_2));
}
+40 -18
View File
@@ -152,9 +152,6 @@ add_variable(key, NULL, NULL, &rpc::CommandVariable::get_string, NULL, std::stri
#define ADD_COMMAND_VOID(key, slot) \
ADD_COMMAND_SLOT(key, call_unknown, rpc::object_void_fn(slot), "i:", "")
#define ADD_COMMAND_VALUE(key, slot) \
ADD_COMMAND_SLOT(key, call_value, slot, "i:i", "")
#define ADD_COMMAND_VALUE_UN(key, slot) \
ADD_COMMAND_SLOT(key, call_value, rpc::object_value_fn(slot), "i:i", "")
@@ -164,21 +161,9 @@ add_variable(key, NULL, NULL, &rpc::CommandVariable::get_string, NULL, std::stri
#define ADD_COMMAND_STRING_UN(key, slot) \
ADD_COMMAND_SLOT(key, call_string, rpc::object_string_fn(slot), "i:s", "")
#define ADD_COMMAND_LIST(key, slot) \
ADD_COMMAND_SLOT(key, call_list, slot, "i:", "")
#define ADD_COMMAND_NONE(key, slot) \
ADD_COMMAND_SLOT(key, call_unknown, slot, "i:", "")
#define ADD_ANY_NONE(key, slot) \
ADD_ANY_SLOT(key, call_unknown, slot, "i:", "")
#define ADD_ANY_VALUE(key, slot) \
ADD_ANY_SLOT(key, call_value, slot, "i:i", "")
#define ADD_ANY_LIST(key, slot) \
ADD_ANY_SLOT(key, call_list, slot, "i:i", "")
#define ADD_COMMAND_NONE_L(key, slot) \
ADD_COMMAND_SLOT(key, call_unknown, slot, "A:", "")
@@ -250,14 +235,51 @@ add_variable(key, NULL, NULL, &rpc::CommandVariable::get_string, NULL, std::stri
#define CMD2_A_FUNCTION(key, function, func_type, slot, parm, doc) \
commandNewSlotItr->set_function<rpc::func_type>(slot); \
m_map.insert_type(key, commandNewSlotItr++, &rpc::function, \
rpc::commands.insert_type(key, commandNewSlotItr++, &rpc::function, \
rpc::CommandMap::flag_dont_delete | rpc::CommandMap::flag_public_xmlrpc, NULL, NULL);
#define CMD2_A(key, slot) \
#define CMD2_ANY(key, slot) \
CMD2_A_FUNCTION(key, command_base_call_any, any_function, slot, "i:", "")
#define CMD2_A_STRING(key, slot) \
#define CMD2_ANY_L(key, slot) \
CMD2_A_FUNCTION(key, command_base_call_any_list, any_list_function, slot, "A:", "")
#define CMD2_ANY_VALUE(key, slot) \
CMD2_A_FUNCTION(key, command_base_call_any_value, any_value_function, 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_LIST(key, slot) \
CMD2_A_FUNCTION(key, command_base_call_any_list, any_list_function, slot, "i:", "")
//
// Conversion of return types:
//
template <typename Functor, typename Result>
struct object_convert_type;
template <typename Functor>
struct object_convert_type<Functor, void> {
template <typename Signature> struct result {
typedef torrent::Object type;
};
object_convert_type(Functor s) : m_slot(s) {}
torrent::Object operator () () { m_slot(); return torrent::Object(); }
template <typename Arg1>
torrent::Object operator () (Arg1& arg1) { m_slot(arg1); return torrent::Object(); }
template <typename Arg1, typename Arg2>
torrent::Object operator () (Arg1& arg1, Arg2& arg2) { m_slot(arg1, arg2); return torrent::Object(); }
Functor m_slot;
};
template <typename T>
object_convert_type<T, void>
object_convert_void(T f) { return f; }
#endif
+11 -11
View File
@@ -64,7 +64,7 @@ typedef torrent::ChunkManager CM_t;
typedef torrent::FileManager FM_t;
torrent::Object
apply_log(int logType, const torrent::Object& rawArgs) {
apply_log(const torrent::Object::string_type& arg, int logType) {
if (rpc::execFile.log_fd() != -1) {
switch (logType) {
case 0: ::close(rpc::execFile.log_fd()); rpc::execFile.set_log_fd(-1); break;
@@ -78,8 +78,8 @@ apply_log(int logType, const torrent::Object& rawArgs) {
}
}
if (rawArgs.is_string() && !rawArgs.as_string().empty()) {
int logFd = open(rak::path_expand(rawArgs.as_string()).c_str(), O_WRONLY | O_APPEND | O_CREAT, 0644);
if (arg.empty()) {
int logFd = open(rak::path_expand(arg).c_str(), O_WRONLY | O_APPEND | O_CREAT, 0644);
if (logFd < 0)
throw torrent::input_error("Could not open execute log file.");
@@ -229,15 +229,15 @@ initialize_command_local() {
ADD_COMMAND_STRING_TRI("session", rak::make_mem_fun(dStore, &core::DownloadStore::set_path), rak::make_mem_fun(dStore, &core::DownloadStore::path));
ADD_COMMAND_VOID("session_save", rak::make_mem_fun(dList, &core::DownloadList::session_save));
ADD_COMMAND_LIST("execute", rak::bind2_mem_fn(&rpc::execFile, &rpc::ExecFile::execute_object, rpc::ExecFile::flag_throw | rpc::ExecFile::flag_expand_tilde));
ADD_COMMAND_LIST("execute_nothrow", rak::bind2_mem_fn(&rpc::execFile, &rpc::ExecFile::execute_object, rpc::ExecFile::flag_expand_tilde));
ADD_COMMAND_LIST("execute_raw", rak::bind2_mem_fn(&rpc::execFile, &rpc::ExecFile::execute_object, rpc::ExecFile::flag_throw));
ADD_COMMAND_LIST("execute_raw_nothrow", rak::bind2_mem_fn(&rpc::execFile, &rpc::ExecFile::execute_object, 0));
ADD_COMMAND_LIST("execute_capture", rak::bind2_mem_fn(&rpc::execFile, &rpc::ExecFile::execute_object, rpc::ExecFile::flag_throw | rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_capture));
ADD_COMMAND_LIST("execute_capture_nothrow", rak::bind2_mem_fn(&rpc::execFile, &rpc::ExecFile::execute_object, rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_capture));
CMD2_ANY("execute", std::tr1::bind(&rpc::ExecFile::execute_object, &rpc::execFile, std::tr1::placeholders::_2, rpc::ExecFile::flag_throw | rpc::ExecFile::flag_expand_tilde));
CMD2_ANY("execute_nothrow", std::tr1::bind(&rpc::ExecFile::execute_object, &rpc::execFile, std::tr1::placeholders::_2, rpc::ExecFile::flag_expand_tilde));
CMD2_ANY("execute_raw", std::tr1::bind(&rpc::ExecFile::execute_object, &rpc::execFile, std::tr1::placeholders::_2, rpc::ExecFile::flag_throw));
CMD2_ANY("execute_raw_nothrow", std::tr1::bind(&rpc::ExecFile::execute_object, &rpc::execFile, std::tr1::placeholders::_2, 0));
CMD2_ANY("execute_capture", std::tr1::bind(&rpc::ExecFile::execute_object, &rpc::execFile, std::tr1::placeholders::_2, rpc::ExecFile::flag_throw | rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_capture));
CMD2_ANY("execute_capture_nothrow", std::tr1::bind(&rpc::ExecFile::execute_object, &rpc::execFile, std::tr1::placeholders::_2, rpc::ExecFile::flag_expand_tilde | rpc::ExecFile::flag_capture));
ADD_COMMAND_STRING("log.execute", rak::bind_ptr_fn(&apply_log, 0));
ADD_COMMAND_STRING("log.xmlrpc", rak::bind_ptr_fn(&apply_log, 1));
CMD2_ANY_STRING("log.execute", std::tr1::bind(&apply_log, std::tr1::placeholders::_2, 0));
CMD2_ANY_STRING("log.xmlrpc", std::tr1::bind(&apply_log, std::tr1::placeholders::_2, 1));
*rpc::Command::argument(0) = "placeholder.0";
*rpc::Command::argument(1) = "placeholder.1";
+14 -21
View File
@@ -63,8 +63,7 @@
#include "command_helpers.h"
torrent::Object
apply_throttle(bool up, const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_throttle(const torrent::Object::list_type& args, bool up) {
torrent::Object::list_const_iterator argItr = args.begin();
const std::string& name = argItr->as_string();
@@ -100,8 +99,7 @@ static const int throttle_info_max = (1 << 2);
static const int throttle_info_rate = (1 << 3);
torrent::Object
retrieve_throttle_info(int flags, const torrent::Object& rawArgs) {
const std::string& name = rawArgs.as_string();
retrieve_throttle_info(const torrent::Object::string_type& name, int flags) {
core::ThrottleMap::iterator itr = control->core()->throttles().find(name);
torrent::ThrottlePair throttles = itr == control->core()->throttles().end() ? torrent::ThrottlePair(NULL, NULL) : itr->second;
torrent::Throttle* throttle = flags & throttle_info_down ? throttles.second : throttles.first;
@@ -162,8 +160,7 @@ parse_address_range(const torrent::Object::list_type& args, torrent::Object::lis
}
torrent::Object
apply_address_throttle(const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_address_throttle(const torrent::Object::list_type& args) {
if (args.size() < 2 || args.size() > 3)
throw torrent::input_error("Incorrect number of arguments.");
@@ -177,9 +174,7 @@ apply_address_throttle(const torrent::Object& rawArgs) {
}
torrent::Object
apply_encryption(const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_encryption(const torrent::Object::list_type& args) {
uint32_t options_mask = torrent::ConnectionManager::encryption_none;
for (torrent::Object::list_const_iterator itr = args.begin(), last = args.end(); itr != last; itr++) {
@@ -209,12 +204,10 @@ apply_encryption(const torrent::Object& rawArgs) {
}
torrent::Object
apply_tos(const torrent::Object& rawArg) {
apply_tos(const torrent::Object::string_type& arg) {
rpc::Command::value_type value;
torrent::ConnectionManager* cm = torrent::connection_manager();
const std::string& arg = rawArg.as_string();
if (arg == "default")
value = torrent::ConnectionManager::iptos_default;
else if (arg == "lowdelay")
@@ -443,18 +436,18 @@ initialize_command_network() {
ADD_VARIABLE_VALUE("tracker_numwant", -1);
ADD_COMMAND_LIST("throttle_up", rak::bind_ptr_fn(&apply_throttle, true));
ADD_COMMAND_LIST("throttle_down", rak::bind_ptr_fn(&apply_throttle, false));
ADD_COMMAND_LIST("throttle_ip", rak::ptr_fn(&apply_address_throttle));
CMD2_ANY_LIST("throttle_up", std::tr1::bind(&apply_throttle, std::tr1::placeholders::_2, true));
CMD2_ANY_LIST("throttle_down", std::tr1::bind(&apply_throttle, std::tr1::placeholders::_2, false));
CMD2_ANY_LIST("throttle_ip", std::tr1::bind(&apply_address_throttle, std::tr1::placeholders::_2));
ADD_COMMAND_STRING("get_throttle_up_max", rak::bind_ptr_fn(&retrieve_throttle_info, throttle_info_up | throttle_info_max));
ADD_COMMAND_STRING("get_throttle_up_rate", rak::bind_ptr_fn(&retrieve_throttle_info, throttle_info_up | throttle_info_rate));
ADD_COMMAND_STRING("get_throttle_down_max", rak::bind_ptr_fn(&retrieve_throttle_info, throttle_info_down | throttle_info_max));
ADD_COMMAND_STRING("get_throttle_down_rate", rak::bind_ptr_fn(&retrieve_throttle_info, throttle_info_down | throttle_info_rate));
CMD2_ANY_STRING("get_throttle_up_max", std::tr1::bind(&retrieve_throttle_info, std::tr1::placeholders::_2, throttle_info_up | throttle_info_max));
CMD2_ANY_STRING("get_throttle_up_rate", std::tr1::bind(&retrieve_throttle_info, std::tr1::placeholders::_2, throttle_info_up | throttle_info_rate));
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));
ADD_COMMAND_LIST("encryption", rak::ptr_fn(&apply_encryption));
CMD2_ANY_STRING("tos", std::tr1::bind(&apply_tos, std::tr1::placeholders::_2));
ADD_COMMAND_STRING("tos", rak::ptr_fn(&apply_tos));
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));
+46 -56
View File
@@ -58,9 +58,7 @@
typedef void (core::ViewManager::*view_cfilter_slot)(const std::string&, const std::string&);
torrent::Object
apply_view_filter_on(const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_view_filter_on(const torrent::Object::list_type& args) {
if (args.size() < 1)
throw torrent::input_error("Too few arguments.");
@@ -80,9 +78,7 @@ apply_view_filter_on(const torrent::Object& rawArgs) {
}
torrent::Object
apply_view_cfilter(view_cfilter_slot viewFilterSlot, const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_view_cfilter(view_cfilter_slot viewFilterSlot, const torrent::Object::list_type& args) {
if (args.size() != 2)
throw torrent::input_error("Too few arguments.");
@@ -97,9 +93,7 @@ apply_view_cfilter(view_cfilter_slot viewFilterSlot, const torrent::Object& rawA
}
torrent::Object
apply_view_sort(const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_view_sort(const torrent::Object::list_type& args) {
if (args.size() <= 0 || args.size() > 2)
throw torrent::input_error("Wrong argument count.");
@@ -119,7 +113,7 @@ apply_view_sort(const torrent::Object& rawArgs) {
}
torrent::Object
apply_view_list(const torrent::Object&) {
apply_view_list() {
torrent::Object rawResult = torrent::Object::create_list();
torrent::Object::list_type& result = rawResult.as_list();
@@ -130,9 +124,7 @@ apply_view_list(const torrent::Object&) {
}
torrent::Object
apply_view_set(const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_view_set(const torrent::Object::list_type& args) {
if (args.size() != 2)
throw torrent::input_error("Wrong argument count.");
@@ -212,9 +204,7 @@ apply_or(rpc::target_type target, const torrent::Object& rawArgs) {
}
torrent::Object
apply_cmp(rpc::target_type target, const torrent::Object& rawArgs) {
const torrent::Object::list_type& args = rawArgs.as_list();
apply_cmp(rpc::target_type target, const torrent::Object::list_type& args) {
// We only need to check if empty() since if size() == 1 it calls
// the same command for both, or if size() == 2 then each side of
// the comparison has different commands.
@@ -245,23 +235,23 @@ apply_cmp(rpc::target_type target, const torrent::Object& rawArgs) {
}
}
torrent::Object apply_less(rpc::target_type target, const torrent::Object& rawArgs) {
torrent::Object result = apply_cmp(target, rawArgs);
torrent::Object apply_less(rpc::target_type target, const torrent::Object::list_type& args) {
torrent::Object result = apply_cmp(target, args);
return result.is_value() ? result.as_value() < 0 : (int64_t)false;
}
torrent::Object apply_greater(rpc::target_type target, const torrent::Object& rawArgs) {
torrent::Object result = apply_cmp(target, rawArgs);
torrent::Object apply_greater(rpc::target_type target, const torrent::Object::list_type& args) {
torrent::Object result = apply_cmp(target, args);
return result.is_value() ? result.as_value() > 0 : (int64_t)false;
}
torrent::Object apply_equal(rpc::target_type target, const torrent::Object& rawArgs) {
torrent::Object result = apply_cmp(target, rawArgs);
torrent::Object apply_equal(rpc::target_type target, const torrent::Object::list_type& args) {
torrent::Object result = apply_cmp(target, args);
return result.is_value() ? result.as_value() == 0 : (int64_t)false;
}
torrent::Object
apply_to_time(int flags, const torrent::Object& rawArgs) {
apply_to_time(const torrent::Object& rawArgs, int flags) {
std::tm *u;
time_t t = (uint64_t)rawArgs.as_value();
@@ -349,7 +339,7 @@ apply_to_throttle(const torrent::Object& rawArgs) {
// if (cond1) { branch1 } else if (cond2) { branch2 } else { branch3 }
// <cond1>,<branch1>,<cond2>,<branch2>,<branch3>
torrent::Object
apply_if(int flags, rpc::target_type target, const torrent::Object& rawArgs) {
apply_if(rpc::target_type target, const torrent::Object& rawArgs, int flags) {
const torrent::Object::list_type& args = rawArgs.as_list();
torrent::Object::list_const_iterator itr = args.begin();
@@ -472,19 +462,20 @@ void
initialize_command_ui() {
ADD_VARIABLE_STRING("key_layout", "qwerty");
ADD_COMMAND_STRING("view_add", rpc::object_string_fn(rak::make_mem_fun(control->view_manager(), &core::ViewManager::insert_throw)));
ADD_COMMAND_NONE_L("view_list", rak::ptr_fn(&apply_view_list));
ADD_COMMAND_NONE_L("view_set", rak::ptr_fn(&apply_view_set));
CMD2_ANY_STRING("view_add", object_convert_void(std::tr1::bind(&core::ViewManager::insert_throw, control->view_manager(), std::tr1::placeholders::_2)));
ADD_COMMAND_LIST("view_filter", rak::bind_ptr_fn(&apply_view_cfilter, &core::ViewManager::set_filter));
ADD_COMMAND_LIST("view_filter_on", rak::ptr_fn(&apply_view_filter_on));
CMD2_ANY_L("view_list", std::tr1::bind(&apply_view_list));
CMD2_ANY_LIST("view_set", std::tr1::bind(&apply_view_set, std::tr1::placeholders::_2));
ADD_COMMAND_LIST("view_sort", rak::ptr_fn(&apply_view_sort));
ADD_COMMAND_LIST("view_sort_new", rak::bind_ptr_fn(&apply_view_cfilter, &core::ViewManager::set_sort_new));
ADD_COMMAND_LIST("view_sort_current", rak::bind_ptr_fn(&apply_view_cfilter, &core::ViewManager::set_sort_current));
CMD2_ANY_LIST("view_filter", std::tr1::bind(&apply_view_cfilter, &core::ViewManager::set_filter, std::tr1::placeholders::_2));
CMD2_ANY_LIST("view_filter_on", std::tr1::bind(&apply_view_filter_on, std::tr1::placeholders::_2));
ADD_COMMAND_LIST("view.event_added", rak::bind_ptr_fn(&apply_view_cfilter, &core::ViewManager::set_event_added));
ADD_COMMAND_LIST("view.event_removed", rak::bind_ptr_fn(&apply_view_cfilter, &core::ViewManager::set_event_removed));
CMD2_ANY_LIST("view_sort", std::tr1::bind(&apply_view_sort, std::tr1::placeholders::_2));
CMD2_ANY_LIST("view_sort_new", std::tr1::bind(&apply_view_cfilter, &core::ViewManager::set_sort_new, std::tr1::placeholders::_2));
CMD2_ANY_LIST("view_sort_current", std::tr1::bind(&apply_view_cfilter, &core::ViewManager::set_sort_current, std::tr1::placeholders::_2));
CMD2_ANY_LIST("view.event_added", std::tr1::bind(&apply_view_cfilter, &core::ViewManager::set_event_added, std::tr1::placeholders::_2));
CMD2_ANY_LIST("view.event_removed", std::tr1::bind(&apply_view_cfilter, &core::ViewManager::set_event_removed, std::tr1::placeholders::_2));
// Cleanup and add . to view.
@@ -503,30 +494,29 @@ initialize_command_ui() {
CMD_N_STRING("ui.current_view.set", rak::ptr_fn(&cmd_ui_set_view));
// Move.
ADD_ANY_NONE("print", rak::ptr_fn(&apply_print));
ADD_ANY_NONE("cat", rak::ptr_fn(&apply_cat));
ADD_ANY_NONE("if", rak::bind_ptr_fn(&apply_if, 0));
ADD_ANY_NONE("not", rak::ptr_fn(&apply_not));
ADD_ANY_NONE("false", rak::ptr_fn(&apply_false));
ADD_ANY_NONE("and", rak::ptr_fn(&apply_and));
ADD_ANY_NONE("or", rak::ptr_fn(&apply_or));
ADD_ANY_LIST("less", rak::ptr_fn(&apply_less));
ADD_ANY_LIST("greater", rak::ptr_fn(&apply_greater));
ADD_ANY_LIST("equal", rak::ptr_fn(&apply_equal));
CMD2_ANY("print", &apply_print);
CMD2_ANY("cat", &apply_cat);
CMD2_ANY("if", std::tr1::bind(&apply_if, std::tr1::placeholders::_1, std::tr1::placeholders::_2, 0));
CMD2_ANY("not", &apply_not);
CMD2_ANY("false", &apply_false);
CMD2_ANY("and", &apply_and);
CMD2_ANY("or", &apply_or);
// A temporary command for handling stuff until we get proper
// support for seperation of commands and literals.
ADD_ANY_NONE("branch", rak::bind_ptr_fn(&apply_if, 1));
CMD2_ANY("branch", std::tr1::bind(&apply_if, std::tr1::placeholders::_1, std::tr1::placeholders::_2, 1));
ADD_COMMAND_VALUE("to_gm_time", rak::bind_ptr_fn(&apply_to_time, 0));
ADD_COMMAND_VALUE("to_gm_date", rak::bind_ptr_fn(&apply_to_time, 0x2));
ADD_COMMAND_VALUE("to_time", rak::bind_ptr_fn(&apply_to_time, 0x1));
ADD_COMMAND_VALUE("to_date", rak::bind_ptr_fn(&apply_to_time, 0x1 | 0x2));
ADD_COMMAND_VALUE("to_elapsed_time", rak::ptr_fn(&apply_to_elapsed_time));
ADD_COMMAND_VALUE("to_kb", rak::ptr_fn(&apply_to_kb));
ADD_COMMAND_VALUE("to_mb", rak::ptr_fn(&apply_to_mb));
ADD_COMMAND_VALUE("to_xb", rak::ptr_fn(&apply_to_xb));
ADD_COMMAND_VALUE("to_throttle", rak::ptr_fn(&apply_to_throttle));
CMD2_ANY_LIST("less", &apply_less);
CMD2_ANY_LIST("greater", &apply_greater);
CMD2_ANY_LIST("equal", &apply_equal);
CMD2_ANY_VALUE("to_gm_time", std::tr1::bind(&apply_to_time, std::tr1::placeholders::_2, 0));
CMD2_ANY_VALUE("to_gm_date", std::tr1::bind(&apply_to_time, std::tr1::placeholders::_2, 0x2));
CMD2_ANY_VALUE("to_time", std::tr1::bind(&apply_to_time, std::tr1::placeholders::_2, 0x1));
CMD2_ANY_VALUE("to_date", std::tr1::bind(&apply_to_time, std::tr1::placeholders::_2, 0x1 | 0x2));
CMD2_ANY_VALUE("to_elapsed_time", std::tr1::bind(&apply_to_elapsed_time, std::tr1::placeholders::_2));
CMD2_ANY_VALUE("to_kb", std::tr1::bind(&apply_to_kb, std::tr1::placeholders::_2));
CMD2_ANY_VALUE("to_mb", std::tr1::bind(&apply_to_mb, std::tr1::placeholders::_2));
CMD2_ANY_VALUE("to_xb", std::tr1::bind(&apply_to_xb, std::tr1::placeholders::_2));
CMD2_ANY_VALUE("to_throttle", std::tr1::bind(&apply_to_throttle, std::tr1::placeholders::_2));
}
+97
View File
@@ -0,0 +1,97 @@
// rTorrent - BitTorrent client
// Copyright (C) 2005-2007, Jari Sundell
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations
// including the two.
//
// You must obey the GNU General Public License in all respects for
// all of the code used other than OpenSSL. If you modify file(s)
// with this exception, you may extend this exception to your version
// of the file(s), but you are not obligated to do so. If you do not
// wish to do so, delete this exception statement from your version.
// If you delete this exception statement from all source files in the
// program, then also delete it here.
//
// Contact: Jari Sundell <jaris@ifi.uio.no>
//
// Skomakerveien 33
// 3185 Skoppum, NORWAY
#include "config.h"
#include "core/download.h"
#include "parse.h"
#include "command_new_slot.h"
namespace rpc {
const torrent::Object
command_base_call_any(Command* rawCommand, target_type target, const torrent::Object& args) {
return static_cast<command_base*>(rawCommand)->_pod<any_function>()(target, args);
}
const torrent::Object
command_base_call_any_value_base(Command* rawCommand, target_type target, const torrent::Object& rawArgs, int base, int unit) {
const torrent::Object& arg = convert_to_single_argument(rawArgs);
if (arg.type() == torrent::Object::TYPE_STRING) {
torrent::Object::value_type val;
if (!parse_whole_value_nothrow(arg.as_string().c_str(), &val, base, unit))
throw torrent::input_error("Not a value.");
return static_cast<command_base*>(rawCommand)->_pod<any_value_function>()(target, val);
}
return static_cast<command_base*>(rawCommand)->_pod<any_value_function>()(target, arg.as_value());
}
const torrent::Object
command_base_call_any_value(Command* rawCommand, target_type target, const torrent::Object& rawArgs) {
return command_base_call_any_value_base(rawCommand, target, rawArgs, 0, 1);
}
const torrent::Object
command_base_call_any_string(Command* rawCommand, target_type target, const torrent::Object& rawArgs) {
const torrent::Object& arg = convert_to_single_argument(rawArgs);
if (arg.type() == torrent::Object::TYPE_RAW_STRING)
return static_cast<command_base*>(rawCommand)->_pod<any_string_function>()(target, arg.as_raw_string().as_string());
return static_cast<command_base*>(rawCommand)->_pod<any_string_function>()(target, arg.as_string());
}
const torrent::Object
command_base_call_any_list(Command* rawCommand, target_type target, const torrent::Object& rawArgs) {
if (rawArgs.type() != torrent::Object::TYPE_LIST) {
torrent::Object::list_type arg;
if (!rawArgs.is_empty())
arg.push_back(rawArgs);
return static_cast<command_base*>(rawCommand)->_pod<any_list_function>()(target, arg);
}
return static_cast<command_base*>(rawCommand)->_pod<any_list_function>()(target, rawArgs.as_list());
}
}
+120
View File
@@ -0,0 +1,120 @@
// rTorrent - BitTorrent client
// Copyright (C) 2005-2007, Jari Sundell
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// In addition, as a special exception, the copyright holders give
// permission to link the code of portions of this program with the
// OpenSSL library under certain conditions as described in each
// individual source file, and distribute linked combinations
// including the two.
//
// You must obey the GNU General Public License in all respects for
// all of the code used other than OpenSSL. If you modify file(s)
// with this exception, you may extend this exception to your version
// of the file(s), but you are not obligated to do so. If you do not
// wish to do so, delete this exception statement from your version.
// If you delete this exception statement from all source files in the
// program, then also delete it here.
//
// Contact: Jari Sundell <jaris@ifi.uio.no>
//
// Skomakerveien 33
// 3185 Skoppum, NORWAY
// The command_new_slot object aims at replacing the current crop of
// Command* objects with a new type that is safe to cast from the base
// command type and thus allows for static initialization and fixed
// sized objects.
//
// All commands changed to this new class shall be safe to call with
// the raw object types.
#ifndef RTORRENT_RPC_COMMAND_NEW_SLOT_H
#define RTORRENT_RPC_COMMAND_NEW_SLOT_H
#include <functional>
#include <limits>
#include <inttypes.h>
#include <torrent/object.h>
#include <tr1/functional>
#include "command.h"
namespace rpc {
typedef const torrent::Object (*command_base_call_type)(Command*, target_type, const torrent::Object&);
typedef std::tr1::function<torrent::Object (target_type, const torrent::Object&)> base_function;
template <typename tmpl> struct command_base_is_valid {};
template <typename tmpl_type, command_base_call_type tmpl_func> struct command_base_is_type {};
class command_base : public Command {
public:
command_base() { new (&_pod<base_function>()) base_function(); }
~command_base() { _pod<base_function>().~base_function(); }
template <typename T>
void set_function(T s, int value = command_base_is_valid<T>::value) { _pod<T>() = s; }
// The std::function object in GCC is castable between types with a
// pointer to a struct of ctor/dtor/calls for non-POD slots. As such
// it should be safe to cast between different std::function
// template types, yet what the C++0x standard will say about this I
// have no idea atm.
template <typename tmpl> tmpl& _pod() { return reinterpret_cast<tmpl&>(t_pod); }
protected:
union {
char t_pod[sizeof(base_function)];
};
};
#define COMMAND_BASE_TYPE(func_type, func_parm) \
typedef std::tr1::function<func_parm> func_type; \
template <> struct command_base_is_valid<func_type> { static const int value = 1; };
#define COMMAND_BASE_CALL(func_name, func_type) \
const torrent::Object func_name(Command* rawCommand, target_type target, const torrent::Object& args); \
template <> struct command_base_is_type<func_type, func_name> { static const int value = 1; };
// template <> struct command_base_is_valid<base_function> { static const int value = 1; };
// const torrent::Object command_base_call_any(Command* rawCommand, target_type target, const torrent::Object& args);
// template <> struct command_base_is_type<any_function, command_base_call_any> { static const int value = 1; };
//
// Declare valid parameters and functions:
//
// typedef std::tr1::function<torrent::Object (target_type, const torrent::Object&)> any_function;
// typedef std::tr1::function<torrent::Object (target_type, const std::string&)> any_string_function;
COMMAND_BASE_TYPE(any_function, torrent::Object (target_type, const torrent::Object&));
COMMAND_BASE_TYPE(any_value_function, torrent::Object (target_type, const torrent::Object::value_type&));
COMMAND_BASE_TYPE(any_string_function, torrent::Object (target_type, const std::string&));
COMMAND_BASE_TYPE(any_list_function, torrent::Object (target_type, const torrent::Object::list_type&));
COMMAND_BASE_CALL(command_base_call_any, any_function);
COMMAND_BASE_CALL(command_base_call_any_value, any_value_function);
COMMAND_BASE_CALL(command_base_call_any_string, any_string_function);
COMMAND_BASE_CALL(command_base_call_any_list, any_list_function);
}
#endif
+10 -3
View File
@@ -7,6 +7,13 @@
CPPUNIT_TEST_SUITE_REGISTRATION(CommandMapTest);
#undef CMD2_A_FUNCTION
#define CMD2_A_FUNCTION(key, function, func_type, slot, parm, doc) \
commandNewSlotItr->set_function<rpc::func_type>(slot); \
m_map.insert_type(key, commandNewSlotItr++, &rpc::function, \
rpc::CommandMap::flag_dont_delete | rpc::CommandMap::flag_public_xmlrpc, NULL, NULL);
torrent::Object cmd_test_map_a(rpc::target_type t, const torrent::Object& obj) { return obj; }
torrent::Object cmd_test_map_b(rpc::target_type t, const torrent::Object& obj, uint64_t c) { return torrent::Object(c); }
@@ -14,9 +21,9 @@ torrent::Object cmd_test_any_string(__UNUSED rpc::target_type target, const std:
void
CommandMapTest::test_basics() {
CMD2_A("test_a", &cmd_test_map_a);
CMD2_A("test_b", std::tr1::bind(&cmd_test_map_b, std::tr1::placeholders::_1, std::tr1::placeholders::_2, (uint64_t)2));
CMD2_A_STRING("any_string", &cmd_test_any_string);
CMD2_ANY("test_a", &cmd_test_map_a);
CMD2_ANY("test_b", std::tr1::bind(&cmd_test_map_b, std::tr1::placeholders::_1, std::tr1::placeholders::_2, (uint64_t)2));
CMD2_ANY_STRING("any_string", &cmd_test_any_string);
CPPUNIT_ASSERT(m_map.call_command("test_a", (int64_t)1).as_value() == 1);
CPPUNIT_ASSERT(m_map.call_command("test_b", (int64_t)1).as_value() == 2);
+25
View File
@@ -11,6 +11,14 @@ CPPUNIT_TEST_SUITE_REGISTRATION(CommandSlotTest);
torrent::Object cmd_test_a(rpc::target_type t, const torrent::Object& obj) { return obj; }
torrent::Object cmd_test_b(rpc::target_type t, const torrent::Object& obj, uint64_t c) { return torrent::Object(c); }
torrent::Object cmd_test_list(rpc::target_type t, const torrent::Object::list_type& obj) { return torrent::Object(obj.front()); }
void cmd_test_convert_void(rpc::target_type t, const torrent::Object& obj) {}
int32_t cmd_test_convert_int32_t(rpc::target_type t, const torrent::Object& obj) { return 9; }
int64_t cmd_test_convert_int64_t(rpc::target_type t, const torrent::Object& obj) { return 10; }
std::string cmd_test_convert_string(rpc::target_type t, const torrent::Object& obj) { return "test_1"; }
const std::string& cmd_test_convert_const_string(rpc::target_type t, const torrent::Object& obj) { static const std::string ret = "test_2"; return ret; }
void
CommandSlotTest::test_basics() {
rpc::command_base test_any;
@@ -19,6 +27,9 @@ CommandSlotTest::test_basics() {
test_any.set_function<rpc::any_function>(std::tr1::bind(&cmd_test_b, std::tr1::placeholders::_1, std::tr1::placeholders::_2, (uint64_t)2));
CPPUNIT_ASSERT(rpc::command_base_call_any(&test_any, rpc::make_target(), (int64_t)1).as_value() == 2);
test_any.set_function<rpc::any_list_function>(&cmd_test_list);
CPPUNIT_ASSERT(rpc::command_base_call_any_list(&test_any, rpc::make_target(), (int64_t)3).as_value() == 3);
}
void
@@ -26,3 +37,17 @@ CommandSlotTest::test_type_validity() {
CPPUNIT_ASSERT((rpc::command_base_is_type<rpc::any_function, &rpc::command_base_call_any>::value));
CPPUNIT_ASSERT((rpc::command_base_is_type<rpc::any_string_function, &rpc::command_base_call_any_string>::value));
}
void
CommandSlotTest::test_convert_return() {
rpc::command_base test_any;
test_any.set_function<rpc::any_function>(&cmd_test_convert_string);
CPPUNIT_ASSERT(rpc::command_base_call_any(&test_any, rpc::make_target(), (int64_t)1).as_string() == "test_1");
test_any.set_function<rpc::any_function>(&cmd_test_convert_const_string);
CPPUNIT_ASSERT(rpc::command_base_call_any(&test_any, rpc::make_target(), (int64_t)1).as_string() == "test_2");
// test_any.set_function<rpc::any_function>(object_convert_void(&cmd_test_convert_void));
// CPPUNIT_ASSERT(rpc::command_base_call_any(&test_any, rpc::make_target(), (int64_t)1).is_empty());
}
+2
View File
@@ -6,6 +6,7 @@ class CommandSlotTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(CommandSlotTest);
CPPUNIT_TEST(test_basics);
CPPUNIT_TEST(test_type_validity);
CPPUNIT_TEST(test_convert_return);
CPPUNIT_TEST_SUITE_END();
public:
@@ -14,4 +15,5 @@ public:
void test_basics();
void test_type_validity();
void test_convert_return();
};