list_transport.h
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         // 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


message_transport_common
Author(s): Cedric Pradalier
autogenerated on Sun Oct 5 2014 23:48:49