X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FConfig%2FConfig_ModuleReader.cpp;h=2720bc308c9f010c2e5466281828a336991fb618;hb=f51f8ab55887ac6eff49fb9937a460abe1956517;hp=71d16037846caf06c17a3cf3b40f7c0dda860790;hpb=50999d5a0e5de71194dc677f630f6ca4a4bdeff4;p=modules%2Fshaper.git diff --git a/src/Config/Config_ModuleReader.cpp b/src/Config/Config_ModuleReader.cpp index 71d160378..2720bc308 100644 --- a/src/Config/Config_ModuleReader.cpp +++ b/src/Config/Config_ModuleReader.cpp @@ -1,11 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -/* - * Config_ModuleReader.cpp - * - * Created on: Mar 20, 2014 - * Author: sbh - */ +// Copyright (C) 2014-2020 CEA/DEN, EDF R&D +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include @@ -13,7 +23,8 @@ #include #include #include -#include +#include +#include #include #include @@ -70,9 +81,10 @@ void Config_ModuleReader::addFeature(const std::string& theFeatureName, const std::string& thePluginConfig) { if (myFeaturesInFiles.count(theFeatureName)) { - std::string anErrorMsg = "Can not register feature '" + theFeatureName + "' in plugin '" - + thePluginConfig + "'. There is a feature with the same ID."; - Events_Error::send(anErrorMsg); + 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; } @@ -90,6 +102,13 @@ void Config_ModuleReader::processNode(xmlNodePtr theNode) std::string aPluginLibrary = getProperty(theNode, PLUGIN_LIBRARY); std::string aPluginScript = getProperty(theNode, PLUGIN_SCRIPT); std::string aPluginName = addPlugin(aPluginLibrary, aPluginScript, aPluginConf); + std::string aUsesPlugin = getProperty(theNode, PLUGIN_USES); + if (!aUsesPlugin.empty()) { // send information about the plugin dependencies + std::shared_ptr aMess(new Config_PluginMessage( + Events_Loop::loop()->eventByName(Config_PluginMessage::EVENT_ID()), aPluginName)); + aMess->setUses(aUsesPlugin); + Events_Loop::loop()->send(aMess); + } std::list aFeatures = importPlugin(aPluginName, aPluginConf); std::list::iterator it = aFeatures.begin(); @@ -155,6 +174,12 @@ std::string Config_ModuleReader::addPlugin(const std::string& aPluginLibrary, void Config_ModuleReader::loadPlugin(const std::string& thePluginName) { + // informs model that plugin loading is started + static const Events_ID kEVENT_ID = + Events_Loop::loop()->eventByName(Config_PluginMessage::EVENT_ID()); + std::shared_ptr aMess(new Config_PluginMessage(kEVENT_ID, thePluginName)); + Events_Loop::loop()->send(aMess); + PluginType aType = Config_ModuleReader::Binary; if(myPluginTypes.find(thePluginName) != myPluginTypes.end()) { aType = myPluginTypes.at(thePluginName); @@ -171,21 +196,21 @@ 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; PyErr_Fetch(&ptype, &pvalue, &ptraceback); PyErr_NormalizeException(&ptype, &pvalue, &ptraceback); pstr = PyObject_Str(pvalue); - std::string aPyError = std::string(PyString_AsString(pstr)); + std::string aPyError = std::string(PyUnicode_AsUTF8(pstr)); if (!aPyError.empty()) { anErrorMsg += ":\n" + aPyError; } @@ -194,7 +219,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 */ @@ -208,28 +234,30 @@ void Config_ModuleReader::loadLibrary(const std::string& theLibName) return; #ifdef WIN32 - HINSTANCE aModLib = ::LoadLibrary(aFileName.c_str()); + HINSTANCE aModLib = ::LoadLibraryA(aFileName.c_str()); #else void* aModLib = dlopen( aFileName.c_str(), RTLD_LAZY | RTLD_GLOBAL ); #endif if(!aModLib && theLibName != "DFBrowser") { // don't show error for internal debugging tool +// LCOV_EXCL_START std::string anErrorMsg = "Failed to load " + aFileName; #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); + 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 std::cerr << anErrorMsg << std::endl; - Events_Error::send(anErrorMsg); + Events_InfoMessage("Config_ModuleReader", anErrorMsg).send(); +// LCOV_EXCL_STOP } }