40 #ifndef __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__ 41 #define __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__ 57 #include <openfluid/config.hpp> 79 template<
class SignatureType,
class ItemType,
typename SignatureProc,
typename BodyProc>
90 QLibrary* loadPluginLibrary(
const std::string& FullFilePath)
92 std::string PluginFileName = QFileInfo(QString::fromStdString(FullFilePath)).fileName().toStdString();
94 if (m_LoadedPluginsLibraries.find(PluginFileName) == m_LoadedPluginsLibraries.end())
96 m_LoadedPluginsLibraries[PluginFileName] = std::make_unique<QLibrary>(QString::fromStdString(FullFilePath));
99 return m_LoadedPluginsLibraries[PluginFileName].get();
107 ItemType* buildWareContainerWithSignatureOnly(
const std::string& ID)
109 std::string PluginFilename = ID+getPluginFilenameSuffix()+openfluid::config::PLUGINS_EXT;
110 std::string PluginFullPath = getPluginFullPath(PluginFilename);
111 ItemType* WareItem =
nullptr;
113 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
116 if (PlugLib && PlugLib->load())
118 WareItem =
new ItemType();
119 WareItem->FileFullPath = PluginFullPath;
130 WareItem->Verified =
false;
134 if (WareItem->Verified)
142 WareItem->Signature = SProc();
144 if (WareItem->Signature ==
nullptr)
146 "Signature from plugin file " + PluginFilename +
147 " cannot be instanciated");
149 WareItem->Verified = (WareItem->Signature->ID == ID);
156 WareItem->LinkUID = LinkUIDProc();
161 "Format error in plugin file " + PluginFilename);
167 "Compatibility version mismatch for plugin file " + PluginFilename);
173 "Unable to load plugin from file " + PluginFilename);
184 SignatureType* getWareSignature(
const std::string& PluginFilename)
186 std::string PluginFullPath = getPluginFullPath(PluginFilename);
187 SignatureType* Sign =
nullptr;
191 .
addInfos({{
"pluginfullpath",PluginFullPath},{
"pluginfilename",PluginFilename}});
194 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
201 Sign =
new SignatureType();
202 Sign->FileFullPath = PluginFullPath;
213 Sign->Verified =
false;
226 Sign->Signature = SProc();
233 if (Sign->Signature ==
nullptr)
239 QString::fromStdString(PluginFilename).startsWith(QString::fromStdString(Sign->Signature->ID));
244 Sign->LinkUID = LinkUIDProc();
314 virtual std::string getPluginFullPath(
const std::string& Filename)
const = 0;
325 virtual std::vector<std::string> getPluginsSearchPaths()
const = 0;
336 virtual std::string getPluginFilenameSuffix()
const = 0;
351 PluginsSearchResults SearchResults;
352 std::vector<std::string> PluginsPaths = getPluginsSearchPaths();
353 std::vector<std::string> PluginFiles;
354 std::vector<std::string> TmpFiles;
358 for (i=0;i<PluginsPaths.size();i++)
361 getPluginFilenameSuffix(),
362 openfluid::config::PLUGINS_EXT,
false,
true);
364 for (j=0;j<TmpFiles.size();j++)
366 PluginFiles.push_back(TmpFiles[j]);
371 SignatureType* CurrentPlug =
nullptr;
373 for (i=0;i<PluginFiles.size();i++)
377 CurrentPlug = getWareSignature(PluginFiles[i]);
379 if (CurrentPlug && CurrentPlug->Verified)
383 SearchResults.AvailablePlugins.push_back(CurrentPlug);
387 SearchResults.AvailablePlugins.push_back(CurrentPlug);
397 return SearchResults;
412 ItemType* WareItem = buildWareContainerWithSignatureOnly(ID);
414 if (WareItem !=
nullptr && WareItem->Verified)
433 std::string PluginFullPath = WareItem->FileFullPath;
435 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
438 if (PlugLib && PlugLib->load())
445 WareItem->Body.reset(BProc());
447 if (WareItem->Body ==
nullptr)
450 "Ware from plugin file " + PluginFullPath +
451 " cannot be instanciated");
458 "Format error in plugin file " + PluginFullPath);
464 "Unable to find plugin file " + PluginFullPath);
478 for (
auto it=m_LoadedPluginsLibraries.begin();it != m_LoadedPluginsLibraries.end(); ++it)
480 it->second.get()->unload();
483 m_LoadedPluginsLibraries.clear();
int OPENFLUID_API compareVersions(const std::string &VersionA, const std::string &VersionB, bool Strict=true)
void completeSignatureWithWareBody(ItemType *WareItem)
Definition: WarePluginsManager.hpp:431
Definition: WarePluginsManager.hpp:80
std::vector< std::string > OPENFLUID_API findFilesBySuffixAndExtension(const std::string &Path, const std::string &Suffix, const std::string &Ext, bool WithPath=false, bool ExtIncludeDot=false)
#define OPENFLUID_API
Definition: dllexport.hpp:86
#define WARESIGNATURE_PROC_NAME
Definition: PluggableWare.hpp:62
ExceptionContext & addInfos(const std::map< std::string, std::string > &Infos)
Definition: ExceptionContext.hpp:70
std::map< std::string, std::unique_ptr< QLibrary > > m_LoadedPluginsLibraries
Definition: WarePluginsManager.hpp:272
Definition: ApplicationException.hpp:47
#define WAREBODY_PROC_NAME
Definition: PluggableWare.hpp:56
std::map< std::string, std::string > ErroredFiles
Definition: WarePluginsManager.hpp:295
bool OPENFLUID_API matchWithWildcard(const std::string &Pattern, const std::string &Str)
Definition: FrameworkException.hpp:50
const ExceptionContext getContext() const
Definition: Exception.hpp:121
std::vector< SignatureType * > AvailablePlugins
Definition: WarePluginsManager.hpp:293
#define WARELINKUID_PROC_NAME
Definition: PluggableWare.hpp:75
std::string(* GetWareLinkUIDProc)()
Definition: WarePluginsManager.hpp:65
const std::string getMessage() const
Definition: Exception.hpp:101
virtual ~WarePluginsManager()
Definition: WarePluginsManager.hpp:299
void unloadAllWares()
Definition: WarePluginsManager.hpp:476
#define WAREABIVERSION_PROC_NAME
Definition: PluggableWare.hpp:68
Definition: ExceptionContext.hpp:53
Definition: WarePluginsManager.hpp:289
WarePluginsManager()
Definition: WarePluginsManager.hpp:277
std::string(* GetWareABIVersionProc)()
Definition: WarePluginsManager.hpp:63
PluginsSearchResults getAvailableWaresSignatures(const std::string &Pattern="")
Definition: WarePluginsManager.hpp:349
static ExceptionContext computeContext()
Definition: FrameworkException.hpp:101
ItemType * loadWareSignatureOnly(const std::string &ID)
Definition: WarePluginsManager.hpp:410