diff options
| author | Sadie Powell <sadie@witchery.services> | 2025-02-18 17:01:33 +0000 |
|---|---|---|
| committer | Sadie Powell <sadie@witchery.services> | 2025-02-18 17:01:33 +0000 |
| commit | 3c55fbe6509c1706d21136392a4bfb2295a99a35 (patch) | |
| tree | 79b4ea204d2d75bdc098cfbc6492c137a4770b96 /modules/extra | |
| parent | 98320d130f6c74793d416526e892b11ca5619b91 (diff) | |
Rework how the RPC interface stores its events.
Diffstat (limited to 'modules/extra')
| -rw-r--r-- | modules/extra/xmlrpc.cpp | 47 |
1 files changed, 20 insertions, 27 deletions
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<RPCEvent *> events; + Anope::map<RPCEvent *> 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<RPCEvent *>::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; } |
