Beispiel #1
0
        internal bool UnadvertiseService(string service)
        {
            IServicePublication pub = null;

            lock (gate)
            {
                if (shuttingDown)
                {
                    return(false);
                }

                foreach (IServicePublication sp in servicePublications)
                {
                    if (sp.name == service)
                    {
                        pub = sp;
                        servicePublications.Remove(sp);
                        break;
                    }
                }
            }

            if (pub != null)
            {
                UnregisterService(pub.name);
                pub.Drop();
                return(true);
            }
            return(false);
        }
        public bool handleHeader(Header header)
        {
            if (!header.Values.ContainsKey("md5sum") || !header.Values.ContainsKey("service") || !header.Values.ContainsKey("callerid"))
            {
                string bbq = $"[{ThisNode.Name}] Error in TcpRos header. Required elements (md5sum, service, callerid) are missing";
                ROS.Error()(bbq);
                connection.sendHeaderError(ref bbq);
                return(false);
            }
            string md5sum          = (string)header.Values["md5sum"];
            string service         = (string)header.Values["service"];
            string client_callerid = (string)header.Values["callerid"];

            if (header.Values.ContainsKey("persistent") && ((string)header.Values["persistent"] == "1" || (string)header.Values["persistent"] == "true"))
            {
                persistent = true;
            }

            ROS.Debug()($"[{ThisNode.Name}] Service client [{client_callerid}] wants service [{service}] with md5sum [{md5sum}]");
            IServicePublication isp = ServiceManager.Instance.LookupServicePublication(service);

            if (isp == null)
            {
                string bbq = $"[{ThisNode.Name}] Received a TcpRos connection for a nonexistent service [{service}]";
                ROS.Warn()(bbq);
                connection.sendHeaderError(ref bbq);
                return(false);
            }

            if (isp.md5sum != md5sum && md5sum != "*" && isp.md5sum != "*")
            {
                string bbq = $"[{ThisNode.Name}] Client wants service {service} to have md5sum {md5sum} but it has {isp.md5sum}. Dropping connection";
                ROS.Error()(bbq);
                connection.sendHeaderError(ref bbq);
                return(false);
            }

            if (isp.isDropped)
            {
                string bbq = $"[{ThisNode.Name}]  Received a TcpRos connection for a nonexistent service [{service}]";
                ROS.Warn()(bbq);
                connection.sendHeaderError(ref bbq);
                return(false);
            }

            parent = isp;
            IDictionary <string, string> m = new Dictionary <string, string>();

            m["request_type"]  = isp.req_datatype;
            m["response_type"] = isp.res_datatype;
            m["type"]          = isp.datatype;
            m["md5sum"]        = isp.md5sum;
            m["callerid"]      = ThisNode.Name;

            connection.writeHeader(m, onHeaderWritten);

            isp.addServiceClientLink(this);
            return(true);
        }
Beispiel #3
0
        private async Task HandleHeader(Header header)
        {
            if (!header.Values.ContainsKey("md5sum") || !header.Values.ContainsKey("service") || !header.Values.ContainsKey("callerid"))
            {
                throw new RosException("Error in TcpRos header. Required elements (md5sum, service, callerid) are missing");;
            }

            string md5sum         = header.Values["md5sum"];
            string service        = header.Values["service"];
            string clientCallerid = header.Values["callerid"];

            if (header.Values.ContainsKey("persistent") && (header.Values["persistent"] == "1" || header.Values["persistent"] == "true"))
            {
                persistent = true;
            }

            logger.LogDebug($"Service client [{clientCallerid}] wants service [{service}] with md5sum [{md5sum}]");
            IServicePublication publication = ServiceManager.Instance.LookupServicePublication(service);

            if (publication == null)
            {
                throw new RosException($"Received a TcpRos connection for a nonexistent service [{service}]");
            }

            if (publication.md5sum != md5sum && md5sum != "*" && publication.md5sum != "*")
            {
                throw new RosException($"Client wants service {service} to have md5sum {md5sum} but it has {publication.md5sum}. Dropping connection");
            }

            if (publication.isDropped)
            {
                throw new RosException($"Received a TcpRos connection for a nonexistent service [{service}]");
            }

            parent = publication;
            IDictionary <string, string> m = new Dictionary <string, string>
            {
                ["request_type"]  = publication.req_datatype,
                ["response_type"] = publication.res_datatype,
                ["type"]          = publication.dataType,
                ["md5sum"]        = publication.md5sum,
                ["callerid"]      = ThisNode.Name
            };

            await connection.WriteHeader(m, cancel);

            publication.AddServiceClientLink(this);
        }