X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FContainer%2FContainer_i.cxx;h=68373b289881b5a0bda0e0992352d05987b99b5a;hb=52111d0ad7a0d8acccc1bb4e49bb5877d949b844;hp=a8a5f01473bc53a12d5d23a4128f023fd5342a3a;hpb=983a3e666ce538b7bf45450c1de74740278dbe9a;p=modules%2Fkernel.git diff --git a/src/Container/Container_i.cxx b/src/Container/Container_i.cxx index a8a5f0147..68373b289 100644 --- a/src/Container/Container_i.cxx +++ b/src/Container/Container_i.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -254,6 +254,18 @@ Engines_Container_i::~Engines_Container_i() delete _id; 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(); + } + for(std::map::iterator it=_dftPyScriptNode.begin();it!=_dftPyScriptNode.end();it++) + { + Engines::PyScriptNode_var tmpVar((*it).second); + if(!CORBA::is_nil(tmpVar)) + tmpVar->UnRegister(); + } } //============================================================================= @@ -954,6 +966,41 @@ Engines_Container_i::createPythonInstance(std::string CompName, int studyId, return iobject._retn(); } +char * +Engines_Container_i::create_python_service_instance(const char * CompName, + CORBA::String_out reason) +{ + CORBA::Object_var object = CORBA::Object::_nil(); + + _numInstanceMutex.lock() ; // lock on the instance number + _numInstance++ ; + int numInstance = _numInstance ; + _numInstanceMutex.unlock() ; + + char aNumI[12]; + sprintf( aNumI , "%d" , numInstance ) ; + std::string instanceName = std::string(CompName) + "_inst_" + aNumI ; + std::string component_registerName = _containerName + "/" + instanceName; + + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject *result = PyObject_CallMethod(_pyCont, + (char*)"create_component_instance", + (char*)"ssl", + CompName, + instanceName.c_str(), + 0); + const char *ior; + const char *error; + PyArg_ParseTuple(result,"ss", &ior, &error); + reason = CORBA::string_dup(error); + char * _ior = CORBA::string_dup(ior); + Py_DECREF(result); + PyGILState_Release(gstate); + + return _ior; +} + + //============================================================================= //! Create a new component instance (C++ implementation) /*! @@ -1002,10 +1049,10 @@ Engines_Container_i::createInstance(std::string genericRegisterName, if ( !Component_factory ) { - INFOS( "Can't resolve symbol: " + factory_name ); + MESSAGE( "Can't resolve symbol: " + factory_name ); #ifndef WIN32 reason=dlerror(); - INFOS(reason); + MESSAGE(reason); #endif return Engines::EngineComponent::_nil() ; } @@ -1591,10 +1638,10 @@ void Engines_Container_i::copyFile(Engines::Container_ptr container, const char* while (toFollow) { ctr++; - SCRUTE(ctr); + //SCRUTE(ctr); aBlock = fileTransfer->getBlock(fileId); toFollow = aBlock->length(); - SCRUTE(toFollow); + //SCRUTE(toFollow); CORBA::Octet *buf = aBlock->get_buffer(); fwrite(buf, sizeof(CORBA::Octet), toFollow, fp); delete aBlock; @@ -1641,11 +1688,25 @@ Engines::PyNode_ptr Engines_Container_i::createPyNode(const char* nodeName, cons std::string astr=PyString_AsString(result); Py_DECREF(res); PyGILState_Release(gstate); - if(ierr==0) { - CORBA::Object_var obj = _orb->string_to_object(astr.c_str()); - node = Engines::PyNode::_narrow(obj); + 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(); } else @@ -1655,7 +1716,27 @@ Engines::PyNode_ptr Engines_Container_i::createPyNode(const char* nodeName, cons es.text = astr.c_str(); throw SALOME::SALOME_Exception(es); } +} +//============================================================================= +/*! \brief Retrieves the last created PyNode instance with createPyNode. + * + */ +//============================================================================= +Engines::PyNode_ptr Engines_Container_i::getDefaultPyNode(const char *nodeName) +{ + Utils_Locker lck(&_mutexForDftPy); + std::map::iterator it(_dftPyNode.find(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(); + } } //============================================================================= @@ -1693,8 +1774,23 @@ Engines::PyScriptNode_ptr Engines_Container_i::createPyScriptNode(const char* no if(ierr==0) { - CORBA::Object_var obj = _orb->string_to_object(astr.c_str()); - node = Engines::PyScriptNode::_narrow(obj); + 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(); } else @@ -1706,6 +1802,27 @@ Engines::PyScriptNode_ptr Engines_Container_i::createPyScriptNode(const char* no } } +//============================================================================= +/*! \brief Retrieves the last created PyScriptNode instance with createPyScriptNode. + * + */ +//============================================================================= +Engines::PyScriptNode_ptr Engines_Container_i::getDefaultPyScriptNode(const char *nodeName) +{ + Utils_Locker lck(&_mutexForDftPy); + std::map::iterator it(_dftPyScriptNode.find(nodeName)); + 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(); + } +} + //============================================================================= /* int checkifexecutable(const char *filename) * @@ -1782,7 +1899,7 @@ void Engines_Container_i::clearTemporaryFiles() std::list::const_iterator it; for ( it = _tmp_files.begin(); it != _tmp_files.end(); ++it ) { #ifdef WIN32 - std::string command = "del /F "; + std::string command = "del /F /P"; #else std::string command = "rm -rf "; #endif