41 #ifndef __WAREPLUGINSMANAGER_HPP__
42 #define __WAREPLUGINSMANAGER_HPP__
53 #include <openfluid/config.hpp>
56 namespace openfluid {
namespace machine {
73 template<
class S,
class M,
typename SP,
typename BP>
78 QLibrary* loadWare(
const std::string& FullFilePath)
80 std::string PluginFileName = QFileInfo(QString::fromStdString(FullFilePath)).fileName().toStdString();
82 if (m_LoadedPlugins.find(PluginFileName) == m_LoadedPlugins.end())
84 m_LoadedPlugins[PluginFileName] =
new QLibrary(QString::fromStdString(FullFilePath));
87 return m_LoadedPlugins[PluginFileName];
95 M* buildWareContainerWithSignatureOnly(
const std::string& ID)
98 std::string PluginFilename = ID+getPluginFilenameSuffix()+openfluid::config::PLUGINS_EXT;
99 std::string PluginFullPath = getPluginFullPath(PluginFilename);
102 QLibrary* PlugLib = loadWare(PluginFullPath);
108 Plug->FileFullPath = PluginFullPath;
116 else Plug->Verified =
false;
125 if (SignatureProc && BodyProc)
127 Plug->Signature = SignatureProc();
129 if (Plug->Signature == NULL)
130 throw openfluid::base::FrameworkException(
"WarePluginsManager::buildWareContainerWithSignatureOnly",
"Signature from plugin file " + PluginFilename +
" cannot be instanciated");
132 Plug->Verified = (Plug->Signature->ID == ID);
138 else throw openfluid::base::FrameworkException(
"WarePluginsManager::buildWareContainerWithSignatureOnly",
"Compatibility version mismatch for plugin file " + PluginFilename);
150 S* getWareSignature(
const std::string& PluginFilename)
152 std::string PluginFullPath = getPluginFullPath(PluginFilename);
155 QLibrary* PlugLib = loadWare(PluginFullPath);
161 Plug->FileFullPath = PluginFullPath;
169 else Plug->Verified =
false;
178 if (SignatureProc && BodyProc)
180 Plug->Signature = SignatureProc();
182 if (Plug->Signature == NULL)
185 Plug->Verified = QString::fromStdString(PluginFilename).startsWith(QString::fromStdString(Plug->Signature->ID));
227 virtual std::string getPluginFullPath(
const std::string& Filename) = 0;
234 virtual std::vector<std::string> getPluginsSearchPaths() = 0;
241 virtual std::string getPluginFilenameSuffix() = 0;
253 std::vector<S*> PluginsContainers;
254 std::vector<std::string> PluginsPaths = getPluginsSearchPaths();
255 std::vector<std::string> PluginFiles;
256 std::vector<std::string> TmpFiles;
260 for (i=0;i<PluginsPaths.size();i++)
263 for (j=0;j<TmpFiles.size();j++) PluginFiles.push_back(TmpFiles[j]);
269 for (i=0;i<PluginFiles.size();i++)
271 CurrentPlug = getWareSignature(PluginFiles[i]);
273 if (CurrentPlug != NULL && CurrentPlug->Verified)
278 PluginsContainers.push_back(CurrentPlug);
280 else PluginsContainers.push_back(CurrentPlug);
284 return PluginsContainers;
294 M* Plug = buildWareContainerWithSignatureOnly(ID);
296 if (Plug != NULL && Plug->Verified)
return Plug;
308 std::string PluginFullPath = Item->FileFullPath;
310 QLibrary* PlugLib = loadWare(PluginFullPath);
320 Item->Body = BodyProc();
322 if (Item->Body == NULL)
338 std::map<std::string,QLibrary*>::iterator it;
340 for (it=m_LoadedPlugins.begin();it != m_LoadedPlugins.end(); ++it)
342 it->second->unload();
346 m_LoadedPlugins.clear();
int DLLEXPORT CompareVersions(const std::string &VersionA, const std::string &VersionB, bool Strict=true)
#define WAREABIVERSION_PROC_NAME
Definition: PluggableWare.hpp:71
std::map< std::string, QLibrary * > m_LoadedPlugins
Definition: WarePluginsManager.hpp:202
void completeSignatureWithWareBody(M *Item)
Definition: WarePluginsManager.hpp:306
Definition: FrameworkException.hpp:49
virtual ~WarePluginsManager()
Definition: WarePluginsManager.hpp:217
void unloadAllWares()
Definition: WarePluginsManager.hpp:336
std::string(* GetWareABIVersionProc)()
Definition: WarePluginsManager.hpp:59
#define WARESIGNATURE_PROC_NAME
Definition: PluggableWare.hpp:65
std::vector< std::string > DLLEXPORT GetFilesBySuffixAndExt(const std::string &DirToExplore, const std::string &Suffix, const std::string &Ext, bool WithPath=false, bool ExtIncludeDot=false)
bool DLLEXPORT WildcardMatching(const std::string &Pattern, const std::string &Str)
std::vector< S * > getAvailableWaresSignatures(const std::string Pattern="")
Definition: WarePluginsManager.hpp:251
WarePluginsManager()
Definition: WarePluginsManager.hpp:205
Definition: WarePluginsManager.hpp:74
M * loadWareSignatureOnly(const std::string &ID)
Definition: WarePluginsManager.hpp:292
#define WAREBODY_PROC_NAME
Definition: PluggableWare.hpp:59
#define DLLEXPORT
Definition: dllexport.hpp:51