Salome HOME
[EDF27816] : Get rid of SALOME session for 3 last tests (YacsLoader, YacsLoader_Swig...
[modules/yacs.git] / src / runtime / RuntimeSALOME.cxx
index 15ad04febd098b34a8024e58ccb78d0d7c9fd252..55401af07229a27a718aefaaae0b12b289f80cd1 100644 (file)
 #include "SALOME_ResourcesManager.hxx"
 #include "SALOME_ContainerManager.hxx"
 #include "SALOMEconfig.h"
+#include "SALOME_Embedded_NamingService.hxx"
 #include CORBA_CLIENT_HEADER(SALOME_ContainerManager)
 
 #endif
 #include <omniORB4/CORBA.h>
 #include <iostream>
 #include <sstream>
+#include <string>
 #include <cassert>
+#include <memory>
 
 //#define _DEVDEBUG_
 #include "YacsTrace.hxx"
@@ -464,6 +467,38 @@ void RuntimeSALOME::fini()
     }
 }
 
+PyObject *RuntimeSALOME::launchSubProcess(const std::vector<std::string>& cmds)
+{
+  std::ostringstream oss; oss << "from subprocess import Popen" << std::endl;
+  oss << "p = Popen([";
+  for(auto i = 0 ; i < cmds.size() ; ++i)
+  {
+    oss << " " << "\"" << cmds[i] << "\"";
+    if(i < cmds.size()-1)
+      oss << ", ";
+    else
+      oss << " ";
+  }
+  oss << "])";
+  AutoGIL agil;
+  AutoPyRef context = PyDict_New();
+  PyDict_SetItemString( context, "__builtins__", getBuiltins() );
+  std::string errorDetails;
+  try
+  {
+    PythonNode::ExecuteLocalInternal(oss.str().c_str(),context,errorDetails);
+  }
+  catch(const YACS::Exception& e)
+  {
+    std::cerr << e.what() << std::endl << errorDetails << std::endl;
+    throw e;
+  }
+  PyObject *ret = PyDict_GetItemString(context,"p");
+  Py_XINCREF(ret);
+  Py_XINCREF(ret);
+  return ret;
+}
+
 std::vector< std::pair<std::string,int> > RuntimeSALOME::getCatalogOfComputeNodes() const
 {
   CORBA::ORB_ptr orb(getOrb());
@@ -1875,6 +1910,36 @@ CORBA::ORB_ptr RuntimeSALOME::getOrb() const
   return _orb;
 }
 
+/*!
+ * Retrieve from custom NS the entry. Custom NS is supposed to be hosted in current process.
+ * This method try to emulate CORBA ns convention : "corbaname:rir:#test.my_context/Echo.Object" is converted into "Echo"
+ * 
+ * See Engines::EmbeddedNamingService
+ */
+CORBA::Object_var RuntimeSALOME::getFromNS(const char *entry) const
+{
+  CORBA::Object_var ret;
+  std::string entryCpp(entry);
+  if(entryCpp.substr(0,4) == "IOR:")
+  {
+    ret = _orb->string_to_object( entry );
+  }
+  else
+  {
+    auto pos = entryCpp.find_last_of('/');
+    std::string entry1( entryCpp.substr(pos+1,std::string::npos) );
+    pos = entry1.find_last_of('.');
+    std::string entry2( entry1.substr(0,pos) );
+    Engines::EmbeddedNamingService_var ns = GetEmbeddedNamingService();
+    std::unique_ptr<Engines::IORType> iorRet( ns->Resolve( entry2.c_str() ) );
+    auto len = iorRet->length();
+    std::unique_ptr<char[]> iorTrans(new char[len+1]); iorTrans[len] = '\0';
+    for(auto i = 0 ; i < len ; ++i) iorTrans[i] = (*iorRet)[i];
+    ret = _orb->string_to_object(iorTrans.get());
+  }
+  return ret;
+}
+
 PyObject * RuntimeSALOME::getPyOrb() const
 {
   return _pyorb;