summaryrefslogtreecommitdiff
path: root/modules/extra
diff options
context:
space:
mode:
authorSadie Powell <sadie@witchery.services>2025-02-18 17:01:33 +0000
committerSadie Powell <sadie@witchery.services>2025-02-18 17:01:33 +0000
commit3c55fbe6509c1706d21136392a4bfb2295a99a35 (patch)
tree79b4ea204d2d75bdc098cfbc6492c137a4770b96 /modules/extra
parent98320d130f6c74793d416526e892b11ca5619b91 (diff)
Rework how the RPC interface stores its events.
Diffstat (limited to 'modules/extra')
-rw-r--r--modules/extra/xmlrpc.cpp47
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;
}