]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_spanningtree/protocolinterface.cpp
Add ProtocolInterface::BroadcastEncap() and infrastructure for manually forwarding...
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / protocolinterface.cpp
index afd4633602027ff67396d299e1bbf6d0fa5bf501..192f7cff2ca2e5abae2ddee5d384b1a2e7038ff3 100644 (file)
@@ -44,41 +44,67 @@ 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(Extensible* target, const std::string &key, const std::string &data)
+void SpanningTreeProtocolInterface::BroadcastEncap(const std::string& cmd, const parameterlist& params, User* source, User* omit)
 {
-       User* u = dynamic_cast<User*>(target);
-       Channel* c = dynamic_cast<Channel*>(target);
-       if (u)
-               CommandMetadata::Builder(u, key, data).Broadcast();
-       else if (c)
-               CommandMetadata::Builder(c, key, data).Broadcast();
-       else
-               CommandMetadata::Builder(key, data).Broadcast();
+       if (!source)
+               source = ServerInstance->FakeClient;
+
+       // If omit is non-NULL we pass the route belonging to the user to Forward(),
+       // otherwise we pass NULL, which is equivalent to Broadcast()
+       TreeServer* server = (omit ? TreeServer::Get(omit)->GetRoute() : NULL);
+       CmdBuilder(source, "ENCAP * ").push_raw(cmd).insert(params).Forward(server);
 }
 
-void SpanningTreeProtocolInterface::SendTopic(Channel* channel, std::string &topic)
+void SpanningTreeProtocolInterface::SendMetaData(User* u, const std::string& key, const std::string& data)
 {
-       CmdBuilder params("FTOPIC");
+       CommandMetadata::Builder(u, key, data).Broadcast();
+}
+
+void SpanningTreeProtocolInterface::SendMetaData(Channel* c, const std::string& key, const std::string& data)
+{
+       CommandMetadata::Builder(c, key, data).Broadcast();
+}
 
-       params.push_back(channel->name);
-       params.push_back(ConvToStr(channel->age));
-       params.push_back(ConvToStr(ServerInstance->Time()));
-       params.push_back(ServerInstance->Config->ServerName);
-       params.push_last(topic);
+void SpanningTreeProtocolInterface::SendMetaData(const std::string& key, const std::string& data)
+{
+       CommandMetadata::Builder(key, data).Broadcast();
+}
 
-       params.Broadcast();
+void SpanningTreeProtocolInterface::Server::SendMetaData(const std::string& key, const std::string& data)
+{
+       sock->WriteLine(CommandMetadata::Builder(key, data));
+}
+
+void SpanningTreeProtocolInterface::SendTopic(Channel* channel, std::string &topic)
+{
+       CommandFTopic::Builder(ServerInstance->FakeClient, channel).Broadcast();
 }
 
 void SpanningTreeProtocolInterface::SendMode(User* source, User* u, Channel* c, const std::vector<std::string>& modedata, const std::vector<TranslateType>& translate)
@@ -103,7 +129,7 @@ void SpanningTreeProtocolInterface::SendMode(User* source, User* u, Channel* c,
        }
 }
 
-void SpanningTreeProtocolInterface::SendSNONotice(const std::string &snomask, const std::string &text)
+void SpanningTreeProtocolInterface::SendSNONotice(char snomask, const std::string &text)
 {
        CmdBuilder("SNONOTICE").push(snomask).push_last(text).Broadcast();
 }