list_transports.cpp
Go to the documentation of this file.
00001 #include "image_transport/publisher_plugin.h"
00002 #include "image_transport/subscriber_plugin.h"
00003 #include <pluginlib/class_loader.h>
00004 #include <boost/foreach.hpp>
00005 #include <boost/algorithm/string/erase.hpp>
00006 #include <map>
00007 
00008 using namespace image_transport;
00009 using namespace pluginlib;
00010 
00011 enum PluginStatus {SUCCESS, CREATE_FAILURE, LIB_LOAD_FAILURE, DOES_NOT_EXIST};
00012 
00014 struct TransportDesc
00015 {
00016   TransportDesc()
00017     : pub_status(DOES_NOT_EXIST), sub_status(DOES_NOT_EXIST)
00018   {}
00019 
00020   std::string package_name;
00021   std::string pub_name;
00022   PluginStatus pub_status;
00023   std::string sub_name;
00024   PluginStatus sub_status;
00025 };
00027 
00028 int main(int argc, char** argv)
00029 {
00030   ClassLoader<PublisherPlugin> pub_loader("image_transport", "image_transport::PublisherPlugin");
00031   ClassLoader<SubscriberPlugin> sub_loader("image_transport", "image_transport::SubscriberPlugin");
00032   typedef std::map<std::string, TransportDesc> StatusMap;
00033   StatusMap transports;
00034 
00035   BOOST_FOREACH(const std::string& lookup_name, pub_loader.getDeclaredClasses()) {
00036     std::string transport_name = boost::erase_last_copy(lookup_name, "_pub");
00037     transports[transport_name].pub_name = lookup_name;
00038     transports[transport_name].package_name = pub_loader.getClassPackage(lookup_name);
00039     try {
00040       PublisherPlugin* pub = pub_loader.createClassInstance(lookup_name);
00041       transports[transport_name].pub_status = SUCCESS;
00042       delete pub;
00043     }
00044     catch (const LibraryLoadException& e) {
00045       transports[transport_name].pub_status = LIB_LOAD_FAILURE;
00046     }
00047     catch (const CreateClassException& e) {
00048       transports[transport_name].pub_status = CREATE_FAILURE;
00049     }
00050   }
00051 
00052   BOOST_FOREACH(const std::string& lookup_name, sub_loader.getDeclaredClasses()) {
00053     std::string transport_name = boost::erase_last_copy(lookup_name, "_sub");
00054     transports[transport_name].sub_name = lookup_name;
00055     transports[transport_name].package_name = sub_loader.getClassPackage(lookup_name);
00056     try {
00057       SubscriberPlugin* sub = sub_loader.createClassInstance(lookup_name);
00058       transports[transport_name].sub_status = SUCCESS;
00059       delete sub;
00060     }
00061     catch (const LibraryLoadException& e) {
00062       transports[transport_name].sub_status = LIB_LOAD_FAILURE;
00063     }
00064     catch (const CreateClassException& e) {
00065       transports[transport_name].sub_status = CREATE_FAILURE;
00066     }
00067   }
00068 
00069   bool problem_package = false;
00070   printf("Declared transports:\n");
00071   BOOST_FOREACH(const StatusMap::value_type& value, transports) {
00072     const TransportDesc& td = value.second;
00073     printf("%s", value.first.c_str());
00074     if ((td.pub_status == CREATE_FAILURE || td.pub_status == LIB_LOAD_FAILURE) ||
00075         (td.sub_status == CREATE_FAILURE || td.sub_status == LIB_LOAD_FAILURE)) {
00076       printf(" (*): Not available. Try 'rosmake %s'.", td.package_name.c_str());
00077       problem_package = true;
00078     }
00079     printf("\n");
00080   }
00081 #if 0
00082   if (problem_package)
00083     printf("(*) \n");
00084 #endif
00085 
00086   printf("\nDetails:\n");
00087   BOOST_FOREACH(const StatusMap::value_type& value, transports) {
00088     const TransportDesc& td = value.second;
00089     printf("----------\n");
00090     printf("\"%s\"\n", value.first.c_str());
00091     if (td.pub_status == CREATE_FAILURE || td.sub_status == CREATE_FAILURE) {
00092       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 image_common. ***\n");
00093     }
00094     else if (td.pub_status == LIB_LOAD_FAILURE || td.sub_status == LIB_LOAD_FAILURE) {
00095       printf("*** Plugins are not built. ***\n");
00096     }
00097     printf(" - Provided by package: %s\n", td.package_name.c_str());
00098     if (td.pub_status == DOES_NOT_EXIST)
00099       printf(" - No publisher provided\n");
00100     else
00101       printf(" - Publisher: %s\n", pub_loader.getClassDescription(td.pub_name).c_str());
00102     if (td.sub_status == DOES_NOT_EXIST)
00103       printf(" - No subscriber provided\n");
00104     else
00105       printf(" - Subscriber: %s\n", sub_loader.getClassDescription(td.sub_name).c_str());
00106   }
00107   
00108   return 0;
00109 }


image_transport
Author(s): Patrick Mihelich
autogenerated on Fri Jan 3 2014 11:24:08