40 #ifndef __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__
41 #define __OPENFLUID_MACHINE_WAREPLUGINSMANAGER_HPP__
53 #include <openfluid/config.hpp>
56 namespace openfluid {
namespace machine {
75 template<
class S,
class M,
typename SP,
typename BP>
80 QLibrary* loadWare(
const std::string& FullFilePath)
82 std::string PluginFileName = QFileInfo(QString::fromStdString(FullFilePath)).fileName().toStdString();
84 if (m_LoadedPlugins.find(PluginFileName) == m_LoadedPlugins.end())
86 m_LoadedPlugins[PluginFileName] =
new QLibrary(QString::fromStdString(FullFilePath));
89 return m_LoadedPlugins[PluginFileName];
97 M* buildWareContainerWithSignatureOnly(
const std::string& ID)
100 std::string PluginFilename = ID+getPluginFilenameSuffix()+openfluid::config::PLUGINS_EXT;
101 std::string PluginFullPath = getPluginFullPath(PluginFilename);
104 QLibrary* PlugLib = loadWare(PluginFullPath);
107 if (PlugLib && PlugLib->load())
110 Plug->FileFullPath = PluginFullPath;
119 else Plug->Verified =
false;
128 if (SignatureProc && BodyProc)
130 Plug->Signature = SignatureProc();
132 if (Plug->Signature == NULL)
134 "Signature from plugin file " + PluginFilename +
135 " cannot be instanciated");
137 Plug->Verified = (Plug->Signature->ID == ID);
144 Plug->LinkUID = LinkUIDProc();
148 "Format error in plugin file " + PluginFilename);
152 "Compatibility version mismatch for plugin file " + PluginFilename);
156 "Unable to load plugin from file " + PluginFilename);
166 S* getWareSignature(
const std::string& PluginFilename)
168 std::string PluginFullPath = getPluginFullPath(PluginFilename);
173 .
addInfos({{
"pluginfullpath",PluginFullPath},{
"pluginfilename",PluginFilename}});
176 QLibrary* PlugLib = loadWare(PluginFullPath);
184 Plug->FileFullPath = PluginFullPath;
193 else Plug->Verified =
false;
202 if (SignatureProc && BodyProc)
206 Plug->Signature = SignatureProc();
213 if (Plug->Signature == NULL)
217 QString::fromStdString(PluginFilename).startsWith(QString::fromStdString(Plug->Signature->ID));
222 Plug->LinkUID = LinkUIDProc();
280 virtual std::string getPluginFullPath(
const std::string& Filename)
const = 0;
287 virtual std::vector<std::string> getPluginsSearchPaths()
const = 0;
294 virtual std::string getPluginFilenameSuffix()
const = 0;
306 PluginsSearchResults SearchResults;
307 std::vector<std::string> PluginsPaths = getPluginsSearchPaths();
308 std::vector<std::string> PluginFiles;
309 std::vector<std::string> TmpFiles;
313 for (i=0;i<PluginsPaths.size();i++)
316 getPluginFilenameSuffix(),
317 openfluid::config::PLUGINS_EXT,
false,
true);
318 for (j=0;j<TmpFiles.size();j++)
319 PluginFiles.push_back(TmpFiles[j]);
323 S* CurrentPlug = NULL;
325 for (i=0;i<PluginFiles.size();i++)
329 CurrentPlug = getWareSignature(PluginFiles[i]);
336 if (CurrentPlug != NULL && CurrentPlug->Verified)
341 SearchResults.AvailablePlugins.push_back(CurrentPlug);
343 else SearchResults.AvailablePlugins.push_back(CurrentPlug);
347 return SearchResults;
357 M* Plug = buildWareContainerWithSignatureOnly(ID);
359 if (Plug != NULL && Plug->Verified)
return Plug;
371 std::string PluginFullPath = Item->FileFullPath;
373 QLibrary* PlugLib = loadWare(PluginFullPath);
376 if (PlugLib && PlugLib->load())
383 Item->Body = BodyProc();
385 if (Item->Body == NULL)
387 "Ware from plugin file " + PluginFullPath +
388 " cannot be instanciated");
392 "Format error in plugin file " + PluginFullPath);
395 "Unable to find plugin file " + PluginFullPath);
405 std::map<std::string,QLibrary*>::iterator it;
407 for (it=m_LoadedPlugins.begin();it != m_LoadedPlugins.end(); ++it)
409 it->second->unload();
413 m_LoadedPlugins.clear();
WarePluginsManager()
Definition: WarePluginsManager.hpp:249
static ExceptionContext computeContext()
Definition: FrameworkException.hpp:89
std::map< std::string, std::string > ErroredFiles
Definition: WarePluginsManager.hpp:266
bool OPENFLUID_API matchWithWildcard(const std::string &Pattern, const std::string &Str)
#define WAREBODY_PROC_NAME
Definition: PluggableWare.hpp:57
std::map< std::string, QLibrary * > m_LoadedPlugins
Definition: WarePluginsManager.hpp:246
#define WAREABIVERSION_PROC_NAME
Definition: PluggableWare.hpp:69
M * loadWareSignatureOnly(const std::string &ID)
Definition: WarePluginsManager.hpp:355
Definition: WarePluginsManager.hpp:261
std::vector< S * > AvailablePlugins
Definition: WarePluginsManager.hpp:264
PluginsSearchResults getAvailableWaresSignatures(const std::string &Pattern="")
Definition: WarePluginsManager.hpp:304
#define WARESIGNATURE_PROC_NAME
Definition: PluggableWare.hpp:63
Definition: FrameworkException.hpp:50
ExceptionContext & addInfos(const std::map< std::string, std::string > &Infos)
Definition: ExceptionContext.hpp:69
const std::string getMessage() const
Definition: Exception.hpp:97
std::string(* GetWareABIVersionProc)()
Definition: WarePluginsManager.hpp:59
Definition: ExceptionContext.hpp:53
void completeSignatureWithWareBody(M *Item)
Definition: WarePluginsManager.hpp:369
#define WARELINKUID_PROC_NAME
Definition: PluggableWare.hpp:76
void unloadAllWares()
Definition: WarePluginsManager.hpp:403
Definition: WarePluginsManager.hpp:76
std::string(* GetWareLinkUIDProc)()
Definition: WarePluginsManager.hpp:61
#define OPENFLUID_API
Definition: dllexport.hpp:87
int OPENFLUID_API compareVersions(const std::string &VersionA, const std::string &VersionB, bool Strict=true)
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)
virtual ~WarePluginsManager()
Definition: WarePluginsManager.hpp:270
const ExceptionContext getContext() const
Definition: Exception.hpp:115