40 #ifndef __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__ 41 #define __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__ 58 #include <openfluid/config.hpp> 80 template<
class SignatureInstanceType,
class ItemInstanceType,
typename SignatureProc,
typename BodyProc>
91 QLibrary* loadPluginLibrary(
const std::string& FullFilePath)
93 std::string PluginFileName = QFileInfo(QString::fromStdString(FullFilePath)).fileName().toStdString();
95 if (m_LoadedPluginsLibraries.find(PluginFileName) == m_LoadedPluginsLibraries.end())
97 m_LoadedPluginsLibraries[PluginFileName] = std::make_unique<QLibrary>(QString::fromStdString(FullFilePath));
100 return m_LoadedPluginsLibraries[PluginFileName].get();
108 ItemInstanceType* buildWareContainerWithSignatureOnly(
const std::string& ID)
110 std::string PluginFilename = ID+getPluginFilenameSuffix()+openfluid::config::PLUGINS_EXT;
111 std::string PluginFullPath = getPluginFullPath(PluginFilename);
112 ItemInstanceType* WareItem =
nullptr;
114 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
117 if (PlugLib && PlugLib->load())
119 WareItem =
new ItemInstanceType();
120 WareItem->FileFullPath = PluginFullPath;
131 WareItem->Verified =
false;
135 if (WareItem->Verified)
143 WareItem->Signature = SProc();
145 if (WareItem->Signature ==
nullptr)
148 "Signature from plugin file " + PluginFilename +
149 " cannot be instanciated");
152 WareItem->Verified = (WareItem->Signature->ID == ID);
160 WareItem->LinkUID = LinkUIDProc();
166 "Format error in plugin file " + PluginFilename);
172 "Compatibility version mismatch for plugin file " + PluginFilename);
178 "Unable to load plugin from file " + PluginFilename);
189 SignatureInstanceType* getWareSignature(
const std::string& PluginFilename)
191 std::string PluginFullPath = getPluginFullPath(PluginFilename);
192 SignatureInstanceType* Sign =
nullptr;
196 .
addInfos({{
"pluginfullpath",PluginFullPath},{
"pluginfilename",PluginFilename}});
199 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
206 Sign =
new SignatureInstanceType();
207 Sign->FileFullPath = PluginFullPath;
218 Sign->Verified =
false;
231 Sign->Signature = SProc();
238 if (Sign->Signature ==
nullptr)
244 QString::fromStdString(PluginFilename).startsWith(QString::fromStdString(Sign->Signature->ID));
250 Sign->LinkUID = LinkUIDProc();
313 virtual std::string getPluginFullPath(
const std::string& Filename)
const = 0;
324 virtual std::vector<std::string> getPluginsSearchPaths()
const = 0;
335 virtual std::string getPluginFilenameSuffix()
const = 0;
350 PluginsSearchResults SearchResults;
351 std::vector<std::string> PluginsPaths = getPluginsSearchPaths();
352 std::vector<std::string> PluginFiles;
353 std::vector<std::string> TmpFiles;
357 for (i=0;i<PluginsPaths.size();i++)
360 getPluginFilenameSuffix(),
361 openfluid::config::PLUGINS_EXT,
false,
true);
363 for (j=0;j<TmpFiles.size();j++)
365 PluginFiles.push_back(TmpFiles[j]);
370 SignatureInstanceType* CurrentPlug =
nullptr;
372 for (i=0;i<PluginFiles.size();i++)
376 CurrentPlug = getWareSignature(PluginFiles[i]);
378 if (CurrentPlug && CurrentPlug->Verified)
396 return SearchResults;
411 ItemInstanceType* WareItem = buildWareContainerWithSignatureOnly(ID);
413 if (WareItem !=
nullptr && WareItem->Verified)
432 std::string PluginFullPath = WareItem->FileFullPath;
434 QLibrary* PlugLib = loadPluginLibrary(PluginFullPath);
437 if (PlugLib && PlugLib->load())
444 WareItem->Body.reset(BProc());
446 if (WareItem->Body ==
nullptr)
449 "Ware from plugin file " + PluginFullPath +
450 " cannot be instanciated");
457 "Format error in plugin file " + PluginFullPath);
463 "Unable to find plugin file " + PluginFullPath);
477 for (
auto it=m_LoadedPluginsLibraries.begin();it != m_LoadedPluginsLibraries.end(); ++it)
479 it->second.get()->unload();
482 m_LoadedPluginsLibraries.clear();
void appendErrored(const std::string &Path, const std::string &Message)
Definition: WarePluginsSearchResults.hpp:95
Definition: WarePluginsManager.hpp:81
#define WARESIGNATURE_PROC_NAME
Definition: PluggableWare.hpp:62
Definition: ApplicationException.hpp:47
void completeSignatureWithWareBody(ItemInstanceType *WareItem)
Definition: WarePluginsManager.hpp:430
WarePluginsManager()
Definition: WarePluginsManager.hpp:284
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)
static ExceptionContext computeContext()
Definition: FrameworkException.hpp:101
Definition: FrameworkException.hpp:50
const std::string getMessage() const
Definition: Exception.hpp:101
WarePluginsSearchResults< SignatureInstanceType > PluginsSearchResults
Definition: WarePluginsManager.hpp:296
ItemInstanceType * loadWareSignatureOnly(const std::string &ID)
Definition: WarePluginsManager.hpp:409
Definition: WarePluginsSearchResults.hpp:57
std::string(* GetWareLinkUIDProc)()
Definition: WarePluginsManager.hpp:66
std::string(* GetWareABIVersionProc)()
Definition: WarePluginsManager.hpp:64
#define WAREABIVERSION_PROC_NAME
Definition: PluggableWare.hpp:68
const ExceptionContext getContext() const
Definition: Exception.hpp:121
virtual ~WarePluginsManager()
Definition: WarePluginsManager.hpp:298
void unloadAllWares()
Definition: WarePluginsManager.hpp:475
PluginsSearchResults getAvailableWaresSignatures(const std::string &Pattern="")
Definition: WarePluginsManager.hpp:348
void appendAvailable(SignatureInstanceType *Item)
Definition: WarePluginsSearchResults.hpp:84
#define OPENFLUID_API
Definition: dllexport.hpp:86
Definition: ExceptionContext.hpp:53
int OPENFLUID_API compareVersions(const std::string &VersionA, const std::string &VersionB, bool Strict=true)
ExceptionContext & addInfos(const std::map< std::string, std::string > &Infos)
Definition: ExceptionContext.hpp:70
#define WAREBODY_PROC_NAME
Definition: PluggableWare.hpp:56
bool OPENFLUID_API matchWithWildcard(const std::string &Pattern, const std::string &Str)
std::map< std::string, std::unique_ptr< QLibrary > > m_LoadedPluginsLibraries
Definition: WarePluginsManager.hpp:279
#define WARELINKUID_PROC_NAME
Definition: PluggableWare.hpp:75