Salome HOME
Merge changes from 'master' branch.
[modules/kernel.git] / src / Container / Container_i.cxx
index 19eb2de774098aa9bd0f5a93448c5a33b6b6302c..d34b36ba839674dd460eded40ab72b38c99b31ff 100644 (file)
@@ -259,17 +259,17 @@ Engines_Container_i::~Engines_Container_i()
   if(_NS)
     delete _NS;
   for(std::map<std::string,Engines::PyNode_var>::iterator it=_dftPyNode.begin();it!=_dftPyNode.end();it++)
-    {
-      Engines::PyNode_var tmpVar((*it).second);
-      if(!CORBA::is_nil(tmpVar))
-        tmpVar->UnRegister();
-    }
+  {
+    Engines::PyNode_var tmpVar((*it).second);
+    if(!CORBA::is_nil(tmpVar))
+      tmpVar->UnRegister();
+  }
   for(std::map<std::string,Engines::PyScriptNode_var>::iterator it=_dftPyScriptNode.begin();it!=_dftPyScriptNode.end();it++)
-    {
-      Engines::PyScriptNode_var tmpVar((*it).second);
-      if(!CORBA::is_nil(tmpVar))
-        tmpVar->UnRegister();
-    }
+  {
+    Engines::PyScriptNode_var tmpVar((*it).second);
+    if(!CORBA::is_nil(tmpVar))
+      tmpVar->UnRegister();
+  }
 }
 
 //=============================================================================
@@ -374,20 +374,20 @@ void Engines_Container_i::Shutdown()
   */
   std::map<std::string, Engines::EngineComponent_var>::iterator itm;
   for (itm = _listInstances_map.begin(); itm != _listInstances_map.end(); itm++)
+  {
+    try
     {
-      try
-        {
-          itm->second->destroy();
-        }
-      catch(const CORBA::Exception& e)
-        {
-          // ignore this entry and continue
-        }
-      catch(...)
-        {
-          // ignore this entry and continue
-        }
+      itm->second->destroy();
+    }
+    catch(const CORBA::Exception& e)
+    {
+      // ignore this entry and continue
     }
+    catch(...)
+    {
+      // ignore this entry and continue
+    }
+  }
   _listInstances_map.clear();
 
   _NS->Destroy_FullDirectory(_containerName.c_str());
