From bc7d4853912fb94c4bef75d6a3152504b5e33a50 Mon Sep 17 00:00:00 2001 From: rakshasa Date: Fri, 18 May 2007 22:01:29 +0000 Subject: [PATCH] * Fixed xmlrpc so it registers all the commands. git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@904 e378c898-3ddf-0310-93e7-cc216c733640 --- src/command_helpers.cc | 6 +++--- src/command_helpers.h | 4 ++-- src/command_network.cc | 12 +++++++++++- src/rpc/xmlrpc.cc | 10 +++++++++- src/utils/variable_map.h | 4 ++-- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/command_helpers.cc b/src/command_helpers.cc index 584159cf..ac134066 100644 --- a/src/command_helpers.cc +++ b/src/command_helpers.cc @@ -84,9 +84,9 @@ add_variable(const char* getKey, const char* setKey, const char* defaultSetKey, utils::CommandVariable* variable = commandVariablesItr++; variable->set_variable(defaultObject); - control->variable()->insert(getKey, variable, getSlot, NULL, utils::VariableMap::flag_dont_delete | utils::VariableMap::flag_public_xmlrpc); - control->variable()->insert(setKey, variable, setSlot, NULL, utils::VariableMap::flag_dont_delete | utils::VariableMap::flag_public_xmlrpc); + control->variable()->insert(getKey, variable, getSlot, NULL, utils::VariableMap::flag_dont_delete | utils::VariableMap::flag_public_xmlrpc, "i:", ""); + control->variable()->insert(setKey, variable, setSlot, NULL, utils::VariableMap::flag_dont_delete | utils::VariableMap::flag_public_xmlrpc, "i:", ""); if (defaultSetKey) - control->variable()->insert(defaultSetKey, variable, setSlot, NULL, utils::VariableMap::flag_dont_delete); + control->variable()->insert(defaultSetKey, variable, setSlot, NULL, utils::VariableMap::flag_dont_delete, "i:", ""); } diff --git a/src/command_helpers.h b/src/command_helpers.h index 2e4c52a7..3fd17e95 100644 --- a/src/command_helpers.h +++ b/src/command_helpers.h @@ -82,13 +82,13 @@ add_variable("get_" key, "set_" key, key, &utils::CommandVariable::get_string, & #define ADD_COMMAND_SLOT_PRIVATE(key, function, slot) \ commandSlotsItr->set_slot(slot); \ - variables->insert(key, commandSlotsItr++, &utils::CommandSlot::function, NULL, utils::VariableMap::flag_dont_delete); + variables->insert(key, commandSlotsItr++, &utils::CommandSlot::function, NULL, utils::VariableMap::flag_dont_delete, NULL, NULL); #define ADD_COMMAND_COPY(key, function, parm, doc) \ variables->insert(key, (commandSlotsItr - 1), &utils::CommandSlot::function, NULL, utils::VariableMap::flag_dont_delete | utils::VariableMap::flag_public_xmlrpc, parm, doc); #define ADD_COMMAND_COPY_PRIVATE(key, function) \ - variables->insert(key, (commandSlotsItr - 1), &utils::CommandSlot::function, NULL, utils::VariableMap::flag_dont_delete); + variables->insert(key, (commandSlotsItr - 1), &utils::CommandSlot::function, NULL, utils::VariableMap::flag_dont_delete, NULL, NULL); #define ADD_COMMAND_VALUE_TRI(key, set, get) \ ADD_COMMAND_SLOT_PRIVATE(key, call_value, utils::object_value_fn(set)) \ diff --git a/src/command_network.cc b/src/command_network.cc index f40eb472..a2ea43d4 100644 --- a/src/command_network.cc +++ b/src/command_network.cc @@ -150,9 +150,19 @@ apply_fast_cgi(const std::string& arg) { control->set_xmlrpc(new rpc::XmlRpc); control->xmlrpc()->set_slot_call_command(rak::mem_fn(control->variable(), &utils::VariableMap::call_command)); + unsigned int count = 0; + for (utils::VariableMap::const_iterator itr = control->variable()->begin(), last = control->variable()->end(); itr != last; itr++) - if (itr->second.m_flags & utils::VariableMap::flag_public_xmlrpc) + if (itr->second.m_flags & utils::VariableMap::flag_public_xmlrpc) { control->xmlrpc()->insert_command(itr->first, itr->second.m_parm, itr->second.m_doc); + + count++; + } + + char buffer[128]; + sprintf(buffer, "FastCGI initialized with %u functions.", count); + + control->core()->push_log(buffer); } control->set_fast_cgi(new rpc::FastCgi(arg)); diff --git a/src/rpc/xmlrpc.cc b/src/rpc/xmlrpc.cc index c25f582a..67622485 100644 --- a/src/rpc/xmlrpc.cc +++ b/src/rpc/xmlrpc.cc @@ -179,7 +179,15 @@ XmlRpc::process(const char* inBuffer, uint32_t length, slot_write slotWrite) { void XmlRpc::insert_command(const char* name, const char* parm, const char* doc) { - xmlrpc_registry_add_method_w_doc(m_env, m_registry, NULL, name, &XmlRpc::call_command, const_cast(name), parm, doc); + xmlrpc_env localEnv; + xmlrpc_env_init(&localEnv); + + xmlrpc_registry_add_method_w_doc(&localEnv, m_registry, NULL, name, &XmlRpc::call_command, const_cast(name), parm, doc); + + if (localEnv.fault_occurred) + throw torrent::internal_error("Fault occured while inserting xmlrpc call."); + + xmlrpc_env_clean(&localEnv); } #else diff --git a/src/utils/variable_map.h b/src/utils/variable_map.h index 03df7b19..f87645e1 100644 --- a/src/utils/variable_map.h +++ b/src/utils/variable_map.h @@ -113,8 +113,8 @@ public: // Allow NULL slot as a temporary compatibility hack. - void insert(key_type key, Variable* variable, generic_slot genericSlot = NULL, download_slot downloadSlot = NULL, int flags = 0, - const char* parm = "", const char* doc = ""); + void insert(key_type key, Variable* variable, generic_slot genericSlot, download_slot downloadSlot, int flags, + const char* parm, const char* doc); void insert(key_type key, const variable_map_data_type src);