Revision: 8662
http://playerstage.svn.sourceforge.net/playerstage/?rev=8662&view=rev
Author: hsujohnhsu
Date: 2010-05-06 17:56:14 +0000 (Thu, 06 May 2010)
Log Message:
-----------
add helper functions for GazeboConfig. Add pluginPaths for dynamically
loadable plugins.
Modified Paths:
--------------
code/gazebo/trunk/server/GazeboConfig.cc
code/gazebo/trunk/server/GazeboConfig.hh
code/gazebo/trunk/server/controllers/ControllerFactory.cc
Modified: code/gazebo/trunk/server/GazeboConfig.cc
===================================================================
--- code/gazebo/trunk/server/GazeboConfig.cc 2010-05-06 17:49:44 UTC (rev
8661)
+++ code/gazebo/trunk/server/GazeboConfig.cc 2010-05-06 17:56:14 UTC (rev
8662)
@@ -60,34 +60,16 @@
char *ogre_resource_path = getenv("OGRE_RESOURCE_PATH");
if(ogre_resource_path)
- {
- std::string str(ogre_resource_path);
- int pos1 = 0;
- int pos2 = str.find(delim);
- while (pos2 != (int)std::string::npos)
- {
- this->ogrePaths.push_back(str.substr(pos1,pos2-pos1));
- pos1 = pos2+1;
- pos2 = str.find(delim,pos2+1);
- }
- this->ogrePaths.push_back(str.substr(pos1,str.size()-pos1));
- }
+ this->AddOgrePaths(std::string(ogre_resource_path));
char *gazebo_resource_path = getenv("GAZEBO_RESOURCE_PATH");
if(gazebo_resource_path)
- {
- std::string str(gazebo_resource_path);
- int pos1 = 0;
- int pos2 = str.find(delim);
- while (pos2 != (int)std::string::npos)
- {
- this->gazeboPaths.push_back(str.substr(pos1,pos2-pos1));
- pos1 = pos2+1;
- pos2 = str.find(delim,pos2+1);
- }
- this->gazeboPaths.push_back(str.substr(pos1,str.size()-pos1));
- }
+ this->AddGazeboPaths(std::string(gazebo_resource_path));
+ char *gazebo_plugin_path = getenv("GAZEBO_PLUGIN_PATH");
+ if(gazebo_plugin_path)
+ this->AddPluginPaths(std::string(gazebo_plugin_path));
+
if (cfgFile.is_open())
{
XMLConfig rc;
@@ -146,3 +128,59 @@
{
return this->ogrePaths;
}
+
+std::list<std::string> &GazeboConfig::GetPluginPaths()
+{
+ return this->pluginPaths;
+}
+
+void GazeboConfig::AddGazeboPaths(std::string gazebo_resource_path)
+{
+ std::string delim(":");
+ if(!gazebo_resource_path.empty())
+ {
+ int pos1 = 0;
+ int pos2 = gazebo_resource_path.find(delim);
+ while (pos2 != (int)std::string::npos)
+ {
+ this->gazeboPaths.push_back(gazebo_resource_path.substr(pos1,pos2-pos1));
+ pos1 = pos2+1;
+ pos2 = gazebo_resource_path.find(delim,pos2+1);
+ }
+
this->gazeboPaths.push_back(gazebo_resource_path.substr(pos1,gazebo_resource_path.size()-pos1));
+ }
+}
+
+void GazeboConfig::AddOgrePaths(std::string ogre_resource_path)
+{
+ std::string delim(":");
+ if(!ogre_resource_path.empty())
+ {
+ int pos1 = 0;
+ int pos2 = ogre_resource_path.find(delim);
+ while (pos2 != (int)std::string::npos)
+ {
+ this->ogrePaths.push_back(ogre_resource_path.substr(pos1,pos2-pos1));
+ pos1 = pos2+1;
+ pos2 = ogre_resource_path.find(delim,pos2+1);
+ }
+
this->ogrePaths.push_back(ogre_resource_path.substr(pos1,ogre_resource_path.size()-pos1));
+ }
+}
+
+void GazeboConfig::AddPluginPaths(std::string gazebo_plugin_path)
+{
+ std::string delim(":");
+ if(!gazebo_plugin_path.empty())
+ {
+ int pos1 = 0;
+ int pos2 = gazebo_plugin_path.find(delim);
+ while (pos2 != (int)std::string::npos)
+ {
+ this->pluginPaths.push_back(gazebo_plugin_path.substr(pos1,pos2-pos1));
+ pos1 = pos2+1;
+ pos2 = gazebo_plugin_path.find(delim,pos2+1);
+ }
+
this->pluginPaths.push_back(gazebo_plugin_path.substr(pos1,gazebo_plugin_path.size()-pos1));
+ }
+}
Modified: code/gazebo/trunk/server/GazeboConfig.hh
===================================================================
--- code/gazebo/trunk/server/GazeboConfig.hh 2010-05-06 17:49:44 UTC (rev
8661)
+++ code/gazebo/trunk/server/GazeboConfig.hh 2010-05-06 17:56:14 UTC (rev
8662)
@@ -53,12 +53,27 @@
/// \brief Get paths to ogre install
public: std::list<std::string>& GetOgrePaths();
+ /// \brief Get plugin paths
+ public: std::list<std::string>& GetPluginPaths();
+
+ /// \brief Add colon delimited paths to Gazebo install
+ public: void AddGazeboPaths(std::string path);
+
+ /// \brief Add colon delimited paths to ogre install
+ public: void AddOgrePaths(std::string path);
+
+ /// \brief Add colon delimited paths to plugins
+ public: void AddPluginPaths(std::string path);
+
/// Paths gazebo install
private: std::list<std::string> gazeboPaths;
/// Paths to the ogre install
private: std::list<std::string> ogrePaths;
+ /// Paths to the plugins
+ private: std::list<std::string> pluginPaths;
+
};
Modified: code/gazebo/trunk/server/controllers/ControllerFactory.cc
===================================================================
--- code/gazebo/trunk/server/controllers/ControllerFactory.cc 2010-05-06
17:49:44 UTC (rev 8661)
+++ code/gazebo/trunk/server/controllers/ControllerFactory.cc 2010-05-06
17:56:14 UTC (rev 8662)
@@ -33,6 +33,10 @@
#include "Controller.hh"
#include "ControllerFactory.hh"
+#include <sys/stat.h>
+#include "Simulator.hh"
+#include "GazeboConfig.hh"
+
#ifdef HAVE_DL
#include <dlfcn.h>
#elif HAVE_LTDL
@@ -73,13 +77,27 @@
// Load a controller plugin. Used by Model and Sensor when creating
controllers.
void ControllerFactory::LoadPlugin(const std::string &plugin, const
std::string &classname)
{
+ // search and expand plugin with full path by searching
GazeboConfig::pluginPaths,
+ // otherwise, leave as is, and let LD_LIBRARY_PATH take care of business
+ struct stat st;
+ bool found = false;
+ std::string fullname;
+ std::list<std::string>::iterator iter;
+ std::list<std::string>
pluginPaths=Simulator::Instance()->GetGazeboConfig()->GetPluginPaths();
+ for (iter=pluginPaths.begin(); iter!=pluginPaths.end(); ++iter)
+ {
+ fullname = (*iter)+std::string("/")+plugin;
+ if (stat(fullname.c_str(), &st) == 0) {found=true; break;}
+ }
+ if (!found) fullname = plugin;
+
#ifdef HAVE_DL
- void* handle = dlopen(plugin.c_str(), RTLD_LAZY|RTLD_GLOBAL);
+ void* handle = dlopen(fullname.c_str(), RTLD_LAZY|RTLD_GLOBAL);
if (!handle)
{
std::ostringstream stream;
- stream << "Failed to load " << plugin << ": " << dlerror();
+ stream << "Failed to load " << fullname << ": " << dlerror();
gzthrow(stream.str());
}
@@ -113,12 +131,12 @@
init_done = true;
}
- lt_dlhandle handle = lt_dlopenext(plugin.c_str());
+ lt_dlhandle handle = lt_dlopenext(fullname.c_str());
if (!handle)
{
std::ostringstream stream;
- stream << "Failed to load " << plugin << ": " << lt_dlerror();
+ stream << "Failed to load " << fullname << ": " << lt_dlerror();
gzthrow(stream.str());
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit