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 template <class M>
00022 class ListTransport
00023 {
00024 public:
00025
00026 enum PluginStatus {SUCCESS, CREATE_FAILURE, LIB_LOAD_FAILURE, DOES_NOT_EXIST};
00027
00029 struct TransportDesc
00030 {
00031 TransportDesc()
00032 : pub_status(DOES_NOT_EXIST), sub_status(DOES_NOT_EXIST)
00033 {}
00034
00035 std::string package_name;
00036 std::string pub_name;
00037 PluginStatus pub_status;
00038 std::string sub_name;
00039 PluginStatus sub_status;
00040 };
00042
00043 ListTransport() {}
00044 ~ListTransport() {}
00045
00046 void run(const std::string & package_name,const std::string & class_name) {
00047
00048 pluginlib::ClassLoader<PublisherPlugin< M> > pub_loader(package_name,
00049 std::string("message_transport::PublisherPlugin<")+class_name+">");
00050 pluginlib::ClassLoader<SubscriberPlugin< M> > sub_loader(package_name,
00051 std::string("message_transport::SubscriberPlugin<")+class_name+">");
00052 typedef std::map<std::string, TransportDesc> StatusMap;
00053 StatusMap transports;
00054
00055 BOOST_FOREACH(const std::string& lookup_name, pub_loader.getDeclaredClasses()) {
00056 std::string transport_name = boost::erase_last_copy(lookup_name, "_pub");
00057 transports[transport_name].pub_name = lookup_name;
00058 transports[transport_name].package_name = pub_loader.getClassPackage(lookup_name);
00059 try {
00060 PublisherPlugin<M> * pub = pub_loader.createClassInstance(lookup_name);
00061 transports[transport_name].pub_status = SUCCESS;
00062 delete pub;
00063 }
00064 catch (const pluginlib::LibraryLoadException& e) {
00065 transports[transport_name].pub_status = LIB_LOAD_FAILURE;
00066 }
00067 catch (const pluginlib::CreateClassException& e) {
00068 transports[transport_name].pub_status = CREATE_FAILURE;
00069 }
00070 }
00071
00072 BOOST_FOREACH(const std::string& lookup_name, sub_loader.getDeclaredClasses()) {
00073 std::string transport_name = boost::erase_last_copy(lookup_name, "_sub");
00074 transports[transport_name].sub_name = lookup_name;
00075 transports[transport_name].package_name = sub_loader.getClassPackage(lookup_name);
00076 try {
00077 SubscriberPlugin<M> * sub = sub_loader.createClassInstance(lookup_name);
00078 transports[transport_name].sub_status = SUCCESS;
00079 delete sub;
00080 }
00081 catch (const pluginlib::LibraryLoadException& e) {
00082 transports[transport_name].sub_status = LIB_LOAD_FAILURE;
00083 }
00084 catch (const pluginlib::CreateClassException& e) {
00085 transports[transport_name].sub_status = CREATE_FAILURE;
00086 }
00087 }
00088
00089 bool problem_package = false;
00090 printf("Declared transports:\n");
00091 BOOST_FOREACH(const typename StatusMap::value_type& value, transports) {
00092 const TransportDesc& td = value.second;
00093 printf("%s",value.first.c_str());
00094 if ((td.pub_status == CREATE_FAILURE || td.pub_status == LIB_LOAD_FAILURE) ||
00095 (td.sub_status == CREATE_FAILURE || td.sub_status == LIB_LOAD_FAILURE)) {
00096 printf(" (*): Not available. Try 'rosmake %s'.", td.package_name.c_str());
00097 problem_package = true;
00098 }
00099 printf("\n");
00100 }
00101 #if 0
00102 if (problem_package)
00103 printf("(*) \n");
00104 #endif
00105
00106 printf("\nDetails:\n");
00107 BOOST_FOREACH(const typename StatusMap::value_type& value, transports) {
00108 const TransportDesc& td = value.second;
00109 printf("----------\n");
00110 printf("\"%s\"\n", value.first.c_str());
00111 if (td.pub_status == CREATE_FAILURE || td.sub_status == CREATE_FAILURE) {
00112 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");
00113 }
00114 else if (td.pub_status == LIB_LOAD_FAILURE || td.sub_status == LIB_LOAD_FAILURE) {
00115 printf("*** Plugins are not built. ***\n");
00116 }
00117 printf(" - Provided by package: %s\n", td.package_name.c_str());
00118 if (td.pub_status == DOES_NOT_EXIST)
00119 printf(" - No publisher provided\n");
00120 else
00121 printf(" - Publisher: %s\n", pub_loader.getClassDescription(td.pub_name).c_str());
00122 if (td.sub_status == DOES_NOT_EXIST)
00123 printf(" - No subscriber provided\n");
00124 else
00125 printf(" - Subscriber: %s\n", sub_loader.getClassDescription(td.sub_name).c_str());
00126 }
00127
00128 }
00129
00130 };
00131
00132 };
00133
00134 #endif // MESSAGE_TRANSPORT_LIST_TRANSPORT_H