Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
            }
        }