00001 #ifndef MESSAGE_TRANSPORT_PUBLISHER_PLUGIN_H
00002 #define MESSAGE_TRANSPORT_PUBLISHER_PLUGIN_H
00003
00004 #include <ros/ros.h>
00005 #include "message_transport/single_subscriber_publisher.h"
00006
00007 namespace message_transport {
00008
00012 class PublisherPluginGen : boost::noncopyable
00013 {
00014 public:
00015 virtual ~PublisherPluginGen() {}
00016
00021 virtual std::string getTransportName() const = 0;
00022
00026 virtual void advertise(ros::NodeHandle & nh, const std::string& base_topic, uint32_t queue_size,
00027 bool latch = true) = 0;
00028
00033 virtual uint32_t getNumSubscribers() const = 0;
00034
00038 virtual std::string getTopic() const = 0;
00039
00043 virtual void shutdown() = 0;
00044
00049 static std::string getLookupName(const std::string& transport_name)
00050 {
00051 return transport_name + "_pub";
00052 }
00053
00054 protected:
00055 };
00056
00060 template <class M>
00061 class PublisherPlugin : public PublisherPluginGen
00062 {
00063 public:
00064 virtual ~PublisherPlugin() {}
00065
00066 virtual void advertise(ros::NodeHandle & nh, const std::string& base_topic, uint32_t queue_size,
00067 bool latch = true) {
00068 advertiseImpl(nh,base_topic, queue_size,
00069 typename message_transport::SingleSubscriberPublisher<M>::StatusCB(),
00070 typename message_transport::SingleSubscriberPublisher<M>::StatusCB(), ros::VoidPtr(), latch);
00071
00072 }
00073
00078 void advertise(ros::NodeHandle & nh, const std::string& base_topic, uint32_t queue_size,
00079 const typename message_transport::SingleSubscriberPublisher<M>::StatusCB& connect_cb,
00080 const typename message_transport::SingleSubscriberPublisher<M>::StatusCB& disconnect_cb = SingleSubscriberPublisher<M>::StatusCB(),
00081 const ros::VoidPtr& tracked_object = ros::VoidPtr(), bool latch = true)
00082 {
00083 advertiseImpl(nh,base_topic, queue_size,
00084 connect_cb, disconnect_cb, tracked_object, latch);
00085 }
00086
00090 virtual void publish(const M& message) const = 0;
00091
00095 virtual void publish(const typename M::ConstPtr& message) const
00096 {
00097 publish(*message);
00098 }
00099
00100 protected:
00104 virtual void advertiseImpl(ros::NodeHandle & nh, const std::string& base_topic, uint32_t queue_size,
00105 const typename message_transport::SingleSubscriberPublisher<M>::StatusCB& connect_cb,
00106 const typename message_transport::SingleSubscriberPublisher<M>::StatusCB& disconnect_cb,
00107 const ros::VoidPtr& tracked_object, bool latch) = 0;
00108 };
00109
00110 }
00111
00112 #endif