X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FConfig%2FConfig_ModuleReader.cpp;h=c533e3e3e92b69565f2a5494ee1bbdb9aeaef5d6;hb=2b4f4bf278c841500eb29bb5d204690427b0d56b;hp=5b536141da5370dcf4f2882ce10231dcfdd4d42c;hpb=2a0dd5ede9110d423fbd6b038c0445cb819163a9;p=modules%2Fshaper.git diff --git a/src/Config/Config_ModuleReader.cpp b/src/Config/Config_ModuleReader.cpp index 5b536141d..c533e3e3e 100644 --- a/src/Config/Config_ModuleReader.cpp +++ b/src/Config/Config_ModuleReader.cpp @@ -5,28 +5,26 @@ * Author: sbh */ +#include +#include #include #include +#include -#include -#include +#include +#include -#ifdef _DEBUG +//Necessary for cerr #include -#endif - -//Hardcoded xml entities -// * Nodes -const static char* NODE_PLUGIN = "plugin"; -const static char* NODE_PLUGINS = "plugins"; -// * Properties -const static char* PLUGINS_MODULE = "module"; -const static char* PLUGIN_CONFIG = "configuration"; -const static char* PLUGIN_LIBRARY = "library"; +#ifdef WIN32 +#include +#else +#include +#endif -Config_ModuleReader::Config_ModuleReader() - : Config_XMLReader("plugins.xml"), m_isAutoImport(false) +Config_ModuleReader::Config_ModuleReader(const char* theEventGenerated) + : Config_XMLReader("plugins.xml"), myEventGenerated(theEventGenerated) { } @@ -34,6 +32,11 @@ Config_ModuleReader::~Config_ModuleReader() { } +const std::map& Config_ModuleReader::featuresInFiles() const +{ + return myFeaturesInFiles; +} + /* * Get module name from plugins.xml * (property "module") @@ -50,10 +53,13 @@ std::string Config_ModuleReader::getModuleName() void Config_ModuleReader::processNode(xmlNodePtr theNode) { if (isNode(theNode, NODE_PLUGIN, NULL)) { - std::string aPluginName = getProperty(theNode, PLUGIN_CONFIG); - if (m_isAutoImport) - importPlugin(aPluginName); - m_pluginsList.push_back(aPluginName); + std::string aPluginConf = getProperty(theNode, PLUGIN_CONFIG); + std::string aPluginLibrary = getProperty(theNode, PLUGIN_LIBRARY); + std::list aFeatures = importPlugin(aPluginLibrary, aPluginConf); + std::list::iterator it = aFeatures.begin(); + for(; it != aFeatures.end(); it++) { + myFeaturesInFiles[*it] = aPluginConf; + } } } @@ -62,18 +68,38 @@ bool Config_ModuleReader::processChildren(xmlNodePtr theNode) return isNode(theNode, NODE_PLUGINS, NULL); } -void Config_ModuleReader::importPlugin(const std::string& thePluginName) +std::list Config_ModuleReader::importPlugin(const std::string& thePluginLibrary, + const std::string& thePluginFile) { - Config_FeatureReader aReader(thePluginName); + if (thePluginFile.empty()) { //probably a third party library + loadLibrary(thePluginLibrary); + return std::list(); + } + + Config_FeatureReader aReader = Config_FeatureReader(thePluginFile, thePluginLibrary, + myEventGenerated); aReader.readAll(); + return aReader.features(); } -void Config_ModuleReader::setAutoImport(bool enabled) +void Config_ModuleReader::loadLibrary(const std::string theLibName) { - m_isAutoImport = enabled; -} + std::string aFileName = library(theLibName); + if (aFileName.empty()) + return; -const std::list& Config_ModuleReader::pluginsList() const -{ - return m_pluginsList; +#ifdef WIN32 + HINSTANCE aModLib = ::LoadLibrary(aFileName.c_str()); + if (!aModLib) { + std::string errorMsg = "Failed to load " + aFileName; + std::cerr << errorMsg << std::endl; + Events_Error::send(errorMsg); + } +#else + void* aModLib = dlopen( aFileName.c_str(), RTLD_LAZY | RTLD_GLOBAL ); + if ( !aModLib ) { + std::cerr << "Failed to load " << aFileName.c_str() << std::endl; + } +#endif } +