X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FConfig%2FConfig_ModuleReader.cpp;h=21925af599b1b91fca64131371d931ed98ad6443;hb=7bf19255421b34594c7b0a76d0ce28166d0ce895;hp=c533e3e3e92b69565f2a5494ee1bbdb9aeaef5d6;hpb=503b5444d4a5fa95a3046a754f69f5b79e677e33;p=modules%2Fshaper.git diff --git a/src/Config/Config_ModuleReader.cpp b/src/Config/Config_ModuleReader.cpp index c533e3e3e..21925af59 100644 --- a/src/Config/Config_ModuleReader.cpp +++ b/src/Config/Config_ModuleReader.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + /* * Config_ModuleReader.cpp * @@ -14,6 +16,9 @@ #include #include +// Have to be included before std headers +#include + //Necessary for cerr #include @@ -23,8 +28,11 @@ #include #endif +std::map Config_ModuleReader::myPluginTypes; + Config_ModuleReader::Config_ModuleReader(const char* theEventGenerated) - : Config_XMLReader("plugins.xml"), myEventGenerated(theEventGenerated) + : Config_XMLReader(PLUGIN_FILE), + myEventGenerated(theEventGenerated) { } @@ -55,9 +63,12 @@ void Config_ModuleReader::processNode(xmlNodePtr theNode) if (isNode(theNode, NODE_PLUGIN, NULL)) { std::string aPluginConf = getProperty(theNode, PLUGIN_CONFIG); std::string aPluginLibrary = getProperty(theNode, PLUGIN_LIBRARY); - std::list aFeatures = importPlugin(aPluginLibrary, aPluginConf); + std::string aPluginScript = getProperty(theNode, PLUGIN_SCRIPT); + std::string aPluginName = addPlugin(aPluginLibrary, aPluginScript, aPluginConf); + + std::list aFeatures = importPlugin(aPluginName, aPluginConf); std::list::iterator it = aFeatures.begin(); - for(; it != aFeatures.end(); it++) { + for (; it != aFeatures.end(); it++) { myFeaturesInFiles[*it] = aPluginConf; } } @@ -69,19 +80,87 @@ bool Config_ModuleReader::processChildren(xmlNodePtr theNode) } std::list Config_ModuleReader::importPlugin(const std::string& thePluginLibrary, - const std::string& thePluginFile) + const std::string& thePluginXmlConf) { - if (thePluginFile.empty()) { //probably a third party library + if (thePluginXmlConf.empty()) { //probably a third party library loadLibrary(thePluginLibrary); return std::list(); } - Config_FeatureReader aReader = Config_FeatureReader(thePluginFile, thePluginLibrary, + Config_FeatureReader aReader = Config_FeatureReader(thePluginXmlConf, + thePluginLibrary, myEventGenerated); aReader.readAll(); return aReader.features(); } +std::string Config_ModuleReader::addPlugin(const std::string& aPluginLibrary, + const std::string& aPluginScript, + const std::string& aPluginConf) +{ + PluginType aType = Config_ModuleReader::Binary; + std::string aPluginName; + if (!aPluginLibrary.empty()) { + aPluginName = aPluginLibrary; + if (aPluginConf.empty()) { + aType = Config_ModuleReader::Intrenal; + } + } else if (!aPluginScript.empty()) { + aPluginName = aPluginScript; + aType = Config_ModuleReader::Python; + } + if(!aPluginName.empty()) { + myPluginTypes[aPluginName] = aType; + + } + return aPluginName; +} + +void Config_ModuleReader::loadPlugin(const std::string thePluginName) +{ + PluginType aType = Config_ModuleReader::Binary; + if(myPluginTypes.find(thePluginName) != myPluginTypes.end()) { + aType = myPluginTypes.at(thePluginName); + } + switch (aType) { + case Config_ModuleReader::Python: + loadScript(thePluginName); + break; + case Config_ModuleReader::Binary: + case Config_ModuleReader::Intrenal: + default: + loadLibrary(thePluginName); + break; + } +} + +void Config_ModuleReader::loadScript(const std::string theFileName) +{ + /* aquire python thread */ + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject* module = PyImport_ImportModule(theFileName.c_str()); + + if (!module) { + std::string anErrorMsg = "An error occured while importing " + theFileName; + //Get detailed error message: + if (PyErr_Occurred()) { + PyObject *ptype, *pvalue, *ptraceback; + PyErr_Fetch(&ptype, &pvalue, &ptraceback); + std::string aPyError = std::string(PyString_AsString(pvalue)); + if (!aPyError.empty()) { + anErrorMsg += ":\n" + aPyError; + } + Py_XDECREF(ptype); + Py_XDECREF(pvalue); + Py_XDECREF(ptraceback); + } + Events_Error::send(anErrorMsg); + } + + /* release python thread */ + PyGILState_Release(gstate); +} + void Config_ModuleReader::loadLibrary(const std::string theLibName) { std::string aFileName = library(theLibName); @@ -90,16 +169,15 @@ void Config_ModuleReader::loadLibrary(const std::string theLibName) #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 + if(!aModLib && theLibName != "DFBrowser") { // don't show error for internal debugging tool + std::string anErrorMsg = "Failed to load " + aFileName; + #ifndef WIN32 + anErrorMsg += ": " + std::string(dlerror()); + #endif + Events_Error::send(anErrorMsg); + } }