Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 import fnmatch
00035 from rosbridge_library.capability import Capability
00036 from rosbridge_library.internal.publishers import manager
00037
00038
00039 class Publish(Capability):
00040
00041 publish_msg_fields = [(True, "topic", (str, unicode))]
00042
00043 topics_glob = None
00044
00045 def __init__(self, protocol):
00046
00047 Capability.__init__(self, protocol)
00048
00049
00050 protocol.register_operation("publish", self.publish)
00051
00052
00053 self._published = {}
00054
00055 def publish(self, message):
00056
00057 self.basic_type_check(message, self.publish_msg_fields)
00058 topic = message["topic"]
00059 latch = message.get("latch", False)
00060 queue_size = message.get("queue_size", 100)
00061
00062 if Publish.topics_glob is not None and Publish.topics_glob:
00063 self.protocol.log("debug", "Topic security glob enabled, checking topic: " + topic)
00064 match = False
00065 for glob in Publish.topics_glob:
00066 if (fnmatch.fnmatch(topic, glob)):
00067 self.protocol.log("debug", "Found match with glob " + glob + ", continuing publish...")
00068 match = True
00069 break
00070 if not match:
00071 self.protocol.log("warn", "No match found for topic, cancelling publish to: " + topic)
00072 return
00073 else:
00074 self.protocol.log("debug", "No topic security glob, not checking publish.")
00075
00076
00077 client_id = self.protocol.client_id
00078 manager.register(client_id, topic, latch=latch, queue_size=queue_size)
00079 self._published[topic] = True
00080
00081
00082 msg = message.get("msg", {})
00083
00084
00085 manager.publish(client_id, topic, msg, latch=latch, queue_size=queue_size)
00086
00087 def finish(self):
00088 client_id = self.protocol.client_id
00089 for topic in self._published:
00090 manager.unregister(client_id, topic)
00091 self._published.clear()