X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FConfig%2FConfig_ModuleReader.cpp;h=9e8549cdb43bd7d7aea303add9f452ed95bf922c;hb=bdbfb368d71ed11cc0391354a7d86c880cd94949;hp=0b0245c5ad926af7399c7785dd04ed6f654bd65d;hpb=ddb17717eb034ce2e2bc1bf65a1b407693dc1da3;p=modules%2Fshaper.git diff --git a/src/Config/Config_ModuleReader.cpp b/src/Config/Config_ModuleReader.cpp index 0b0245c5a..9e8549cdb 100644 --- a/src/Config/Config_ModuleReader.cpp +++ b/src/Config/Config_ModuleReader.cpp @@ -7,11 +7,13 @@ * Author: sbh */ +#include + #include #include #include #include -#include +#include #include #include @@ -48,7 +50,12 @@ const std::map& Config_ModuleReader::featuresInFiles() return myFeaturesInFiles; } -/* +const std::set& Config_ModuleReader::modulePluginFiles() const +{ + return myPluginFiles; +} + +/*! * Get module name from plugins.xml * (property "module") */ @@ -58,15 +65,29 @@ std::string Config_ModuleReader::getModuleName() return getProperty(aRoot, PLUGINS_MODULE); } -/* - * - */ + +void Config_ModuleReader::addFeature(const std::string& theFeatureName, + const std::string& thePluginConfig) +{ + if (myFeaturesInFiles.count(theFeatureName)) { + std::string anErrorMsg = "Can not register feature '%1' in plugin '%2'." + " There is a feature with the same ID."; + Events_InfoMessage("Config_ModuleReader", anErrorMsg) + .arg(theFeatureName).arg(thePluginConfig).send(); + return; + } + + myFeaturesInFiles[theFeatureName] = thePluginConfig; +} + void Config_ModuleReader::processNode(xmlNodePtr theNode) { if (isNode(theNode, NODE_PLUGIN, NULL)) { if (!hasRequiredModules(theNode)) return; std::string aPluginConf = getProperty(theNode, PLUGIN_CONFIG); + if (!aPluginConf.empty()) + myPluginFiles.insert(aPluginConf); std::string aPluginLibrary = getProperty(theNode, PLUGIN_LIBRARY); std::string aPluginScript = getProperty(theNode, PLUGIN_SCRIPT); std::string aPluginName = addPlugin(aPluginLibrary, aPluginScript, aPluginConf); @@ -74,7 +95,7 @@ void Config_ModuleReader::processNode(xmlNodePtr theNode) std::list aFeatures = importPlugin(aPluginName, aPluginConf); std::list::iterator it = aFeatures.begin(); for (; it != aFeatures.end(); it++) { - myFeaturesInFiles[*it] = aPluginConf; + addFeature(*it, aPluginConf); } } } @@ -151,14 +172,14 @@ void Config_ModuleReader::loadPlugin(const std::string& thePluginName) } } -void Config_ModuleReader::loadScript(const std::string& theFileName) +void Config_ModuleReader::loadScript(const std::string& theFileName, bool theSendErr) { - /* aquire python thread */ + /* acquire 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; + std::string anErrorMsg = "An error occurred while importing " + theFileName; //Get detailed error message: if (PyErr_Occurred()) { PyObject *pstr, *ptype, *pvalue, *ptraceback; @@ -174,7 +195,8 @@ void Config_ModuleReader::loadScript(const std::string& theFileName) Py_XDECREF(pvalue); Py_XDECREF(ptraceback); } - Events_Error::send(anErrorMsg); + if (theSendErr) + Events_InfoMessage("Config_ModuleReader", anErrorMsg).send(); } /* release python thread */ @@ -187,17 +209,29 @@ void Config_ModuleReader::loadLibrary(const std::string& theLibName) if (aFileName.empty()) return; -#ifdef WIN32 + #ifdef WIN32 HINSTANCE aModLib = ::LoadLibrary(aFileName.c_str()); -#else + #else void* aModLib = dlopen( aFileName.c_str(), RTLD_LAZY | RTLD_GLOBAL ); -#endif + #endif if(!aModLib && theLibName != "DFBrowser") { // don't show error for internal debugging tool std::string anErrorMsg = "Failed to load " + aFileName; - #ifndef WIN32 + #ifdef WIN32 + DWORD dwLastError = ::GetLastError(); + LPSTR messageBuffer = NULL; + size_t size = ::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + dwLastError, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR)&messageBuffer, 0, NULL); + anErrorMsg += ": " + std::string(messageBuffer, size); + #else anErrorMsg += ": " + std::string(dlerror()); #endif - Events_Error::send(anErrorMsg); + std::cerr << anErrorMsg << std::endl; + Events_InfoMessage("Config_ModuleReader", anErrorMsg).send(); } }