public bool registerSubscriber(Subscription s, string datatype) { string uri = XmlRpcManager.Instance.uri; XmlRpcValue args = new XmlRpcValue(this_node.Name, s.name, datatype, uri); XmlRpcValue result = new XmlRpcValue(); XmlRpcValue payload = new XmlRpcValue(); if (!master.execute("registerSubscriber", args, result, payload, true)) { return(false); } List <string> pub_uris = new List <string>(); for (int i = 0; i < payload.Size; i++) { XmlRpcValue load = payload[i]; string pubed = load.Get <string>(); if (pubed != uri && !pub_uris.Contains(pubed)) { pub_uris.Add(pubed); } } bool self_subscribed = false; Publication pub = null; string sub_md5sum = s.md5sum; lock (advertised_topics_mutex) { foreach (Publication p in advertised_topics) { pub = p; string pub_md5sum = pub.Md5sum; if (pub.Name == s.name && md5sumsMatch(pub_md5sum, sub_md5sum) && !pub.Dropped) { self_subscribed = true; break; } } } s.pubUpdate(pub_uris); if (self_subscribed) { s.addLocalConnection(pub); } return(true); }
/// <summary> /// Register as a publisher on a topic. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="ops"></param> /// <param name="callbacks"></param> /// <returns></returns> public bool advertise <T>(AdvertiseOptions <T> ops, SubscriberCallbacks callbacks) where T : IRosMessage, new() { if (!isValid(ops)) { return(false); } Publication pub = null; lock (advertised_topics_mutex) { if (shutting_down) { return(false); } pub = lookupPublicationWithoutLock(ops.topic); if (pub != null) { if (pub.Md5sum != ops.md5sum) { EDB.WriteLine ("Tried to advertise on topic [{0}] with md5sum [{1}] and datatype [{2}], but the topic is already advertised as md5sum [{3}] and datatype [{4}]", ops.topic, ops.md5sum, ops.datatype, pub.Md5sum, pub.DataType); return(false); } } else { pub = new Publication(ops.topic, ops.datatype, ops.md5sum, ops.message_definition, ops.queue_size, ops.latch, ops.has_header); } pub.addCallbacks(callbacks); advertised_topics.Add(pub); } bool found = false; Subscription sub = null; lock (subs_mutex) { foreach (Subscription s in subscriptions) { if (s.name == ops.topic && md5sumsMatch(s.md5sum, ops.md5sum) && !s.IsDropped) { found = true; sub = s; break; } } } if (found) { sub.addLocalConnection(pub); } XmlRpcValue args = new XmlRpcValue(this_node.Name, ops.topic, ops.datatype, XmlRpcManager.Instance.uri), result = new XmlRpcValue(), payload = new XmlRpcValue(); master.execute("registerPublisher", args, result, payload, true); return(true); }