From 3c55fbe6509c1706d21136392a4bfb2295a99a35 Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Tue, 18 Feb 2025 17:01:33 +0000 Subject: Rework how the RPC interface stores its events. --- modules/extra/xmlrpc.cpp | 47 ++++++++++++++++++++--------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) (limited to 'modules/extra') diff --git a/modules/extra/xmlrpc.cpp b/modules/extra/xmlrpc.cpp index 582a5ab25..ca6856fd2 100644 --- a/modules/extra/xmlrpc.cpp +++ b/modules/extra/xmlrpc.cpp @@ -20,7 +20,7 @@ class MyXMLRPCServiceInterface final , public HTTPPage { private: - std::deque events; + Anope::map events; void SendError(HTTPReply &reply, xmlrpc_env &env) { @@ -46,17 +46,14 @@ public: { } - void Register(RPCEvent *event) override + bool Register(RPCEvent *event) override { - this->events.push_back(event); + return this->events.emplace(event->GetEvent(), event).second; } - void Unregister(RPCEvent *event) override + bool Unregister(RPCEvent *event) override { - std::deque::iterator it = std::find(this->events.begin(), this->events.end(), event); - - if (it != this->events.end()) - this->events.erase(it); + return this->events.erase(event->GetEvent()) != 0; } bool OnRequest(HTTPProvider *provider, const Anope::string &page_name, HTTPClient *client, HTTPMessage &message, HTTPReply &reply) override @@ -79,6 +76,14 @@ public: request.name = method; delete method; + auto event = this->events.find(request.name); + if (event == this->events.end()) + { + xmlrpc_env_set_fault(&env, -32601, "Method not found"); + SendError(reply, env); + return true; + } + auto paramcount = xmlrpc_array_size(&env, params); for (auto idx = 0; idx < paramcount; ++idx) { @@ -113,28 +118,16 @@ public: } xmlrpc_DECREF(params); - for (auto *e : this->events) - { - if (!e->Run(this, client, request)) - return false; - - if (request.GetError()) - { - xmlrpc_env_set_fault(&env, request.GetError()->first, request.GetError()->second.c_str()); - SendError(reply, env); - return true; - } + event->second->Run(this, client, request); - if (!request.GetReplies().empty()) - { - this->Reply(request); - return true; - } + if (request.GetError()) + { + xmlrpc_env_set_fault(&env, request.GetError()->first, request.GetError()->second.c_str()); + SendError(reply, env); + return true; } - // If we reached this point nobody handled the event. - xmlrpc_env_set_fault(&env, -32601, "Method not found"); - SendError(reply, env); + this->Reply(request); return true; } -- cgit