public bool HandleHeader(Header header) { if (!header.Values.ContainsKey("topic")) { string msg = $"[{ThisNode.Name}] Header from subscriber did not have the required element: topic"; ROS.Warn()(msg); connection.sendHeaderError(ref msg); return(false); } string name = (string)header.Values["topic"]; string client_callerid = (string)header.Values["callerid"]; Publication pt = TopicManager.Instance.lookupPublication(name); if (pt == null) { string msg = $"[{ThisNode.Name}] received a connection for a nonexistent topic [{name}] from [{connection.transport}] [{client_callerid}]"; ROS.Warn()(msg); connection.sendHeaderError(ref msg); return(false); } string error_message = ""; if (!pt.validateHeader(header, ref error_message)) { connection.sendHeaderError(ref error_message); ROS.Error()($"[{ThisNode.Name}] {error_message}"); return(false); } destination_caller_id = client_callerid; connection_id = ConnectionManager.Instance.GetNewConnectionId(); name = pt.Name; topic = name; parent = pt; lock ( parent ) { maxQueue = parent.MaxQueue; } var m = new Dictionary <string, string>(); m["type"] = pt.DataType; m["md5sum"] = pt.Md5sum; m["message_definition"] = pt.MessageDefinition; m["callerid"] = ThisNode.Name; m["latching"] = Convert.ToString(pt.Latch); connection.writeHeader(m, OnHeaderWritten); pt.addSubscriberLink(this); ROS.Debug()($"[{ThisNode.Name}] Finalize transport subscriber link for {name}"); return(true); }
public void addLocalConnection(Publication pub) { lock ( publisher_links_mutex ) { if (_dropped) { return; } ROS.Info()($"[{ThisNode.Name}] Creating intraprocess link for topic [{name}]"); var pub_link = new LocalPublisherLink(this, XmlRpcManager.Instance.Uri); var sub_link = new LocalSubscriberLink(pub); pub_link.setPublisher(sub_link); sub_link.SetSubscriber(pub_link); addPublisherLink(pub_link); pub.addSubscriberLink(sub_link); } }