-// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2020 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
#ifndef WIN32
#define LIB "lib"
+#ifdef __APPLE__
+#define ENGINESO "Engine.dylib"
+#else
#define ENGINESO "Engine.so"
+#endif
#else
#define LIB ""
#define ENGINESO "Engine.dll"
//=============================================================================
Engines_Container_i::Engines_Container_i () :
-_numInstance(0),_id(0),_NS(0)
+ _NS(0),_id(0),_numInstance(0)
{
}
//=============================================================================
/*!
-* Construtor to use
+* Constructor to use
*/
//=============================================================================
bool activAndRegist,
bool isServantAloneInProcess
) :
- _numInstance(0),_isServantAloneInProcess(isServantAloneInProcess),_id(0),_NS(0)
+ _NS(0),_id(0),_numInstance(0),_isServantAloneInProcess(isServantAloneInProcess)
{
_pid = (long)getpid();
delete _id;
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();
- }
- 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();
- }
+ cleanAllPyScripts();
}
//=============================================================================
*/
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&)
+ {
+ // ignore this entry and continue
+ }
+ catch(...)
+ {
+ // ignore this entry and continue
}
+ }
_listInstances_map.clear();
_NS->Destroy_FullDirectory(_containerName.c_str());
* CORBA method
* \param componentName component name
* \param reason explains error when load fails
-* \return true if dlopen successfull or already done, false otherwise
+* \return true if dlopen successful or already done, false otherwise
*/
//=============================================================================
bool
//=================================================================
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;
//=================================================================
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;
//=================================================================
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;
* C++ method:
* \param componentName the name of the component (COMPONENT, for example)
* \param reason explains error when load fails
-* \return true if loading is successfull or already done, false otherwise
+* \return true if loading is successful or already done, false otherwise
*/
//=============================================================================
bool
// (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 ) ;
+ 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
char* p=getenv("LD_LIBRARY_PATH");
+#endif
if(p)path=p;
path=path+SEP+"/usr/lib"+SEP+"/lib";
//continue with other implementation
reason="ImplementationNotFound";
return false;
- }
}
+ }
#else
HINSTANCE handle;
- handle = LoadLibrary( impl_name.c_str() );
+#ifdef UNICODE
+ std::wstring libToLoad = Kernel_Utils::utf8_decode_s( impl_name );
+#else
+ std::string libToLoad = impl_name;
+#endif
+ handle = LoadLibrary(libToLoad.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;
* C++ method:
* \param componentName name of the component
* \param reason explains error when load fails
-* \return true if loading is successfull or already done, false otherwise
+* \return true if loading is successful or already done, false otherwise
*/
//=============================================================================
bool
_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();
(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;
}
* C++ method:
* \param componentName name of the component
* \param reason explains error when load fails
-* \return true if loading is successfull or already done, false otherwise
+* \return true if loading is successful or already done, false otherwise
*/
//=============================================================================
bool
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;
}
* 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;
}
* 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
//=============================================================================
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;
//! 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
*/
//=============================================================================
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)
{
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());
//! 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() ;
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);
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();
}
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);
* 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
*
Engines::EngineComponent_ptr
Engines_Container_i::createInstance(std::string genericRegisterName,
void *handle,
- int studyId,
std::string& reason)
{
// --- find the factory
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() ;
}
std::string component_registerName =
_containerName + "/" + instanceName;
- // --- Instanciate required CORBA object
+ // --- Instantiate required CORBA object
PortableServer::ObjectId *id ; //not owner, do not delete (nore use var)
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)
}
catch (...)
{
- reason="Container_i::createInstance exception catched";
+ reason="Container_i::createInstance exception caught";
INFOS(reason) ;
}
return iobject._retn();
* 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();
if (instance.find(registeredName) == 0)
{
anEngine = (*itm).second;
- if (studyId == anEngine->getStudyId())
- {
- return anEngine._retn();
- }
+ return anEngine._retn();
}
itm++;
}
Engines::EngineComponent_ptr
Engines_Container_i::load_impl( const char* genericRegisterName,
- const char* componentName )
+ const char* /*componentName*/ )
{
char* reason;
std::string impl_name = std::string(LIB) + genericRegisterName + ENGINESO;
{
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 (...)
{
- INFOS( "Container_i::load_impl catched" ) ;
+ INFOS( "Container_i::load_impl caught" ) ;
}
return iobject._retn();
}
bool Engines_Container_i::isPythonContainer(const char* ContainerName)
{
bool ret=false;
- int len=strlen(ContainerName);
+ size_t len=strlen(ContainerName);
if(len>=2)
if(strcmp(ContainerName+len-2,"Py")==0)
ret=true;
void CallCancelThread() ;
#ifndef WIN32
-void SigIntHandler(int what ,
+void SigIntHandler(int /*what*/ ,
siginfo_t * siginfo ,
- void * toto )
+ void * /*toto*/ )
{
//PAL9042 JR : during the execution of a Signal Handler (and of methods called through Signal Handlers)
// use of streams (and so on) should never be used because :
if (origName[0] != '/')
{
- INFOS("path of file to copy must be an absolute path begining with '/'");
+ INFOS("path of file to copy must be an absolute path beginning with '/'");
return Engines::fileRef::_nil();
}
aSalome_file->setLocalFile(origFileName);
aSalome_file->recvFiles();
}
- catch (const SALOME::SALOME_Exception& e)
+ catch (const SALOME::SALOME_Exception& /*e*/) //!< TODO: unused variable
{
return Engines::Salome_file::_nil();
}
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");
+ }
}
//=============================================================================
//=============================================================================
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);
+ }
}
//=============================================================================
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();
+ }
}
//=============================================================================
//=============================================================================
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;
+ }
+ return node._retn();
+ }
+ else
+ {
+ SALOME::ExceptionStruct es;
+ es.type = SALOME::INTERNAL_ERROR;
+ es.text = astr.c_str();
+ throw SALOME::SALOME_Exception(es);
+ }
+}
+
+void Engines_Container_i::removePyScriptNode(const char *nodeName)
+{
+ std::map<std::string,Engines::PyScriptNode_var>::iterator it(_dftPyScriptNode.find(nodeName));
+ if(it==_dftPyScriptNode.end())
+ {
+ std::ostringstream oss; oss << "Engines_Container_i::removePyScriptNode : node \"" << nodeName << "\" is not map !";
+ SALOME::ExceptionStruct es;
+ es.type = SALOME::INTERNAL_ERROR;
+ es.text = oss.str().c_str();
+ throw SALOME::SALOME_Exception(es);
+ }
+ (*it).second->UnRegister();
+ _dftPyScriptNode.erase(it);
+}
+
+void Engines_Container_i::cleanAllPyScripts()
+{
+ 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();
+ }
+ _dftPyNode.clear();
+ 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();
+ }
+ _dftPyScriptNode.clear();
}
//=============================================================================
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();
+ }
}
//=============================================================================
{
std::list<std::string>::const_iterator it;
for ( it = _tmp_files.begin(); it != _tmp_files.end(); ++it ) {
-#ifdef WIN32
- std::string command = "del /F /P";
+#if defined(WIN32) && defined(UNICODE)
+ std::wstring aFile = Kernel_Utils::utf8_decode_s(*it);
+ std::wstring command = (GetFileAttributes(aFile.c_str()) == FILE_ATTRIBUTE_DIRECTORY) ? L"rd /Q \"" : L"del /F /Q \"";
+ command += aFile;
+ command += L"\" 2>NUL";
+ _wsystem(command.c_str());
#else
- std::string command = "rm -rf ";
+#if defined(WIN32)
+ std::string aFile = *it;
+ std::string command = (GetFileAttributes(aFile.c_str()) == FILE_ATTRIBUTE_DIRECTORY) ? "rd /Q \"" : "del /F /Q \"";
+ command += aFile;
+ command += "\" 2>NUL";
+#else
+ std::string command = "rm -rf ";
+ command += *it;
+#endif
+ system(command.c_str());
#endif
- command += *it;
- system( command.c_str() );
}
_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;
+}
+*/