@@ -418,15 +418,15 @@ Engines_Container_i::load_component_Library(const char* componentName, CORBA::St
   //=================================================================
   std::string retso;
   if(load_component_CppImplementation(componentName,retso))
-    {
-      reason=CORBA::string_dup("");
-      return true;
-    }
+  {
+    reason=CORBA::string_dup("");
+    return true;
+  }
   else if(retso != "ImplementationNotFound")
-    {
-      reason=CORBA::string_dup(retso.c_str());
-      return false;
-    }
+  {
+    reason=CORBA::string_dup(retso.c_str());
+    return false;
+  }
 
   retso="Component ";
   retso+=componentName;
@@ -438,15 +438,15 @@ Engines_Container_i::load_component_Library(const char* componentName, CORBA::St
   //=================================================================
   std::string retpy;
   if(load_component_PythonImplementation(componentName,retpy))
-    {
-      reason=CORBA::string_dup("");
-      return true;
-    }
+  {
+    reason=CORBA::string_dup("");
+    return true;
+  }
   else if(retpy != "ImplementationNotFound")
-    {
-      reason=CORBA::string_dup(retpy.c_str());
-      return false;
-    }
+  {
+    reason=CORBA::string_dup(retpy.c_str());
+    return false;
+  }
   
   retpy="Component ";
   retpy+=componentName;
@@ -459,15 +459,15 @@ Engines_Container_i::load_component_Library(const char* componentName, CORBA::St
   //=================================================================
   std::string retex;
   if(load_component_ExecutableImplementation(componentName,retex))
-    {
-      reason=CORBA::string_dup("");
-      return true;
-    }
+  {
+    reason=CORBA::string_dup("");
+    return true;
+  }
   else if(retex != "ImplementationNotFound")
-    {
-      reason=CORBA::string_dup(retex.c_str());
-      return false;
-    }
+  {
+    reason=CORBA::string_dup(retex.c_str());
+    return false;
+  }
 
   retex="Component ";
   retex+=componentName;
@@ -508,21 +508,21 @@ Engines_Container_i::load_component_CppImplementation(const char* componentName,
   // (see decInstanceCnt, finalize_removal))
   if (_toRemove_map.count(impl_name) != 0) _toRemove_map.erase(impl_name);
   if (_library_map.count(impl_name) != 0)
-    {
-      MESSAGE("Library " << impl_name << " already loaded");
-      _numInstanceMutex.unlock();
-      reason="";
-      return true;
-    }
+  {
+    MESSAGE("Library " << impl_name << " already loaded");
+    _numInstanceMutex.unlock();
+    reason="";
+    return true;
+  }
   _numInstanceMutex.unlock();
 
 #ifndef WIN32
   void* handle;
   handle = dlopen( impl_name.c_str() , RTLD_NOW | RTLD_GLOBAL ) ;
   if ( !handle )
-    {
-      //not loadable. Try to find the lib file in LD_LIBRARY_PATH
-      std::string path;
+  {
+    //not loadable. Try to find the lib file in LD_LIBRARY_PATH
+    std::string path;
 #ifdef __APPLE__
       char* p=getenv("DYLD_LIBRARY_PATH");
 #else
@@ -550,25 +550,25 @@ Engines_Container_i::load_component_CppImplementation(const char* componentName,
           //continue with other implementation
           reason="ImplementationNotFound";
           return false;
-        }
     }
+  }
 #else
   HINSTANCE handle;
   handle = LoadLibrary( impl_name.c_str() );
   if ( !handle )
-    {
-      reason="ImplementationNotFound";
-    }
+  {
+    reason="ImplementationNotFound";
+  }
 #endif
 
   if ( handle )
-    {
-      _numInstanceMutex.lock();
-      _library_map[impl_name] = handle;
-      _numInstanceMutex.unlock();
-      reason="";
-      return true;
-    }
+  {
+    _numInstanceMutex.lock();
+    _library_map[impl_name] = handle;
+    _numInstanceMutex.unlock();
+    reason="";
+    return true;
+  }
 
   return false;
 
@@ -589,11 +589,11 @@ Engines_Container_i::load_component_PythonImplementation(const char* componentNa
 
   _numInstanceMutex.lock() ; // lock to be alone (stl container write)
   if (_library_map.count(aCompName) != 0)
-    {
-      _numInstanceMutex.unlock() ;
-      reason="";
-      return true; // Python Component, already imported
-    }
+  {
+    _numInstanceMutex.unlock() ;
+    reason="";
+    return true; // Python Component, already imported
+  }
   _numInstanceMutex.unlock() ;
 
   PyGILState_STATE gstate = PyGILState_Ensure();
@@ -601,30 +601,30 @@ Engines_Container_i::load_component_PythonImplementation(const char* componentNa
                                          (char*)"import_component",
                                          (char*)"s",componentName);
 
-  reason=PyString_AsString(result);
+  reason=PyUnicode_AsUTF8(result);
   Py_XDECREF(result);
   SCRUTE(reason);
   PyGILState_Release(gstate);
 
   if (reason=="")
-    {
-      //Python component has been loaded (import componentName)
-      _numInstanceMutex.lock() ; // lock to be alone (stl container write)
-      _library_map[aCompName] = (void *)_pyCont; // any non O value OK
-      _numInstanceMutex.unlock() ;
-      MESSAGE("import Python: "<< aCompName <<" OK");
-      return true;
-    }
+  {
+    //Python component has been loaded (import componentName)
+    _numInstanceMutex.lock() ; // lock to be alone (stl container write)
+    _library_map[aCompName] = (void *)_pyCont; // any non O value OK
+    _numInstanceMutex.unlock() ;
+    MESSAGE("import Python: "<< aCompName <<" OK");
+    return true;
+  }
   else if(reason=="ImplementationNotFound")
-    {
-      //Python implementation has not been found. Continue with other implementation
-      reason="ImplementationNotFound";
-    }
+  {
+    //Python implementation has not been found. Continue with other implementation
+    reason="ImplementationNotFound";
+  }
   else
-    {
-      //Python implementation has been found but loading has failed
-      std::cerr << reason << std::endl;
-    }
+  {
+    //Python implementation has been found but loading has failed
+    std::cerr << reason << std::endl;
+  }
   return false;
 
 }
@@ -650,27 +650,27 @@ Engines_Container_i::load_component_ExecutableImplementation(const char* compone
   if(p)path=p;
 
   if (findpathof(path, pth, executable))
+  {
+    if(checkifexecutable(pth))
     {
-      if(checkifexecutable(pth))
-        {
-          _numInstanceMutex.lock() ; // lock to be alone (stl container write)
-          _library_map[executable] = (void *)1; // any non O value OK
-          _numInstanceMutex.unlock() ;
-          MESSAGE("import executable: "<< pth <<" OK");
-          reason="";
-          return true;
-        }
-      reason="Component ";
-      reason+=aCompName;
-      reason+=": implementation found ";
-      reason+=pth;
-      reason+=" but it is not executable";
-      std::cerr << reason << std::endl;
+      _numInstanceMutex.lock() ; // lock to be alone (stl container write)
+      _library_map[executable] = (void *)1; // any non O value OK
+      _numInstanceMutex.unlock() ;
+      MESSAGE("import executable: "<< pth <<" OK");
+      reason="";
+      return true;
     }
+    reason="Component ";
+    reason+=aCompName;
+    reason+=": implementation found ";
+    reason+=pth;
+    reason+=" but it is not executable";
+    std::cerr << reason << std::endl;
+  }
   else
-    {
-      reason="ImplementationNotFound";
-    }
+  {
+    reason="ImplementationNotFound";
+  }
   return false;
 }
 
@@ -681,19 +681,16 @@ Engines_Container_i::load_component_ExecutableImplementation(const char* compone
 *  The servant registers itself to naming service and Registry.
 *  \param genericRegisterName  Name of the component instance to register
 *                         in Registry & Name Service (without _inst_n suffix)
-*  \param studyId         0 for multiStudy instance, 
-*                         study Id (>0) otherwise
 *  \return a loaded component
 */
 //=============================================================================
 Engines::EngineComponent_ptr
-Engines_Container_i::create_component_instance(const char*genericRegisterName,
-                                               CORBA::Long studyId)
+Engines_Container_i::create_component_instance(const char*genericRegisterName)
 {
   Engines::FieldsDict_var env = new Engines::FieldsDict;
   char* reason;
   Engines::EngineComponent_ptr compo =
-    create_component_instance_env(genericRegisterName, studyId, env, reason);
+    create_component_instance_env(genericRegisterName, env, reason);
   CORBA::string_free(reason);
   return compo;
 }
@@ -705,8 +702,6 @@ Engines_Container_i::create_component_instance(const char*genericRegisterName,
 *  The servant registers itself to naming service and Registry.
 *  \param genericRegisterName  Name of the component instance to register
 *                         in Registry & Name Service (without _inst_n suffix)
-*  \param studyId         0 for multiStudy instance, 
-*                         study Id (>0) otherwise
 *  \param env             dict of env variables
 *  \param reason          explains error when create_component_instance_env fails
 *  \return a loaded component
@@ -714,44 +709,36 @@ Engines_Container_i::create_component_instance(const char*genericRegisterName,
 //=============================================================================
 Engines::EngineComponent_ptr
 Engines_Container_i::create_component_instance_env(const char*genericRegisterName,
-                                                   CORBA::Long studyId,
                                                    const Engines::FieldsDict& env,
                                                    CORBA::String_out reason)
 {
-  if (studyId < 0)
-    {
-      INFOS("studyId must be > 0 for mono study instance, =0 for multiStudy");
-      reason=CORBA::string_dup("studyId must be > 0 for mono study instance, =0 for multiStudy");
-      return Engines::EngineComponent::_nil() ;
-    }
-
   std::string error;
   if (_library_map.count(genericRegisterName) != 0)
-    {
-      // It's a Python component
-      Engines::EngineComponent_ptr compo = createPythonInstance(genericRegisterName, studyId, error);
-      reason=CORBA::string_dup(error.c_str());
-      return compo;
-    }
+  {
+    // It's a Python component
+    Engines::EngineComponent_ptr compo = createPythonInstance(genericRegisterName, error);
+    reason=CORBA::string_dup(error.c_str());
+    return compo;
+  }
 
   std::string impl_name = std::string(LIB) + genericRegisterName + ENGINESO;
   if (_library_map.count(impl_name) != 0)
-    {
-      // It's a C++ component
-      void* handle = _library_map[impl_name];
-      Engines::EngineComponent_ptr compo = createInstance(genericRegisterName, handle, studyId, error);
-      reason=CORBA::string_dup(error.c_str());
-      return compo;
-    }
+  {
+    // It's a C++ component
+    void* handle = _library_map[impl_name];
+    Engines::EngineComponent_ptr compo = createInstance(genericRegisterName, handle, error);
+    reason=CORBA::string_dup(error.c_str());
+    return compo;
+  }
 
   impl_name = std::string(genericRegisterName) + ".exe";
   if (_library_map.count(impl_name) != 0)
-    {
-      //It's an executable component
-      Engines::EngineComponent_ptr compo = createExecutableInstance(genericRegisterName, studyId, env, error);
-      reason=CORBA::string_dup(error.c_str());
-      return compo;
-    }
+  {
+    //It's an executable component
+    Engines::EngineComponent_ptr compo = createExecutableInstance(genericRegisterName, env, error);
+    reason=CORBA::string_dup(error.c_str());
+    return compo;
+  }
 
   error="load_component_Library has probably not been called for component: ";
   error += genericRegisterName;
@@ -764,8 +751,6 @@ Engines_Container_i::create_component_instance_env(const char*genericRegisterNam
 //! Create a new component instance (Executable implementation)
 /*! 
 *  \param CompName               Name of the component instance
-*  \param studyId                0 for multiStudy instance, 
-*                                study Id (>0) otherwise
 *  \param env                    dict of env variables
 *  \param reason                 explains error when creation fails
 *  \return a loaded component
@@ -776,7 +761,7 @@ Engines_Container_i::create_component_instance_env(const char*genericRegisterNam
 */
 //=============================================================================
 Engines::EngineComponent_ptr
-Engines_Container_i::createExecutableInstance(std::string CompName, int studyId,
+Engines_Container_i::createExecutableInstance(std::string CompName,
                                               const Engines::FieldsDict& env,
                                               std::string& reason)
 {
@@ -830,35 +815,35 @@ Engines_Container_i::createExecutableInstance(std::string CompName, int studyId,
   int status;
   pid_t pid = fork();
   if(pid == 0) // child
+  {
+    for (CORBA::ULong i=0; i < env.length(); i++)
     {
-      for (CORBA::ULong i=0; i < env.length(); i++)
-        {
-          if (env[i].value.type()->kind() == CORBA::tk_string)
-            {
-              const char* value;
-              env[i].value >>= value;
-              std::string s(env[i].key);
-              s+='=';
-              s+=value;
-              putenv(strdup(s.c_str()));
-            }
-        }
-
-      execl("/bin/sh", "sh", "-c", command.c_str() , (char *)0);
-      status=-1;
+      if (env[i].value.type()->kind() == CORBA::tk_string)
+      {
+        const char* value;
+        env[i].value >>= value;
+        std::string s(env[i].key);
+        s+='=';
+        s+=value;
+        putenv(strdup(s.c_str()));
+      }
     }
+
+    execl("/bin/sh", "sh", "-c", command.c_str() , (char *)0);
+    status=-1;
+  }
   else if(pid < 0)       // failed to fork
-    {
-      status=-1;
-    }
+  {
+    status=-1;
+  }
   else            //parent
+  {
+    pid_t tpid;
+    do
     {
-      pid_t tpid;
-      do
-        {
-          tpid = wait(&status);
-        } while (tpid != pid);
-    }
+      tpid = wait(&status);
+    } while (tpid != pid);
+  }
 #else
   // launch component with a system call
   int status=system(command.c_str());
@@ -928,14 +913,12 @@ Engines_Container_i::createExecutableInstance(std::string CompName, int studyId,
 //! Create a new component instance (Python implementation)
 /*! 
 *  \param CompName               Name of the component instance
-*  \param studyId                0 for multiStudy instance, 
-*                                study Id (>0) otherwise
 *  \param reason                 explains error when creation fails
 *  \return a loaded component
 */
 //=============================================================================
 Engines::EngineComponent_ptr
-Engines_Container_i::createPythonInstance(std::string CompName, int studyId,
+Engines_Container_i::createPythonInstance(std::string CompName,
                                           std::string& reason)
 {
   Engines::EngineComponent_var iobject = Engines::EngineComponent::_nil() ;
@@ -953,10 +936,9 @@ Engines_Container_i::createPythonInstance(std::string CompName, int studyId,
   PyGILState_STATE gstate = PyGILState_Ensure();
   PyObject *result = PyObject_CallMethod(_pyCont,
                                          (char*)"create_component_instance",
-                                         (char*)"ssl",
+                                         (char*)"ss",
                                          CompName.c_str(),
-                                         instanceName.c_str(),
-                                         studyId);
+                                         instanceName.c_str());
   const char *ior;
   const char *error;
   PyArg_ParseTuple(result,"ss", &ior, &error);
@@ -966,11 +948,11 @@ Engines_Container_i::createPythonInstance(std::string CompName, int studyId,
   PyGILState_Release(gstate);
 
   if( iors!="" )
-    {
-      CORBA::Object_var obj = _orb->string_to_object(iors.c_str());
-      iobject = Engines::EngineComponent::_narrow( obj ) ;
-      _listInstances_map[instanceName] = iobject;
-    }
+  {
+    CORBA::Object_var obj = _orb->string_to_object(iors.c_str());
+    iobject = Engines::EngineComponent::_narrow( obj ) ;
+    _listInstances_map[instanceName] = iobject;
+  }
   return iobject._retn();
 }
 
@@ -993,10 +975,9 @@ Engines_Container_i::create_python_service_instance(const char * CompName,
   PyGILState_STATE gstate = PyGILState_Ensure();
   PyObject *result = PyObject_CallMethod(_pyCont,
                                          (char*)"create_component_instance",
-                                         (char*)"ssl",
+                                         (char*)"ss",
                                          CompName,
-                                         instanceName.c_str(),
-                                         0);
+                                         instanceName.c_str());
   const char *ior;
   const char *error;
   PyArg_ParseTuple(result,"ss", &ior, &error);
@@ -1017,8 +998,6 @@ Engines_Container_i::create_python_service_instance(const char * CompName,
 *                                in Registry & Name Service,
 *                                (without _inst_n suffix, like "COMPONENT")
 *  \param handle                 loaded library handle
-*  \param studyId                0 for multiStudy instance, 
-*                                study Id (>0) otherwise
 *  \param reason                 explains error when creation fails
 *  \return a loaded component
 * 
@@ -1034,7 +1013,6 @@ Engines_Container_i::create_python_service_instance(const char * CompName,
 Engines::EngineComponent_ptr
 Engines_Container_i::createInstance(std::string genericRegisterName,
                                     void *handle,
-                                    int studyId,
                                     std::string& reason)
 {
   // --- find the factory
@@ -1088,30 +1066,23 @@ Engines_Container_i::createInstance(std::string genericRegisterName,
     id = (Component_factory) ( _orb, _poa, _id, instanceName.c_str(),
                                                 aGenRegisterName.c_str() ) ;
     if (id == NULL)
-      {
-        reason="Can't get ObjectId from factory";
-        INFOS(reason);
-        return iobject._retn();
-      }
+    {
+      reason="Can't get ObjectId from factory";
+      INFOS(reason);
+      return iobject._retn();
+    }
 
-    // --- get reference & servant from id
+    // --- get reference from id
 
     CORBA::Object_var obj = _poa->id_to_reference(*id);
     iobject = Engines::EngineComponent::_narrow( obj ) ;
 
-    Engines_Component_i *servant =
-      dynamic_cast<Engines_Component_i*>(_poa->reference_to_servant(iobject));
-    ASSERT(servant);
-    //SCRUTE(servant->_refcount_value());
     _numInstanceMutex.lock() ; // lock to be alone (stl container write)
     _listInstances_map[instanceName] = iobject;
     _cntInstances_map[aGenRegisterName] += 1;
     _numInstanceMutex.unlock() ;
     SCRUTE(aGenRegisterName);
     SCRUTE(_cntInstances_map[aGenRegisterName]);
-    servant->setStudyId(studyId);
-    servant->_remove_ref(); // do not need servant any more (remove ref from reference_to_servant)
-    //SCRUTE(servant->_refcount_value());
 
     // --- register the engine under the name
     //     containerName(.dir)/instanceName(.object)
@@ -1133,14 +1104,11 @@ Engines_Container_i::createInstance(std::string genericRegisterName,
 *  CORBA method: Finds a servant instance of a component
 *  \param registeredName  Name of the component in Registry or Name Service,
 *                         without instance suffix number
-*  \param studyId         0 if instance is not associated to a study,
-*                         >0 otherwise (== study id)
-*  \return the first instance found with same studyId
+*  \return the first found instance
 */
 //=============================================================================
 Engines::EngineComponent_ptr
-Engines_Container_i::find_component_instance( const char* registeredName,
-                                              CORBA::Long studyId)
+Engines_Container_i::find_component_instance( const char* registeredName)
 {
   Engines::EngineComponent_var anEngine = Engines::EngineComponent::_nil();
   std::map<std::string,Engines::EngineComponent_var>::iterator itm =_listInstances_map.begin();
@@ -1151,10 +1119,7 @@ Engines_Container_i::find_component_instance( const char* registeredName,
     if (instance.find(registeredName) == 0)
     {
       anEngine = (*itm).second;
-      if (studyId == anEngine->getStudyId())
-      {
-        return anEngine._retn();
-      }
+      return anEngine._retn();
     }
     itm++;
   }
@@ -1320,29 +1285,11 @@ Engines_Container_i::find_or_create_instance(std::string genericRegisterName,
       {
         iobject = createInstance(genericRegisterName,
                                  handle,
-                                 0,
-                                 reason); // force multiStudy instance here !
+                                 reason);
       }
       else
       {
         iobject = Engines::EngineComponent::_narrow( obj ) ;
-        Engines_Component_i *servant =
-          dynamic_cast<Engines_Component_i*>
-          (_poa->reference_to_servant(iobject));
-        ASSERT(servant)
-          int studyId = servant->getStudyId();
-        ASSERT (studyId >= 0);
-        if (studyId == 0) // multiStudy instance, OK
-        {
-          // No ReBind !
-          MESSAGE(component_registerBase.c_str()<<" already bound");
-        }
-        else // monoStudy instance: NOK
-        {
-          iobject = Engines::EngineComponent::_nil();
-          INFOS("load_impl & find_component_instance methods "
-            << "NOT SUITABLE for mono study components");
-        }
       }
     }
     catch (...)
@@ -1632,36 +1579,36 @@ void Engines_Container_i::copyFile(Engines::Container_ptr container, const char*
 
   FILE* fp;
   if ((fp = fopen(localFile,"wb")) == NULL)
-    {
-      INFOS("file " << localFile << " cannot be open for writing");
-      return;
-    }
+  {
+    INFOS("file " << localFile << " cannot be open for writing");
+    return;
+  }
 
   CORBA::Long fileId = fileTransfer->open(remoteFile);
   if (fileId > 0)
+  {
+    Engines::fileBlock* aBlock;
+    int toFollow = 1;
+    int ctr=0;
+    while (toFollow)
     {
-      Engines::fileBlock* aBlock;
-      int toFollow = 1;
-      int ctr=0;
-      while (toFollow)
-        {
-          ctr++;
-          //SCRUTE(ctr);
-          aBlock = fileTransfer->getBlock(fileId);
-          toFollow = aBlock->length();
-          //SCRUTE(toFollow);
-          CORBA::Octet *buf = aBlock->get_buffer();
-          fwrite(buf, sizeof(CORBA::Octet), toFollow, fp);
-          delete aBlock;
-        }
-      fclose(fp);
-      MESSAGE("end of transfer");
-      fileTransfer->close(fileId);
+      ctr++;
+      //SCRUTE(ctr);
+      aBlock = fileTransfer->getBlock(fileId);
+      toFollow = aBlock->length();
+      //SCRUTE(toFollow);
+      CORBA::Octet *buf = aBlock->get_buffer();
+      fwrite(buf, sizeof(CORBA::Octet), toFollow, fp);
+      delete aBlock;
     }
+    fclose(fp);
+    MESSAGE("end of transfer");
+    fileTransfer->close(fileId);
+  }
   else
-    {
-      INFOS("open reference file for copy impossible");
-    }
+  {
+    INFOS("open reference file for copy impossible");
+  }
 }
 
 //=============================================================================
@@ -1673,57 +1620,57 @@ void Engines_Container_i::copyFile(Engines::Container_ptr container, const char*
 //=============================================================================
 Engines::PyNode_ptr Engines_Container_i::createPyNode(const char* nodeName, const char* code)
 {
-    Engines::PyNode_var node= Engines::PyNode::_nil();
+  Engines::PyNode_var node= Engines::PyNode::_nil();
 
-    PyGILState_STATE gstate = PyGILState_Ensure();
-    PyObject *res = PyObject_CallMethod(_pyCont,
-      (char*)"create_pynode",
-      (char*)"ss",
-      nodeName,
-      code);
-    if(res==NULL)
-      {
-        //internal error
-        PyErr_Print();
-        PyGILState_Release(gstate);
-        SALOME::ExceptionStruct es;
-        es.type = SALOME::INTERNAL_ERROR;
-        es.text = "can not create a python node";
-        throw SALOME::SALOME_Exception(es);
-      }
-    long ierr=PyInt_AsLong(PyTuple_GetItem(res,0));
-    PyObject* result=PyTuple_GetItem(res,1);
-    std::string astr=PyString_AsString(result);
-    Py_DECREF(res);
+  PyGILState_STATE gstate = PyGILState_Ensure();
+  PyObject *res = PyObject_CallMethod(_pyCont,
+    (char*)"create_pynode",
+    (char*)"ss",
+    nodeName,
+    code);
+  if(res==NULL)
+  {
+    //internal error
+    PyErr_Print();
     PyGILState_Release(gstate);
-    if(ierr==0)
-      {
-        Utils_Locker lck(&_mutexForDftPy);
-        CORBA::Object_var obj=_orb->string_to_object(astr.c_str());
-        node=Engines::PyNode::_narrow(obj);
-        std::map<std::string,Engines::PyNode_var>::iterator it(_dftPyNode.find(nodeName));
-        if(it==_dftPyNode.end())
-          {
-            _dftPyNode[nodeName]=node;
-          }
-        else
-          {
-            Engines::PyNode_var oldNode((*it).second);
-            if(!CORBA::is_nil(oldNode))
-              oldNode->UnRegister();
-            (*it).second=node;
-          }
-        if(!CORBA::is_nil(node))
-          node->Register();
-        return node._retn();
-      }
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::INTERNAL_ERROR;
+    es.text = "can not create a python node";
+    throw SALOME::SALOME_Exception(es);
+  }
+  long ierr=PyLong_AsLong(PyTuple_GetItem(res,0));
+  PyObject* result=PyTuple_GetItem(res,1);
+  std::string astr=PyUnicode_AsUTF8(result);
+  Py_DECREF(res);
+  PyGILState_Release(gstate);
+  if(ierr==0)
+  {
+    Utils_Locker lck(&_mutexForDftPy);
+    CORBA::Object_var obj=_orb->string_to_object(astr.c_str());
+    node=Engines::PyNode::_narrow(obj);
+    std::map<std::string,Engines::PyNode_var>::iterator it(_dftPyNode.find(nodeName));
+    if(it==_dftPyNode.end())
+    {
+      _dftPyNode[nodeName]=node;
+    }
     else
-      {
-        SALOME::ExceptionStruct es;
-        es.type = SALOME::INTERNAL_ERROR;
-        es.text = astr.c_str();
-        throw SALOME::SALOME_Exception(es);
-      }
+    {
+      Engines::PyNode_var oldNode((*it).second);
+      if(!CORBA::is_nil(oldNode))
+        oldNode->UnRegister();
+      (*it).second=node;
+    }
+    if(!CORBA::is_nil(node))
+      node->Register();
+    return node._retn();
+  }
+  else
+  {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::INTERNAL_ERROR;
+    es.text = astr.c_str();
+    throw SALOME::SALOME_Exception(es);
+  }
 }
 
 //=============================================================================
@@ -1738,13 +1685,13 @@ Engines::PyNode_ptr  Engines_Container_i::getDefaultPyNode(const char *nodeName)
   if(it==_dftPyNode.end())
     return Engines::PyNode::_nil();
   else
-    {
-      Engines::PyNode_var tmpVar((*it).second);
-      if(!CORBA::is_nil(tmpVar))
-        return Engines::PyNode::_duplicate(tmpVar);
-      else
-        return Engines::PyNode::_nil();
-    }
+  {
+    Engines::PyNode_var tmpVar((*it).second);
+    if(!CORBA::is_nil(tmpVar))
+      return Engines::PyNode::_duplicate(tmpVar);
+    else
+      return Engines::PyNode::_nil();
+  }
 }
 
 //=============================================================================
@@ -1756,58 +1703,58 @@ Engines::PyNode_ptr  Engines_Container_i::getDefaultPyNode(const char *nodeName)
 //=============================================================================
 Engines::PyScriptNode_ptr Engines_Container_i::createPyScriptNode(const char* nodeName, const char* code)
 {
-    Engines::PyScriptNode_var node= Engines::PyScriptNode::_nil();
+  Engines::PyScriptNode_var node= Engines::PyScriptNode::_nil();
 
-    PyGILState_STATE gstate = PyGILState_Ensure();
-    PyObject *res = PyObject_CallMethod(_pyCont,
-      (char*)"create_pyscriptnode",
-      (char*)"ss",
-      nodeName,
-      code);
-    if(res==NULL)
-      {
-        //internal error
-        PyErr_Print();
-        PyGILState_Release(gstate);
-        SALOME::ExceptionStruct es;
-        es.type = SALOME::INTERNAL_ERROR;
-        es.text = "can not create a python node";
-        throw SALOME::SALOME_Exception(es);
-      }
-    long ierr=PyInt_AsLong(PyTuple_GetItem(res,0));
-    PyObject* result=PyTuple_GetItem(res,1);
-    std::string astr=PyString_AsString(result);
-    Py_DECREF(res);
+  PyGILState_STATE gstate = PyGILState_Ensure();
+  PyObject *res = PyObject_CallMethod(_pyCont,
+    (char*)"create_pyscriptnode",
+    (char*)"ss",
+    nodeName,
+    code);
+  if(res==NULL)
+  {
+    //internal error
+    PyErr_Print();
     PyGILState_Release(gstate);
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::INTERNAL_ERROR;
+    es.text = "can not create a python node";
+    throw SALOME::SALOME_Exception(es);
+  }
+  long ierr=PyLong_AsLong(PyTuple_GetItem(res,0));
+  PyObject* result=PyTuple_GetItem(res,1);
+  std::string astr=PyUnicode_AsUTF8(result);
+  Py_DECREF(res);
+  PyGILState_Release(gstate);
 
-    if(ierr==0)
-      {
-        Utils_Locker lck(&_mutexForDftPy);
-        CORBA::Object_var obj=_orb->string_to_object(astr.c_str());
-        node=Engines::PyScriptNode::_narrow(obj);
-        std::map<std::string,Engines::PyScriptNode_var>::iterator it(_dftPyScriptNode.find(nodeName));
-        if(it==_dftPyScriptNode.end())
-          {
-            _dftPyScriptNode[nodeName]=node;
-          }
-        else
-          {
-            Engines::PyScriptNode_var oldNode((*it).second);
-            if(!CORBA::is_nil(oldNode))
-              oldNode->UnRegister();
-            (*it).second=node;
-          }
-        if(!CORBA::is_nil(node))
-          node->Register();
-        return node._retn();
-      }
+  if(ierr==0)
+  {
+    Utils_Locker lck(&_mutexForDftPy);
+    CORBA::Object_var obj=_orb->string_to_object(astr.c_str());
+    node=Engines::PyScriptNode::_narrow(obj);
+    std::map<std::string,Engines::PyScriptNode_var>::iterator it(_dftPyScriptNode.find(nodeName));
+    if(it==_dftPyScriptNode.end())
+    {
+      _dftPyScriptNode[nodeName]=node;
+    }
     else
-      {
-        SALOME::ExceptionStruct es;
-        es.type = SALOME::INTERNAL_ERROR;
-        es.text = astr.c_str();
-        throw SALOME::SALOME_Exception(es);
-      }
+    {
+      Engines::PyScriptNode_var oldNode((*it).second);
+      if(!CORBA::is_nil(oldNode))
+        oldNode->UnRegister();
+      (*it).second=node;
+    }
+    if(!CORBA::is_nil(node))
+      node->Register();
+    return node._retn();
+  }
+  else
+  {
+    SALOME::ExceptionStruct es;
+    es.type = SALOME::INTERNAL_ERROR;
+    es.text = astr.c_str();
+    throw SALOME::SALOME_Exception(es);
+  }
 }
 
 //=============================================================================
@@ -1822,13 +1769,13 @@ Engines::PyScriptNode_ptr Engines_Container_i::getDefaultPyScriptNode(const char
   if(it==_dftPyScriptNode.end())
     return Engines::PyScriptNode::_nil();
   else
-    {
-      Engines::PyScriptNode_var tmpVar((*it).second);
-      if(!CORBA::is_nil(tmpVar))
-        return Engines::PyScriptNode::_duplicate(tmpVar);
-      else
-        return Engines::PyScriptNode::_nil();
-    }
+  {
+    Engines::PyScriptNode_var tmpVar((*it).second);
+    if(!CORBA::is_nil(tmpVar))
+      return Engines::PyScriptNode::_duplicate(tmpVar);
+    else
+      return Engines::PyScriptNode::_nil();
+  }
 }
 
 //=============================================================================
@@ -1916,3 +1863,43 @@ void Engines_Container_i::clearTemporaryFiles()
   }
   _tmp_files.clear();
 }
+
+/*
+std::string Engines_Container_i::AnotherMethodeToReplace_PyString_AsString(PyObject * result)
+{
+    std::string my_result = "";
+    if (PyUnicode_Check(result)) {
+        // Convert string to bytes.
+        // strdup() bytes into my_result.
+        PyObject * temp_bytes = PyUnicode_AsEncodedString(result, "ASCII", "strict"); // Owned reference
+        if (temp_bytes != NULL) {
+            my_result = PyBytes_AS_STRING(temp_bytes); // Borrowed pointer
+            my_result = strdup(my_result);
+            Py_DECREF(temp_bytes);
+        } else {
+            // TODO PY3: Handle encoding error.
+            Py_DECREF(temp_bytes);
+        }
+
+    } else if (PyBytes_Check(result)) {
+        // strdup() bytes into my_result.
+        my_result = PyBytes_AS_STRING(result); // Borrowed pointer
+        my_result = strdup(my_result);
+    } else {
+        // Convert into your favorite string representation.
+        // Convert string to bytes if it is not already.
+        // strdup() bytes into my_result.
+        // TODO PY3: Check if only bytes is ok. 
+        PyObject * temp_bytes = PyObject_Bytes(result); // Owned reference
+        if (temp_bytes != NULL) {
+            my_result = PyBytes_AS_STRING(temp_bytes); // Borrowed pointer
+            my_result = strdup(my_result);
+            Py_DECREF(temp_bytes);
+        } else {
+            // TODO PY3: Handle error.
+            Py_DECREF(temp_bytes);
+        }
+    }
+    return my_result;
+}
+*/