From b020aa0197181a2fea19dca3f3fd2061cf8cf5b8 Mon Sep 17 00:00:00 2001 From: rakshasa Date: Mon, 21 May 2012 16:08:18 +0900 Subject: [PATCH 1/2] Pass command target when using rpc::call_object with dict_key. --- src/rpc/parse_commands.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpc/parse_commands.cc b/src/rpc/parse_commands.cc index 59f9abe2..6e66405a 100644 --- a/src/rpc/parse_commands.cc +++ b/src/rpc/parse_commands.cc @@ -271,7 +271,7 @@ call_object(const torrent::Object& command, target_type target) { tmp_command.unset_flags(torrent::Object::mask_function); tmp_command.set_flags((flags >> 1) & torrent::Object::mask_function); - parse_command_execute(make_target(), &tmp_command); + parse_command_execute(target, &tmp_command); return commands.call_command(tmp_command.as_dict_key().c_str(), tmp_command.as_dict_obj(), target); } default: From 48733c84ec892914c89e961e40c4f56f2cabe918 Mon Sep 17 00:00:00 2001 From: rakshasa Date: Mon, 21 May 2012 16:08:49 +0900 Subject: [PATCH 2/2] Added 'catch' command to allow safely calling commands that might fail with input_error. Note that double-brackets are required as the method needs to be called by the 'catch' command, not the parser. catch = ((foo.bar,"bad input")) --- src/command_dynamic.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/command_dynamic.cc b/src/command_dynamic.cc index 852651b1..7ec16fb4 100644 --- a/src/command_dynamic.cc +++ b/src/command_dynamic.cc @@ -37,6 +37,7 @@ #include "config.h" #include +#include #include "globals.h" #include "control.h" @@ -422,6 +423,16 @@ system_method_list_keys(const torrent::Object::string_type& args) { return rawResult; } +torrent::Object +cmd_catch(rpc::target_type target, const torrent::Object& args) { + try { + return rpc::call_object(args, target); + } catch (torrent::input_error& e) { + lt_log_print(torrent::LOG_WARN, "Caught exception: '%s'.", e.what()); + return torrent::Object(); + } +} + #define CMD2_METHOD_INSERT(key, flags) \ CMD2_ANY_LIST(key, tr1::bind(&system_method_insert_object, tr1::placeholders::_2, flags)); @@ -455,4 +466,6 @@ initialize_command_dynamic() { CMD2_ANY_STRING ("method.rlookup", tr1::bind(&rpc::object_storage::rlookup_obj_list, control->object_storage(), tr1::placeholders::_2)); CMD2_ANY_STRING_V("method.rlookup.clear", tr1::bind(&rpc::object_storage::rlookup_clear, control->object_storage(), tr1::placeholders::_2)); + + CMD2_ANY ("catch", tr1::bind(&cmd_catch, tr1::placeholders::_1, tr1::placeholders::_2)); }