summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpippijn <pippijn@e03df62e-2008-0410-955e-edbf42e46eb7>2007-07-17 14:39:18 +0000
committerpippijn <pippijn@e03df62e-2008-0410-955e-edbf42e46eb7>2007-07-17 14:39:18 +0000
commit801fca4042fa3365f647564e6a060436958aed31 (patch)
tree11cc69e000f285ef16ec1dde80c5f59860274cbe
parentc3c50e894376297209d11d7ce490fd782ba206a4 (diff)
Now, json-rpc _ONLY_ supports member function pointers. An example is given in
ModuleRpcJson::ModuleRpcJson. I must admit that it is kind of ugly but it is the only way I can see right now. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7464 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/modules/json.h15
-rw-r--r--src/modules/m_rpc_json.cpp65
2 files changed, 47 insertions, 33 deletions
diff --git a/src/modules/json.h b/src/modules/json.h
index 385b7c559..ca9ed8d3f 100644
--- a/src/modules/json.h
+++ b/src/modules/json.h
@@ -532,9 +532,18 @@ namespace json
{
namespace rpc
{
- typedef void (*method) (HTTPRequest *http, Value &request, Value &response);
- void init (void);
- void add_method (char *name, method mth);
+ typedef void (Module::*method) (HTTPRequest *http, Value &request, Value &response);
+
+ struct mfp
+ {
+ Module const *mod;
+ method mth;
+ };
+
+ typedef std::map<std::string, mfp> method_map;
+ extern method_map methods;
+
+ void add_method (char *name, Module const *mod, method mth);
void service (HTTPRequest *http, Value &request, Value &response);
void process (HTTPRequest *http, std::string &response, char const *request);
}
diff --git a/src/modules/m_rpc_json.cpp b/src/modules/m_rpc_json.cpp
index 5977eb36e..960a06b94 100644
--- a/src/modules/m_rpc_json.cpp
+++ b/src/modules/m_rpc_json.cpp
@@ -30,10 +30,32 @@
class ModuleRpcJson : public Module
{
+ void MthModuleVersion (HTTPRequest *http, json::Value &request, json::Value &response)
+ {
+ std::string result = "GetVersion().ToString()";
+ response["result"] = result;
+ }
+
+ void system_list_methods (HTTPRequest *http, json::Value &request, json::Value &response)
+ {
+ unsigned i = 0;
+ json::Value method_list (json::arrayValue);
+
+ json::rpc::method_map::iterator it;
+ for (it = json::rpc::methods.begin(); it != json::rpc::methods.end(); ++it)
+ {
+ method_list[i] = json::Value (it->first);
+ i++;
+ }
+
+ response["result"] = method_list;
+ }
+
public:
ModuleRpcJson(InspIRCd* Me) : Module(Me)
{
- json::rpc::init ();
+ json::rpc::add_method ("system.listMethods", (Module *)this, (void (Module::*)(HTTPRequest*, json::Value&, json::Value&))&ModuleRpcJson::system_list_methods);
+ json::rpc::add_method ("ircd.moduleVersion", (Module *)this, (void (Module::*)(HTTPRequest*, json::Value&, json::Value&))&ModuleRpcJson::MthModuleVersion);
}
void OnEvent(Event* event)
@@ -2048,36 +2070,13 @@ namespace json
{
namespace rpc
{
- typedef std::map<std::string, void (*) (HTTPRequest *, Value &, Value &)> method_map;
-
method_map methods;
void
- add_method (char *name, method mth)
- {
- methods[name] = mth;
- }
-
- void
- system_list_methods (HTTPRequest *http, Value &request, Value &response)
- {
- unsigned i = 0;
- Value method_list (arrayValue);
-
- method_map::iterator it;
- for (it = methods.begin(); it != methods.end(); ++it)
- {
- method_list[i] = Value (it->first);
- i++;
- }
-
- response["result"] = method_list;
- }
-
- void
- init ()
+ add_method (char *name, Module const *mod, method mth)
{
- add_method ("system.listMethods", &system_list_methods);
+ mfp m = { mod, mth };
+ methods[name] = m;
}
void
@@ -2085,9 +2084,15 @@ namespace json
{
char const *methodName = static_cast<char const *> (request["method"]);
- method_map::iterator mth = methods.find (methodName);
- if (mth != methods.end ())
- (*mth->second) (http, request, response);
+ method_map::iterator mthit = methods.find (methodName);
+ if (mthit != methods.end ())
+ {
+ mfp m = mthit->second;
+ Module *mod = new Module (*m.mod);
+ method mth = m.mth;
+ (mod->*mth) (http, request, response);
+ delete mod;
+ }
}
void