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