1 #ifndef SimTK_SimTKCOMMON_PLUGIN_H_
2 #define SimTK_SimTKCOMMON_PLUGIN_H_
98 explicit Plugin(
const std::string& defaultPathname=
"");
114 bool load(
const std::string& name=
"");
127 return m_loadedPathname;
140 m_searchPath.clear();
141 for (
unsigned i=0; i < pathIn.size(); ++i)
142 addSearchDirectory(pathIn[i]);
153 m_searchPath.push_back(absDir);
163 m_searchPath.insert(m_searchPath.begin(), absDir);
169 static void* loadPluginByFileName(
const std::string& name, std::string& errMsg);
174 static void* loadDebugOrReleasePlugin(
const std::string& base,
const std::string& extension,
175 std::string& loadedFileName, std::string& errMsg);
178 static void* getSymbolAddress(
void* handle,
const std::string& name, std::string& errMsg);
181 static void unloadPlugin(
void* handle);
224 static bool deconstructLibraryName(
const std::string& name,
225 bool& isAbsolutePath,
226 std::string& directory,
227 std::string& libPrefix,
228 std::string& baseName,
229 std::string& debugSuffix,
230 std::string& extension);
235 static std::string getDynamicLibPrefix();
240 static std::string getDynamicLibExtension();
246 static std::string getDynamicLibDebugSuffix();
259 #define SimTK_PLUGIN_XXX_MAKE_HOLDER(FuncName) \
260 struct FuncName##__Holder__ { \
261 FuncName##__Holder__() : fp(0) {} \
262 bool loadSym(void* h, std::string& msg) const { \
263 if(!fp) fp =(FuncName##__Type__) \
264 Plugin::getSymbolAddress(h, #FuncName, msg); \
267 mutable FuncName##__Type__ fp; \
269 #define SimTK_PLUGIN_XXX_MAKE_BODY(FuncName) \
270 if (!FuncName##__Ref__.loadSym(m_handle,m_lastMessage)) \
271 throw std::runtime_error \
272 ("Plugin function " #FuncName " not found: " + m_lastMessage); \
273 return FuncName##__Ref__.fp
274 #define SimTK_PLUGIN_XXX_MAKE_SYMTEST(Symbol) \
275 bool has_##Symbol() const { \
276 return Symbol##__Ref__.loadSym(m_handle,m_lastMessage); \
279 #define SimTK_PLUGIN_DEFINE_SYMBOL(Type, SymName) \
280 typedef Type SymName##__Type__; \
281 SimTK_PLUGIN_XXX_MAKE_HOLDER(SymName); \
282 const Type& SymName() const { \
283 if (!SymName##__Ref__.loadSym(m_handle,m_lastMessage)) \
284 throw std::runtime_error \
285 ("Plugin symbol " #SymName " not found: " + m_lastMessage); \
286 return *(SymName##__Ref__.fp); \
289 #define SimTK_PLUGIN_DEFINE_FUNCTION(RetType, FuncName) \
290 typedef RetType (*FuncName##__Type__)(); \
291 SimTK_PLUGIN_XXX_MAKE_HOLDER(FuncName); \
292 RetType FuncName() const { \
293 SimTK_PLUGIN_XXX_MAKE_BODY(FuncName)(); \
295 SimTK_PLUGIN_XXX_MAKE_SYMTEST(FuncName)
297 #define SimTK_PLUGIN_DEFINE_FUNCTION1(RetType, FuncName, Arg1) \
298 typedef RetType (*FuncName##__Type__)(Arg1); \
299 SimTK_PLUGIN_XXX_MAKE_HOLDER(FuncName); \
300 RetType FuncName(Arg1 a1) const { \
301 SimTK_PLUGIN_XXX_MAKE_BODY(FuncName)(a1); \
303 SimTK_PLUGIN_XXX_MAKE_SYMTEST(FuncName)
305 #define SimTK_PLUGIN_DEFINE_FUNCTION2(RetType, FuncName, Arg1, Arg2) \
306 typedef RetType (*FuncName##__Type__)(Arg1,Arg2); \
307 SimTK_PLUGIN_XXX_MAKE_HOLDER(FuncName); \
308 RetType FuncName(Arg1 a1, Arg2 a2) const { \
309 SimTK_PLUGIN_XXX_MAKE_BODY(FuncName)(a1,a2); \
311 SimTK_PLUGIN_XXX_MAKE_SYMTEST(FuncName)
316 #endif // SimTK_SimTKCOMMON_PLUGIN_H_
#define SimTK_SimTKCOMMON_EXPORT
Definition: SimTKcommon/include/SimTKcommon/internal/common.h:202
Declaration of the SimTK::Pathname class providing platform-independent manipulation of file pathname...
void addSearchDirectory(const std::string &directory)
Add a directory to the end of the search path for this kind of plugin.
Definition: Plugin.h:150
static std::string getAbsoluteDirectoryPathname(const std::string &dirPathname)
This is the same as getAbsolutePathname() except that the final segment is interpreted as a directory...
Definition: Pathname.h:163
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition: Assembler.h:37
const Array_< std::string > & getSearchPath() const
Definition: Plugin.h:145
This file defines the Array_ class and related support classes including base classes ArrayViewC...
std::string getLastErrorMessage() const
If anything goes wrong the last error message is stored so you can retrieve it with this method...
Definition: Plugin.h:132
void * m_handle
Definition: Plugin.h:253
const std::string & getLoadedPathname() const
Definition: Plugin.h:126
std::string m_loadedPathname
Definition: Plugin.h:252
This is the base class for representing a runtime-linked dynamic library, also known as a "plugin"...
Definition: Plugin.h:96
std::string m_defaultName
Definition: Plugin.h:249
Mandatory first inclusion for any Simbody source or header file.
std::string m_lastMessage
Definition: Plugin.h:254
bool isLoaded() const
Is there currently a DLL associated with this Plugin object? If so you can call getLoadedPathname() t...
Definition: Plugin.h:124
void setSearchPath(const Array_< std::string > &pathIn)
Provide a list of directories in the order you want them searched to find a plugin that was provided ...
Definition: Plugin.h:139
void prependSearchDirectory(const std::string &directory)
Put a directory on the front of the search path for this kind of plugin.
Definition: Plugin.h:160
Array_< std::string > m_searchPath
Definition: Plugin.h:250