summaryrefslogtreecommitdiff
path: root/src/modules/m_spanningtree
diff options
context:
space:
mode:
authorAttila Molnar <attilamolnar@hush.com>2014-01-26 13:05:09 +0100
committerAttila Molnar <attilamolnar@hush.com>2014-01-26 13:05:09 +0100
commit92cc388aebd55245b24aef5950afe845feffe9e2 (patch)
treea0d38cacd6589b88a274ced74e7e054a8cf73c78 /src/modules/m_spanningtree
parent1db0e984be491125d8f954aa22f17cad1d4c453f (diff)
ProtocolInterface::SendEncapsulatedData() changes
- Pass command name and destination as real parameters - Allow callers to specify the command source - Send a SID instead of a server name if the target is a single server
Diffstat (limited to 'src/modules/m_spanningtree')
-rw-r--r--src/modules/m_spanningtree/protocolinterface.cpp29
-rw-r--r--src/modules/m_spanningtree/protocolinterface.h2
2 files changed, 23 insertions, 8 deletions
diff --git a/src/modules/m_spanningtree/protocolinterface.cpp b/src/modules/m_spanningtree/protocolinterface.cpp
index 7a2b033d9..ee5e31984 100644
--- a/src/modules/m_spanningtree/protocolinterface.cpp
+++ b/src/modules/m_spanningtree/protocolinterface.cpp
@@ -44,16 +44,31 @@ void SpanningTreeProtocolInterface::GetServerList(ServerList& sl)
}
}
-bool SpanningTreeProtocolInterface::SendEncapsulatedData(const parameterlist &encap)
+bool SpanningTreeProtocolInterface::SendEncapsulatedData(const std::string& targetmask, const std::string& cmd, const parameterlist& params, User* source)
{
- CmdBuilder params("ENCAP");
- params.insert(encap);
- if (encap[0].find_first_of("*?") != std::string::npos)
+ if (!source)
+ source = ServerInstance->FakeClient;
+
+ CmdBuilder encap(source, "ENCAP");
+
+ // Are there any wildcards in the target string?
+ if (targetmask.find_first_of("*?") != std::string::npos)
{
- params.Broadcast();
- return true;
+ // Yes, send the target string as-is; servers will decide whether or not it matches them
+ encap.push(targetmask).push(cmd).insert(params).Broadcast();
+ }
+ else
+ {
+ // No wildcards which means the target string has to be the name of a known server
+ TreeServer* server = Utils->FindServer(targetmask);
+ if (!server)
+ return false;
+
+ // Use the SID of the target in the message instead of the server name
+ encap.push(server->GetID()).push(cmd).insert(params).Unicast(server->ServerUser);
}
- return params.Unicast(encap[0]);
+
+ return true;
}
void SpanningTreeProtocolInterface::SendMetaData(User* u, const std::string& key, const std::string& data)
diff --git a/src/modules/m_spanningtree/protocolinterface.h b/src/modules/m_spanningtree/protocolinterface.h
index 745a0c3cc..04b56c181 100644
--- a/src/modules/m_spanningtree/protocolinterface.h
+++ b/src/modules/m_spanningtree/protocolinterface.h
@@ -31,7 +31,7 @@ class SpanningTreeProtocolInterface : public ProtocolInterface
void SendMetaData(const std::string& key, const std::string& data) CXX11_OVERRIDE;
};
- bool SendEncapsulatedData(const parameterlist &encap);
+ bool SendEncapsulatedData(const std::string& targetmask, const std::string& cmd, const parameterlist& params, User* source) CXX11_OVERRIDE;
void SendMetaData(User* user, const std::string& key, const std::string& data) CXX11_OVERRIDE;
void SendMetaData(Channel* chan, const std::string& key, const std::string& data) CXX11_OVERRIDE;
void SendMetaData(const std::string& key, const std::string& data) CXX11_OVERRIDE;