40 #ifndef __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__
41 #define __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__
57 #include <openfluid/config.hpp>
63 typedef std::string* (*GetWareABIVersionProc)();
65 typedef std::string* (*GetWareLinkUIDProc)();
79 template<
class SignatureType,
class BodyType,
typename SignatureProc,
typename BodyProc>
90 std::unique_ptr<DynamicLib>& loadPluginLibrary(
const std::string& FullFilePath)
94 if (m_LoadedPluginsLibraries.find(PluginFileName) == m_LoadedPluginsLibraries.end())
96 m_LoadedPluginsLibraries[PluginFileName] = std::make_unique<DynamicLib>(FullFilePath);
99 return m_LoadedPluginsLibraries[PluginFileName];
109 return (ID+getPluginFilenameSuffix()+openfluid::config::PLUGINS_EXT);
128 std::string PluginFullPath = getPluginFullPath(Filename);
130 if (!PluginFullPath.empty())
132 auto& PlugLib = loadPluginLibrary(PluginFullPath);
136 Container.
setPath(PluginFullPath);
138 if (PlugLib->isLoaded() || PlugLib->load())
143 bool Verified =
false;
146 std::unique_ptr<std::string> ABIPtr(ABIVersionProc());
149 StrictABICheck) == 0);
158 if (SProc && hasBodyProc)
160 auto SignPtr = SProc();
164 Verified = (Filename == buildPluginFilename(SignPtr->ID));
175 std::unique_ptr<std::string> StrPtr(LinkUIDProc());
181 Container.
setMessage(
"ID mismatch in signature");
186 Container.
setMessage(
"signature cannot be instanciated");
196 Container.
setMessage(
"plugin ABI version mismatch");
201 Container.
setMessage(PlugLib->getLatestErrorMsg());
209 "unable to find plugin file " + Filename);
215 "empty path for plugin file " + Filename);
235 return buildWareContainerFromFilename(buildPluginFilename(ID),StrictABICheck);
324 return buildWareContainerFromID(ID);
328 return createContainer();
343 std::vector<WareContainer<SignatureType>>
loadPlugins(
const std::string& IDPattern =
"")
345 std::vector<WareContainer<SignatureType>> Containers;
346 std::vector<std::string> PluginsPaths = getPluginsSearchPaths();
347 std::vector<std::string> PluginFiles;
348 std::vector<std::string> TmpFiles;
350 for (
const auto&
Path: PluginsPaths)
353 getPluginFilenameSuffix(),
354 openfluid::config::PLUGINS_EXT,
357 for (
const auto& File: TmpFiles)
359 PluginFiles.push_back(File);
364 for (
const auto& File: PluginFiles)
368 auto Container = buildWareContainerFromFilename(File);
370 if (Container.isValid() &&
373 Containers.emplace_back(std::move(Container));
397 std::string PluginFullPath = Container.
getPath();
399 std::unique_ptr<DynamicLib>& PlugLib = loadPluginLibrary(PluginFullPath);
403 if (PlugLib->isLoaded() || PlugLib->load())
410 BodyType* Body = BProc();
416 "format error in plugin file " + PluginFullPath);
422 "unable to load plugin file " + PluginFullPath);
428 "unable to find plugin file " + PluginFullPath);
442 for (
const auto& PlugLib : m_LoadedPluginsLibraries)
444 PlugLib.second->unload();
447 m_LoadedPluginsLibraries.clear();
#define WAREBODY_PROC_NAME
Definition: PluggableWare.hpp:56
#define WARELINKUID_PROC_NAME
Definition: PluggableWare.hpp:75
#define WARESIGNATURE_PROC_NAME
Definition: PluggableWare.hpp:62
#define WAREABIVERSION_PROC_NAME
Definition: PluggableWare.hpp:68
Definition: FrameworkException.hpp:51
Definition: WareContainer.hpp:62
void validate()
Definition: WareContainer.hpp:171
std::string getPath() const
Definition: WareContainer.hpp:110
void setMessage(const std::string &Message)
Definition: WareContainer.hpp:189
void setPath(const std::string &Path)
Definition: WareContainer.hpp:120
void setLinkUID(const UUID_t &UID)
Definition: WareContainer.hpp:146
void setSignature(SignatureType *Signature)
Definition: WareContainer.hpp:217
Definition: WarePluginsManager.hpp:81
BodyType * getWareBody(const WareContainer< SignatureType > &Container)
Definition: WarePluginsManager.hpp:395
virtual std::string getPluginFullPath(const std::string &Filename) const =0
WarePluginsManager()
Definition: WarePluginsManager.hpp:261
WareContainer< SignatureType > loadPlugin(const std::string &ID)
Definition: WarePluginsManager.hpp:320
virtual std::vector< std::string > getPluginsSearchPaths() const =0
virtual std::string getPluginFilenameSuffix() const =0
std::map< std::string, std::unique_ptr< DynamicLib > > m_LoadedPluginsLibraries
Definition: WarePluginsManager.hpp:256
std::vector< WareContainer< SignatureType > > loadPlugins(const std::string &IDPattern="")
Definition: WarePluginsManager.hpp:343
void unloadAll()
Definition: WarePluginsManager.hpp:440
virtual ~WarePluginsManager()
Definition: WarePluginsManager.hpp:273
#define OPENFLUID_API
Definition: dllexport.hpp:86
std::string *(* GetWareABIVersionProc)()
Definition: WarePluginsManager.hpp:63
std::string *(* GetWareLinkUIDProc)()
Definition: WarePluginsManager.hpp:65
std::string WareID_t
Definition: TypeDefs.hpp:49
Definition: ApplicationException.hpp:47