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
This commit is contained in:
pippijn 2007-07-17 14:39:18 +00:00
parent c3c50e8943
commit 801fca4042
2 changed files with 47 additions and 33 deletions

View File

@ -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);
}

View File

@ -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)
add_method (char *name, Module const *mod, 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 ("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