Salome HOME
Update copyrights
[modules/shaper.git] / src / Config / Config_ModuleReader.cpp
index 9e8549cdb43bd7d7aea303add9f452ed95bf922c..8c4119975c5bc78d1e7bd5e4f8a2acbad72a88b6 100644 (file)
@@ -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-2019  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 <pyconfig.h>
 
@@ -13,6 +23,7 @@
 #include <Config_Common.h>
 #include <Config_ModuleReader.h>
 #include <Config_FeatureReader.h>
+#include <Config_PluginMessage.h>
 #include <Events_InfoMessage.h>
 
 #include <libxml/parser.h>
@@ -91,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<Config_PluginMessage> aMess(new Config_PluginMessage(
+        Events_Loop::loop()->eventByName(Config_PluginMessage::EVENT_ID()), aPluginName));
+      aMess->setUses(aUsesPlugin);
+      Events_Loop::loop()->send(aMess);
+    }
 
     std::list<std::string> aFeatures = importPlugin(aPluginName, aPluginConf);
     std::list<std::string>::iterator it = aFeatures.begin();
@@ -156,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<Config_PluginMessage> 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);
@@ -186,7 +210,7 @@ void Config_ModuleReader::loadScript(const std::string& theFileName, bool theSen
       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;
       }
@@ -210,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_InfoMessage("Config_ModuleReader", anErrorMsg).send();
+// LCOV_EXCL_STOP
   }
 }