40 #ifndef __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__ 41 #define __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__ 56 #include <openfluid/config.hpp> 78 template<
class SignatureType,
class ItemType,
typename SignatureProc,
typename BodyProc>
83 QLibrary* loadPluginLibrary(
const std::string& FullFilePath)
85 std::string PluginFileName = QFileInfo(QString::fromStdString(FullFilePath)).fileName().toStdString();
87 if (m_LoadedPluginsLibraries.find(PluginFileName) == m_LoadedPluginsLibraries.end())
89 m_LoadedPluginsLibraries[PluginFileName].reset(
new QLibrary(QString::fromStdString(FullFilePath)));
92 return m_LoadedPluginsLibraries[PluginFileName].get();
100 ItemType* buildWareContainerWithSignatureOnly(
const std::string& ID)
102 std::string PluginFilename = ID+getPluginFilenameSuffix()+openfluid::config::PLUGINS_EXT;
103 std::string PluginFullPath = getPluginFullPath(PluginFilename);
104 ItemType* WareItem =
nullptr;
106 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
109 if (PlugLib && PlugLib->load())
111 WareItem =
new ItemType();
112 WareItem->FileFullPath = PluginFullPath;
121 else WareItem->Verified =
false;
124 if (WareItem->Verified)
132 WareItem->Signature = SProc();
134 if (WareItem->Signature ==
nullptr)
136 "Signature from plugin file " + PluginFilename +
137 " cannot be instanciated");
139 WareItem->Verified = (WareItem->Signature->ID == ID);
146 WareItem->LinkUID = LinkUIDProc();
150 "Format error in plugin file " + PluginFilename);
154 "Compatibility version mismatch for plugin file " + PluginFilename);
158 "Unable to load plugin from file " + PluginFilename);
168 SignatureType* getWareSignature(
const std::string& PluginFilename)
170 std::string PluginFullPath = getPluginFullPath(PluginFilename);
171 SignatureType* Sign =
nullptr;
175 .
addInfos({{
"pluginfullpath",PluginFullPath},{
"pluginfilename",PluginFilename}});
178 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
185 Sign =
new SignatureType();
186 Sign->FileFullPath = PluginFullPath;
195 else Sign->Verified =
false;
208 Sign->Signature = SProc();
215 if (Sign->Signature ==
nullptr)
219 QString::fromStdString(PluginFilename).startsWith(QString::fromStdString(Sign->Signature->ID));
224 Sign->LinkUID = LinkUIDProc();
283 virtual std::string getPluginFullPath(
const std::string& Filename)
const = 0;
290 virtual std::vector<std::string> getPluginsSearchPaths()
const = 0;
297 virtual std::string getPluginFilenameSuffix()
const = 0;
309 PluginsSearchResults SearchResults;
310 std::vector<std::string> PluginsPaths = getPluginsSearchPaths();
311 std::vector<std::string> PluginFiles;
312 std::vector<std::string> TmpFiles;
316 for (i=0;i<PluginsPaths.size();i++)
319 getPluginFilenameSuffix(),
320 openfluid::config::PLUGINS_EXT,
false,
true);
322 for (j=0;j<TmpFiles.size();j++)
323 PluginFiles.push_back(TmpFiles[j]);
327 SignatureType* CurrentPlug =
nullptr;
329 for (i=0;i<PluginFiles.size();i++)
333 CurrentPlug = getWareSignature(PluginFiles[i]);
335 if (CurrentPlug && CurrentPlug->Verified)
338 SearchResults.AvailablePlugins.push_back(CurrentPlug);
340 SearchResults.AvailablePlugins.push_back(CurrentPlug);
349 return SearchResults;
359 ItemType* WareItem = buildWareContainerWithSignatureOnly(ID);
361 if (WareItem !=
nullptr && WareItem->Verified)
374 std::string PluginFullPath = WareItem->FileFullPath;
376 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
379 if (PlugLib && PlugLib->load())
386 WareItem->Body.reset(BProc());
388 if (WareItem->Body ==
nullptr)
390 "Ware from plugin file " + PluginFullPath +
391 " cannot be instanciated");
395 "Format error in plugin file " + PluginFullPath);
398 "Unable to find plugin file " + PluginFullPath);
408 for (
auto it=m_LoadedPluginsLibraries.begin();it != m_LoadedPluginsLibraries.end(); ++it)
409 it->second.get()->unload();
411 m_LoadedPluginsLibraries.clear();
std::vector< SignatureType * > AvailablePlugins
Definition: WarePluginsManager.hpp:267
void unloadAllWares()
Definition: WarePluginsManager.hpp:406
bool OPENFLUID_API matchWithWildcard(const std::string &Pattern, const std::string &Str)
ExceptionContext & addInfos(const std::map< std::string, std::string > &Infos)
Definition: ExceptionContext.hpp:69
Definition: WarePluginsManager.hpp:263
Definition: FrameworkException.hpp:50
std::map< std::string, std::string > ErroredFiles
Definition: WarePluginsManager.hpp:269
static ExceptionContext computeContext()
Definition: FrameworkException.hpp:89
std::map< std::string, std::unique_ptr< QLibrary > > m_LoadedPluginsLibraries
Definition: WarePluginsManager.hpp:248
#define WARESIGNATURE_PROC_NAME
Definition: PluggableWare.hpp:62
ItemType * loadWareSignatureOnly(const std::string &ID)
Definition: WarePluginsManager.hpp:357
const std::string getMessage() const
Definition: Exception.hpp:97
#define WAREABIVERSION_PROC_NAME
Definition: PluggableWare.hpp:68
const ExceptionContext getContext() const
Definition: Exception.hpp:115
WarePluginsManager()
Definition: WarePluginsManager.hpp:251
Definition: WarePluginsManager.hpp:79
#define OPENFLUID_API
Definition: dllexport.hpp:87
int OPENFLUID_API compareVersions(const std::string &VersionA, const std::string &VersionB, bool Strict=true)
std::string(* GetWareABIVersionProc)()
Definition: WarePluginsManager.hpp:62
#define WARELINKUID_PROC_NAME
Definition: PluggableWare.hpp:75
virtual ~WarePluginsManager()
Definition: WarePluginsManager.hpp:273
Definition: ExceptionContext.hpp:53
std::string(* GetWareLinkUIDProc)()
Definition: WarePluginsManager.hpp:64
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 WAREBODY_PROC_NAME
Definition: PluggableWare.hpp:56
void completeSignatureWithWareBody(ItemType *WareItem)
Definition: WarePluginsManager.hpp:372
PluginsSearchResults getAvailableWaresSignatures(const std::string &Pattern="")
Definition: WarePluginsManager.hpp:307
Definition: ApplicationException.hpp:47