Go to the documentation of this file.00001 #ifndef MESSAGE_TRANSPORT_LIST_TRANSPORT_H
00002 #define MESSAGE_TRANSPORT_LIST_TRANSPORT_H
00003
00004
00005 #include <message_transport/publisher_plugin.h>
00006 #include <message_transport/subscriber_plugin.h>
00007 #include <pluginlib/class_loader.h>
00008 #include <boost/foreach.hpp>
00009 #include <boost/algorithm/string/erase.hpp>
00010 #include <map>
00011
00012
00013 namespace message_transport {
00014
00015
00016
00017 #define LIST_TRANSPORT(PACKAGE,CLASS) {\
00018 ros::init(argc, argv, "list_transport_"PACKAGE); \
00019 ListTransport<CLASS> l;l.run(PACKAGE,#CLASS);}
00020
00021
00022 template <class M>
00023 class ListTransport
00024 {
00025 public:
00026
00027 enum PluginStatus {SUCCESS, CREATE_FAILURE, LIB_LOAD_FAILURE, DOES_NOT_EXIST};
00028
00030 struct TransportDesc
00031 {
00032 TransportDesc()
00033 : pub_status(DOES_NOT_EXIST), sub_status(DOES_NOT_EXIST)
00034 {}
00035
00036 std::string pub_transport_name;
00037 std::string sub_transport_name;
00038 std::string package_name;
00039 std::string pub_name;
00040 PluginStatus pub_status;
00041 std::string sub_name;
00042 PluginStatus sub_status;
00043 };
00045
00046 ListTransport() {}
00047 ~ListTransport() {}
00048
00049 void run(const std::string & package_name,const std::string & class_name) {
00050
00051 pluginlib::ClassLoader<PublisherPlugin< M> > pub_loader(package_name,
00052 std::string("message_transport::PublisherPlugin<")+class_name+">");
00053 pluginlib::ClassLoader<SubscriberPlugin< M> > sub_loader(package_name,
00054 std::string("message_transport::SubscriberPlugin<")+class_name+">");
00055 typedef std::map<std::string, TransportDesc> StatusMap;
00056 StatusMap transports;
00057
00058 BOOST_FOREACH(const std::string& lookup_name, pub_loader.getDeclaredClasses()) {
00059 std::string transport_name = boost::erase_last_copy(lookup_name, "_pub");
00060 transports[transport_name].pub_name = lookup_name;
00061 transports[transport_name].package_name = pub_loader.getClassPackage(lookup_name);
00062 try {
00063 #if ROS_VERSION_MINIMUM(1, 7, 0) // if current ros version is >= 1.7.0
00064
00065 boost::shared_ptr< PublisherPlugin<M> > pub = pub_loader.createInstance(lookup_name);
00066 transports[transport_name].pub_transport_name = pub->getTransportName();
00067 transports[transport_name].pub_status = SUCCESS;
00068 pub.reset();
00069 #else
00070
00071 PublisherPlugin<M> *pub = pub_loader.createClassInstance(lookup_name);
00072 transports[transport_name].pub_transport_name = pub->getTransportName();
00073 transports[transport_name].pub_status = SUCCESS;
00074 pub->shutdown();
00075 #endif
00076 }
00077 catch (const pluginlib::LibraryLoadException& e) {
00078 transports[transport_name].pub_status = LIB_LOAD_FAILURE;
00079 }
00080 catch (const pluginlib::CreateClassException& e) {
00081 transports[transport_name].pub_status = CREATE_FAILURE;
00082 }
00083 }
00084
00085 BOOST_FOREACH(const std::string& lookup_name, sub_loader.getDeclaredClasses()) {
00086 std::string transport_name = boost::erase_last_copy(lookup_name, "_sub");
00087 transports[transport_name].sub_name = lookup_name;
00088 transports[transport_name].package_name = sub_loader.getClassPackage(lookup_name);
00089 try {
00090 #if ROS_VERSION_MINIMUM(1, 7, 0) // if current ros version is >= 1.7.0
00091 boost::shared_ptr< SubscriberPlugin<M> > sub = sub_loader.createInstance(lookup_name);
00092 transports[transport_name].sub_status = SUCCESS;
00093 transports[transport_name].sub_transport_name = sub->getTransportName();
00094
00095 sub.reset();
00096 #else
00097
00098 SubscriberPlugin<M> *sub = sub_loader.createClassInstance(lookup_name);
00099 transports[transport_name].sub_status = SUCCESS;
00100 transports[transport_name].sub_transport_name = sub->getTransportName();
00101 sub->shutdown();
00102 #endif
00103 }
00104 catch (const pluginlib::LibraryLoadException& e) {
00105 transports[transport_name].sub_status = LIB_LOAD_FAILURE;
00106 }
00107 catch (const pluginlib::CreateClassException& e) {
00108 transports[transport_name].sub_status = CREATE_FAILURE;
00109 }
00110 }
00111
00112 printf("Declared transports for %s/%s:\n",package_name.c_str(),class_name.c_str());
00113 BOOST_FOREACH(const typename StatusMap::value_type& value, transports) {
00114 const TransportDesc& td = value.second;
00115 printf("%s",value.first.c_str());
00116 if ((td.pub_status == CREATE_FAILURE || td.pub_status == LIB_LOAD_FAILURE) ||
00117 (td.sub_status == CREATE_FAILURE || td.sub_status == LIB_LOAD_FAILURE)) {
00118 printf(" (*): Not available. Try 'rosmake %s'.", td.package_name.c_str());
00119 }
00120 printf("\n");
00121 }
00122
00123 printf("\nDetails:\n");
00124 BOOST_FOREACH(const typename StatusMap::value_type& value, transports) {
00125 const TransportDesc& td = value.second;
00126 printf("----------\n");
00127 printf("\"%s\" alias \"%s\"\n", value.first.c_str(),td.pub_transport_name.c_str());
00128 if (td.pub_transport_name != td.sub_transport_name) {
00129 printf("\t***Plugins are built but subscriber and publisher are not \n");
00130 printf("\t reporting the same transport name: %s / %s\n",
00131 td.pub_transport_name.c_str(),td.sub_transport_name.c_str());
00132 }
00133 if (td.pub_status == CREATE_FAILURE || td.sub_status == CREATE_FAILURE) {
00134 printf("*** Plugins are built, but could not be loaded. The package may need to be rebuilt or may not be compatible with this release of message_common. ***\n");
00135 }
00136 else if (td.pub_status == LIB_LOAD_FAILURE || td.sub_status == LIB_LOAD_FAILURE) {
00137 printf("*** Plugins are not built. ***\n");
00138 }
00139 printf(" - Provided by package: %s\n", td.package_name.c_str());
00140 if (td.pub_status == DOES_NOT_EXIST)
00141 printf(" - No publisher provided\n");
00142 else
00143 printf(" - Publisher: %s\n", pub_loader.getClassDescription(td.pub_name).c_str());
00144 if (td.sub_status == DOES_NOT_EXIST)
00145 printf(" - No subscriber provided\n");
00146 else
00147 printf(" - Subscriber: %s\n", sub_loader.getClassDescription(td.sub_name).c_str());
00148 }
00149
00150 }
00151
00152 };
00153
00154 };
00155
00156 #endif // MESSAGE_TRANSPORT_LIST_TRANSPORT_H