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)
147 "Signature from plugin file " + PluginFilename +
148 " cannot be instanciated");
151 WareItem->Verified = (WareItem->Signature->ID == ID);
159 WareItem->LinkUID = LinkUIDProc();
165 "Format error in plugin file " + PluginFilename);
171 "Compatibility version mismatch for plugin file " + PluginFilename);
177 "Unable to load plugin from file " + PluginFilename);
188 SignatureType* getWareSignature(
const std::string& PluginFilename)
190 std::string PluginFullPath = getPluginFullPath(PluginFilename);
191 SignatureType* Sign =
nullptr;
195 .
addInfos({{
"pluginfullpath",PluginFullPath},{
"pluginfilename",PluginFilename}});
198 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
205 Sign =
new SignatureType();
206 Sign->FileFullPath = PluginFullPath;
217 Sign->Verified =
false;
230 Sign->Signature = SProc();
237 if (Sign->Signature ==
nullptr)
243 QString::fromStdString(PluginFilename).startsWith(QString::fromStdString(Sign->Signature->ID));
249 Sign->LinkUID = LinkUIDProc();
320 virtual std::string getPluginFullPath(
const std::string& Filename)
const = 0;
331 virtual std::vector<std::string> getPluginsSearchPaths()
const = 0;
342 virtual std::string getPluginFilenameSuffix()
const = 0;
357 PluginsSearchResults SearchResults;
358 std::vector<std::string> PluginsPaths = getPluginsSearchPaths();
359 std::vector<std::string> PluginFiles;
360 std::vector<std::string> TmpFiles;
364 for (i=0;i<PluginsPaths.size();i++)
367 getPluginFilenameSuffix(),
368 openfluid::config::PLUGINS_EXT,
false,
true);
370 for (j=0;j<TmpFiles.size();j++)
372 PluginFiles.push_back(TmpFiles[j]);
377 SignatureType* CurrentPlug =
nullptr;
379 for (i=0;i<PluginFiles.size();i++)
383 CurrentPlug = getWareSignature(PluginFiles[i]);
385 if (CurrentPlug && CurrentPlug->Verified)
389 SearchResults.AvailablePlugins.push_back(CurrentPlug);
393 SearchResults.AvailablePlugins.push_back(CurrentPlug);
403 return SearchResults;
418 ItemType* WareItem = buildWareContainerWithSignatureOnly(ID);
420 if (WareItem !=
nullptr && WareItem->Verified)
439 std::string PluginFullPath = WareItem->FileFullPath;
441 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
444 if (PlugLib && PlugLib->load())
451 WareItem->Body.reset(BProc());
453 if (WareItem->Body ==
nullptr)
456 "Ware from plugin file " + PluginFullPath +
457 " cannot be instanciated");
464 "Format error in plugin file " + PluginFullPath);
470 "Unable to find plugin file " + PluginFullPath);
484 for (
auto it=m_LoadedPluginsLibraries.begin();it != m_LoadedPluginsLibraries.end(); ++it)
486 it->second.get()->unload();
489 m_LoadedPluginsLibraries.clear();
ItemType * loadWareSignatureOnly(const std::string &ID)
Definition: WarePluginsManager.hpp:416
std::map< std::string, std::unique_ptr< QLibrary > > m_LoadedPluginsLibraries
Definition: WarePluginsManager.hpp:278
Definition: ExceptionContext.hpp:53
#define WAREBODY_PROC_NAME
Definition: PluggableWare.hpp:56
virtual ~WarePluginsManager()
Definition: WarePluginsManager.hpp:305
bool OPENFLUID_API matchWithWildcard(const std::string &Pattern, const std::string &Str)
std::string(* GetWareABIVersionProc)()
Definition: WarePluginsManager.hpp:63
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)
ExceptionContext & addInfos(const std::map< std::string, std::string > &Infos)
Definition: ExceptionContext.hpp:70
Definition: FrameworkException.hpp:50
PluginsSearchResults getAvailableWaresSignatures(const std::string &Pattern="")
Definition: WarePluginsManager.hpp:355
const std::string getMessage() const
Definition: Exception.hpp:101
#define WARESIGNATURE_PROC_NAME
Definition: PluggableWare.hpp:62
Definition: WarePluginsManager.hpp:295
Definition: ApplicationException.hpp:47
#define WAREABIVERSION_PROC_NAME
Definition: PluggableWare.hpp:68
std::string(* GetWareLinkUIDProc)()
Definition: WarePluginsManager.hpp:65
std::map< std::string, std::string > ErroredFiles
Definition: WarePluginsManager.hpp:301
#define WARELINKUID_PROC_NAME
Definition: PluggableWare.hpp:75
const ExceptionContext getContext() const
Definition: Exception.hpp:121
int OPENFLUID_API compareVersions(const std::string &VersionA, const std::string &VersionB, bool Strict=true)
void completeSignatureWithWareBody(ItemType *WareItem)
Definition: WarePluginsManager.hpp:437
#define OPENFLUID_API
Definition: dllexport.hpp:86
void unloadAllWares()
Definition: WarePluginsManager.hpp:482
WarePluginsManager()
Definition: WarePluginsManager.hpp:283
std::vector< SignatureType * > AvailablePlugins
Definition: WarePluginsManager.hpp:299
static ExceptionContext computeContext()
Definition: FrameworkException.hpp:101