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>
84 QLibrary* loadPluginLibrary(
const std::string& FullFilePath)
86 std::string PluginFileName = QFileInfo(QString::fromStdString(FullFilePath)).fileName().toStdString();
88 if (m_LoadedPluginsLibraries.find(PluginFileName) == m_LoadedPluginsLibraries.end())
90 m_LoadedPluginsLibraries[PluginFileName] = std::make_unique<QLibrary>(QString::fromStdString(FullFilePath));
93 return m_LoadedPluginsLibraries[PluginFileName].get();
101 ItemType* buildWareContainerWithSignatureOnly(
const std::string& ID)
103 std::string PluginFilename = ID+getPluginFilenameSuffix()+openfluid::config::PLUGINS_EXT;
104 std::string PluginFullPath = getPluginFullPath(PluginFilename);
105 ItemType* WareItem =
nullptr;
107 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
110 if (PlugLib && PlugLib->load())
112 WareItem =
new ItemType();
113 WareItem->FileFullPath = PluginFullPath;
124 WareItem->Verified =
false;
128 if (WareItem->Verified)
136 WareItem->Signature = SProc();
138 if (WareItem->Signature ==
nullptr)
140 "Signature from plugin file " + PluginFilename +
141 " cannot be instanciated");
143 WareItem->Verified = (WareItem->Signature->ID == ID);
150 WareItem->LinkUID = LinkUIDProc();
155 "Format error in plugin file " + PluginFilename);
161 "Compatibility version mismatch for plugin file " + PluginFilename);
167 "Unable to load plugin from file " + PluginFilename);
178 SignatureType* getWareSignature(
const std::string& PluginFilename)
180 std::string PluginFullPath = getPluginFullPath(PluginFilename);
181 SignatureType* Sign =
nullptr;
185 .
addInfos({{
"pluginfullpath",PluginFullPath},{
"pluginfilename",PluginFilename}});
188 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
195 Sign =
new SignatureType();
196 Sign->FileFullPath = PluginFullPath;
207 Sign->Verified =
false;
220 Sign->Signature = SProc();
227 if (Sign->Signature ==
nullptr)
233 QString::fromStdString(PluginFilename).startsWith(QString::fromStdString(Sign->Signature->ID));
238 Sign->LinkUID = LinkUIDProc();
301 virtual std::string getPluginFullPath(
const std::string& Filename)
const = 0;
308 virtual std::vector<std::string> getPluginsSearchPaths()
const = 0;
315 virtual std::string getPluginFilenameSuffix()
const = 0;
327 PluginsSearchResults SearchResults;
328 std::vector<std::string> PluginsPaths = getPluginsSearchPaths();
329 std::vector<std::string> PluginFiles;
330 std::vector<std::string> TmpFiles;
334 for (i=0;i<PluginsPaths.size();i++)
337 getPluginFilenameSuffix(),
338 openfluid::config::PLUGINS_EXT,
false,
true);
340 for (j=0;j<TmpFiles.size();j++)
341 PluginFiles.push_back(TmpFiles[j]);
345 SignatureType* CurrentPlug =
nullptr;
347 for (i=0;i<PluginFiles.size();i++)
351 CurrentPlug = getWareSignature(PluginFiles[i]);
353 if (CurrentPlug && CurrentPlug->Verified)
357 SearchResults.AvailablePlugins.push_back(CurrentPlug);
361 SearchResults.AvailablePlugins.push_back(CurrentPlug);
371 return SearchResults;
381 ItemType* WareItem = buildWareContainerWithSignatureOnly(ID);
383 if (WareItem !=
nullptr && WareItem->Verified)
398 std::string PluginFullPath = WareItem->FileFullPath;
400 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
403 if (PlugLib && PlugLib->load())
410 WareItem->Body.reset(BProc());
412 if (WareItem->Body ==
nullptr)
415 "Ware from plugin file " + PluginFullPath +
416 " cannot be instanciated");
423 "Format error in plugin file " + PluginFullPath);
429 "Unable to find plugin file " + PluginFullPath);
440 for (
auto it=m_LoadedPluginsLibraries.begin();it != m_LoadedPluginsLibraries.end(); ++it)
442 it->second.get()->unload();
445 m_LoadedPluginsLibraries.clear();
std::string(* GetWareABIVersionProc)()
Definition: WarePluginsManager.hpp:63
std::vector< SignatureType * > AvailablePlugins
Definition: WarePluginsManager.hpp:285
Definition: WarePluginsManager.hpp:80
void completeSignatureWithWareBody(ItemType *WareItem)
Definition: WarePluginsManager.hpp:396
std::map< std::string, std::string > ErroredFiles
Definition: WarePluginsManager.hpp:287
#define WAREBODY_PROC_NAME
Definition: PluggableWare.hpp:56
#define WARESIGNATURE_PROC_NAME
Definition: PluggableWare.hpp:62
const ExceptionContext getContext() const
Definition: Exception.hpp:121
#define WARELINKUID_PROC_NAME
Definition: PluggableWare.hpp:75
int OPENFLUID_API compareVersions(const std::string &VersionA, const std::string &VersionB, bool Strict=true)
Definition: ExceptionContext.hpp:53
std::string(* GetWareLinkUIDProc)()
Definition: WarePluginsManager.hpp:65
static ExceptionContext computeContext()
Definition: FrameworkException.hpp:101
ItemType * loadWareSignatureOnly(const std::string &ID)
Definition: WarePluginsManager.hpp:379
const std::string getMessage() const
Definition: Exception.hpp:101
Definition: FrameworkException.hpp:50
Definition: ApplicationException.hpp:47
PluginsSearchResults getAvailableWaresSignatures(const std::string &Pattern="")
Definition: WarePluginsManager.hpp:325
void unloadAllWares()
Definition: WarePluginsManager.hpp:438
#define WAREABIVERSION_PROC_NAME
Definition: PluggableWare.hpp:68
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
std::map< std::string, std::unique_ptr< QLibrary > > m_LoadedPluginsLibraries
Definition: WarePluginsManager.hpp:266
#define OPENFLUID_API
Definition: dllexport.hpp:86
Definition: WarePluginsManager.hpp:281
WarePluginsManager()
Definition: WarePluginsManager.hpp:269
virtual ~WarePluginsManager()
Definition: WarePluginsManager.hpp:291
bool OPENFLUID_API matchWithWildcard(const std::string &Pattern, const std::string &Str)