]> SALOME platform Git repositories - modules/yacs.git/blob - src/evalyfx/YACSEvalSession.cxx
Salome HOME
Deleted deprecated code
[modules/yacs.git] / src / evalyfx / YACSEvalSession.cxx
1 // Copyright (C) 2012-2016  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Anthony Geay (EDF R&D)
20
21 #include "YACSEvalSession.hxx"
22 #include "YACSEvalSessionInternal.hxx"
23
24 #include "AutoGIL.hxx"
25 #include "Exception.hxx"
26
27 #include <Python.h>
28
29 #include <sstream>
30
31 const char YACSEvalSession::KERNEL_ROOT_DIR[]="KERNEL_ROOT_DIR";
32
33 const char YACSEvalSession::CORBA_CONFIG_ENV_VAR_NAME[]="OMNIORB_CONFIG";
34
35 const char YACSEvalSession::NSPORT_VAR_NAME[]="NSPORT";
36
37 YACSEvalSession::YACSEvalSession():_isAttached(false),_isLaunched(false),_isForcedPyThreadSaved(false),_port(-1),_salomeInstanceModule(0),_salomeInstance(0),_internal(new YACSEvalSessionInternal)
38 {
39   if(!Py_IsInitialized())
40     Py_Initialize();
41   //
42   {
43     YACS::ENGINE::AutoGIL gal;
44     _salomeInstanceModule=PyImport_ImportModule(const_cast<char *>("salome_instance"));
45   }
46 }
47
48 YACSEvalSession::~YACSEvalSession()
49 {
50   delete _internal;
51   YACS::ENGINE::AutoGIL gal;
52   if(isLaunched() && !isAttached())
53     {
54       YACS::ENGINE::AutoPyRef terminateSession(PyObject_GetAttrString(_salomeInstance,const_cast<char *>("stop")));//new
55       YACS::ENGINE::AutoPyRef res(PyObject_CallObject(terminateSession,0));
56     }
57   Py_XDECREF(_salomeInstance);
58   Py_XDECREF(_salomeInstanceModule);
59 }
60
61 void YACSEvalSession::launch()
62 {
63   if(isLaunched())
64     return ;
65   YACS::ENGINE::AutoGIL gal;
66   PyObject *salomeInstance(PyObject_GetAttrString(_salomeInstanceModule,const_cast<char *>("SalomeInstance")));//new
67   PyObject *startMeth(PyObject_GetAttrString(salomeInstance,const_cast<char *>("start")));
68   Py_XDECREF(salomeInstance);
69   YACS::ENGINE::AutoPyRef myArgs(PyTuple_New(0));//new
70   YACS::ENGINE::AutoPyRef myKWArgs(PyDict_New());//new
71   PyDict_SetItemString(myKWArgs,"shutdown_servers",Py_True);//Py_True ref not stolen
72   _salomeInstance=PyObject_Call(startMeth,myArgs,myKWArgs);//new
73   YACS::ENGINE::AutoPyRef getPortMeth(PyObject_GetAttrString(_salomeInstance,const_cast<char *>("get_port")));//new
74   YACS::ENGINE::AutoPyRef portPy(PyObject_CallObject(getPortMeth,0));//new
75   _port=PyInt_AsLong(portPy);
76   //
77   int dummy;
78   _corbaConfigFileName=GetConfigAndPort(dummy);
79   _isAttached=false; _isLaunched=true;
80 }
81
82 void YACSEvalSession::launchUsingCurrentSession()
83 {
84   if(isLaunched())
85     return ;
86   YACS::ENGINE::AutoGIL gal;
87   _corbaConfigFileName=GetConfigAndPort(_port);
88   _isAttached=true; _isLaunched=true;
89 }
90
91 bool YACSEvalSession::isAlreadyPyThreadSaved() const
92 {
93   if(!_isForcedPyThreadSaved)
94     return isAttached();
95   else
96     return true;
97 }
98
99 void YACSEvalSession::checkLaunched() const
100 {
101   if(!isLaunched())
102     throw YACS::Exception("YACSEvalSession::checkLaunched : not launched !");
103 }
104
105 int YACSEvalSession::getPort() const
106 {
107   checkLaunched();
108   return _port;
109 }
110
111 std::string YACSEvalSession::getCorbaConfigFileName() const
112 {
113   checkLaunched();
114   return _corbaConfigFileName;
115 }
116
117 std::string YACSEvalSession::GetPathToAdd()
118 {
119   std::string ret;
120   YACS::ENGINE::AutoGIL gal;
121   YACS::ENGINE::AutoPyRef osPy(PyImport_ImportModule(const_cast<char *>("os")));//new
122   PyObject *kernelRootDir(0);// os.environ["KERNEL_ROOT_DIR"]
123   {
124     YACS::ENGINE::AutoPyRef environPy(PyObject_GetAttrString(osPy,const_cast<char *>("environ")));//new
125     YACS::ENGINE::AutoPyRef kernelRootDirStr(PyString_FromString(const_cast<char *>(KERNEL_ROOT_DIR)));//new
126     kernelRootDir=PyObject_GetItem(environPy,kernelRootDirStr);//new
127   }
128   {
129     YACS::ENGINE::AutoPyRef pathPy(PyObject_GetAttrString(osPy,const_cast<char *>("path")));//new
130     YACS::ENGINE::AutoPyRef joinPy(PyObject_GetAttrString(pathPy,const_cast<char *>("join")));//new
131     YACS::ENGINE::AutoPyRef myArgs(PyTuple_New(4));
132     Py_XINCREF(kernelRootDir); PyTuple_SetItem(myArgs,0,kernelRootDir);
133     PyTuple_SetItem(myArgs,1,PyString_FromString(const_cast<char *>("bin")));
134     PyTuple_SetItem(myArgs,2,PyString_FromString(const_cast<char *>("salome")));
135     PyTuple_SetItem(myArgs,3,PyString_FromString(const_cast<char *>("appliskel")));
136     YACS::ENGINE::AutoPyRef res(PyObject_CallObject(joinPy,myArgs));
137     ret=PyString_AsString(res);
138   }
139   Py_XDECREF(kernelRootDir);
140   return ret;
141 }
142
143 std::string YACSEvalSession::GetConfigAndPort(int& port)
144 {
145   YACS::ENGINE::AutoPyRef osPy(PyImport_ImportModule(const_cast<char *>("os")));//new
146   YACS::ENGINE::AutoPyRef environPy(PyObject_GetAttrString(osPy,const_cast<char *>("environ")));//new
147   //
148   YACS::ENGINE::AutoPyRef corbaConfigStr(PyString_FromString(const_cast<char *>(CORBA_CONFIG_ENV_VAR_NAME)));//new
149   YACS::ENGINE::AutoPyRef corbaConfigFileNamePy(PyObject_GetItem(environPy,corbaConfigStr));//new
150   std::string ret(PyString_AsString(corbaConfigFileNamePy));
151   //
152   YACS::ENGINE::AutoPyRef nsPortStr(PyString_FromString(const_cast<char *>(NSPORT_VAR_NAME)));//new
153   YACS::ENGINE::AutoPyRef nsPortValuePy(PyObject_GetItem(environPy,nsPortStr));//new
154   std::string portStr(PyString_AsString(nsPortValuePy));
155   std::istringstream iss(portStr);
156   iss >> port;
157   return ret;
158 }