X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FContainer%2FContainer_i.cxx;h=d34b36ba839674dd460eded40ab72b38c99b31ff;hb=4b14a3f48efda72f90b88c78c6ae02153631dfd6;hp=19eb2de774098aa9bd0f5a93448c5a33b6b6302c;hpb=05821b15e6b1f3c19896be929d1693666ad62b0d;p=modules%2Fkernel.git diff --git a/src/Container/Container_i.cxx b/src/Container/Container_i.cxx index 19eb2de77..d34b36ba8 100644 --- a/src/Container/Container_i.cxx +++ b/src/Container/Container_i.cxx @@ -259,17 +259,17 @@ Engines_Container_i::~Engines_Container_i() if(_NS) delete _NS; for(std::map::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::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::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(_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::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 - (_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::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::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::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::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; +} +*/