$search
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 // using namespace pluginlib; 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 // Fuerte code 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 // Electric or less 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 // Electric or less 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