40#ifndef __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__
41#define __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__
57#include <openfluid/config.hpp>
63typedef std::string* (*GetWareABIVersionProc)();
65typedef std::string* (*GetWareLinkUIDProc)();
79template<
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));
377 std::cout <<
"Invalid container " << Container.signature()->ID <<
": " << Container.isValid() <<
" / " <<
403 std::string PluginFullPath = Container.
getPath();
405 std::unique_ptr<DynamicLib>& PlugLib = loadPluginLibrary(PluginFullPath);
409 if (PlugLib->isLoaded() || PlugLib->load())
416 BodyType* Body = BProc();
422 "format error in plugin file " + PluginFullPath);
428 "unable to load plugin file " + PluginFullPath);
434 "unable to find plugin file " + PluginFullPath);
448 for (
const auto& PlugLib : m_LoadedPluginsLibraries)
450 PlugLib.second->unload();
453 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
std::vector< WareContainer< SignatureType > > loadPlugins(const std::string &IDPattern="")
Definition WarePluginsManager.hpp:343
virtual std::string getPluginFullPath(const std::string &Filename) const =0
WarePluginsManager()
Definition WarePluginsManager.hpp:261
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
void unloadAll()
Definition WarePluginsManager.hpp:446
BodyType * getWareBody(const WareContainer< SignatureType > &Container)
Definition WarePluginsManager.hpp:401
WareContainer< SignatureType > loadPlugin(const std::string &ID)
Definition WarePluginsManager.hpp:320
virtual ~WarePluginsManager()
Definition WarePluginsManager.hpp:273
#define OPENFLUID_API
Definition dllexport.hpp:86
std::string *(* GetWareLinkUIDProc)()
Definition WarePluginsManager.hpp:65
std::string *(* GetWareABIVersionProc)()
Definition WarePluginsManager.hpp:63
std::string WareID_t
Definition TypeDefs.hpp:49
Definition ApplicationException.hpp:47