5 #define protected public
6 #include <omniORB4/CORBA.h>
7 #include <omniORB4/internal/typecode.h>
10 #include "PythonCORBAConv.hxx"
11 #include "TypeConversions.hxx"
12 #include "RuntimeSALOME.hxx"
17 #include "YacsTrace.hxx"
19 using namespace YACS::ENGINE;
22 /*!Convert a PyObject (integer) to CORBA::Any (integer)
23 * It's only a wrapper around put(PyObject *data)
25 void PyCorbaInt::put(const void *data) throw(ConversionException)
27 put((PyObject *)data);
30 //!Convert a PyObject (integer) to CORBA::Any (integer)
32 * \param data : python object
34 void PyCorbaInt::put(PyObject *data) throw(ConversionException)
37 if (PyInt_Check(data))l=PyInt_AS_LONG(data);
38 else if(PyLong_Check(data))l=PyLong_AsLong(data);
39 else throw ConversionException("Not an int");
46 //!Convert a PyObject (boolean) to CORBA::Any (boolean)
48 * It's only a wrapper around PyCorbaBool::put(PyObject *data)
50 * \param data : python object
52 void PyCorbaBool::put(const void *data) throw(ConversionException)
54 put((PyObject *)data);
57 //!Convert a PyObject (boolean) to CORBA::Any (boolean)
59 * Convert it and push it to proxy port
61 * \param data : python object
63 void PyCorbaBool::put(PyObject *data) throw(ConversionException)
65 CORBA::Any *a= convertPyObjectCorba(_port->edGetType(),data);
67 //delete Any that has been allocated by convertPyObjectCorba
71 void PyCorbaString::put(const void *data) throw(ConversionException)
73 put((PyObject *)data);
76 //!Convert a PyObject (string) to CORBA::Any (string)
78 * \param data : python object
81 void PyCorbaString::put(PyObject *data) throw(ConversionException)
84 if(PyString_Check(data))s=PyString_AsString(data);
85 else throw ConversionException("Not a string");
93 void PyCorbaDouble::put(const void *data) throw(ConversionException)
95 put((PyObject *)data);
98 //!Convert a PyObject (double) to CORBA::Any (double)
100 * \param data : python object
103 void PyCorbaDouble::put(PyObject *data) throw(ConversionException)
106 if (PyFloat_Check(data)) d = (CORBA::Double)PyFloat_AS_DOUBLE(data);
107 else if (PyInt_Check(data)) d = (CORBA::Double)PyInt_AS_LONG(data);
108 else if (PyLong_Check(data)) d = (CORBA::Double)PyLong_AsDouble(data);
109 else throw ConversionException("Not a double");
116 //!Class PyCorbaSequence is a proxy port that converts a PyObject object (of type sequence) to a CORBA::Any object (of type sequence)
118 * \param p : the input CORBA port to adapt to Python output port
120 PyCorbaSequence::PyCorbaSequence(InputCorbaPort* p)
121 : ProxyPort(p), DataPort(p->getName(), p->getNode(), p->edGetType()), Port(p->getNode())
125 //!Convert a PyObject (sequence) to CORBA::Any (sequence)
127 * \param data : python object
130 void PyCorbaSequence::put(const void *data) throw(ConversionException)
132 put((PyObject *)data);
135 void PyCorbaSequence::put(PyObject *data) throw(ConversionException)
137 DEBTRACE("data refcnt: " << data->ob_refcnt);
139 PyObject_Print(data,stderr,Py_PRINT_RAW);
140 std::cerr << std::endl;
142 CORBA::Any *a= convertPyObjectCorba(_port->edGetType(),data);
145 DEBTRACE("refcount CORBA seqTC: " << ((omni::TypeCode_base*)a->pd_tc.in())->pd_ref_count);
147 //delete Any that has been allocated by convertPyObjectCorba
150 DEBTRACE("refcount CORBA seqTC: " << ((omni::TypeCode_base*)((InputCorbaPort*)_port)->getAny()->pd_tc.in())->pd_ref_count);
154 //!Class PyCorbaObjref is a proxy port that converts a PyObject object (of type objref) to a CORBA::Any object (of type objref)
156 * \param p : the input CORBA port to adapt to Python output port
158 PyCorbaObjref::PyCorbaObjref(InputCorbaPort* p)
159 : ProxyPort(p), DataPort(p->getName(), p->getNode(), p->edGetType()), Port(p->getNode())
161 _pyorb = getSALOMERuntime()->getPyOrb();
162 _orb = getSALOMERuntime()->getOrb();
163 // _dynFactory = getSALOMERuntime()->getDynFactory();
166 //!Convert a PyObject (Objref) to CORBA::Any (Objref)
168 * \param data : python object
171 void PyCorbaObjref::put(const void *data) throw(ConversionException)
173 put((PyObject *)data);
176 void PyCorbaObjref::put(PyObject *data) throw(ConversionException)
178 DEBTRACE("data refcnt: " << data->ob_refcnt);
180 PyObject_Print(data,stderr,Py_PRINT_RAW);
181 std::cerr << std::endl;
184 //does not work : replace by a call to object_to_string - string_to_object
185 //hold_lock is true: caller is supposed to hold the GIL.
186 //omniorb will not take the GIL
187 //CORBA::Object_ptr ob=api->pyObjRefToCxxObjRef(data,(CORBA::Boolean)1);
189 PyObject *pystring = PyObject_CallMethod(_pyorb, "object_to_string", "O", data);
193 throw ConversionException("can't get objref");
195 CORBA::Object_var ob= _orb->string_to_object(PyString_AsString(pystring));
203 //!Class PyCorbaStruct is a proxy port that converts a PyObject object (of type struct) to a CORBA::Any object (of type struct)
205 * \param p : the input CORBA port to adapt to Python output port
207 PyCorbaStruct::PyCorbaStruct(InputCorbaPort* p)
208 : ProxyPort(p), DataPort(p->getName(), p->getNode(), p->edGetType()), Port(p->getNode())
212 void PyCorbaStruct::put(const void *data) throw(ConversionException)
214 put((PyObject *)data);
217 //!Convert a PyObject (struct) to CORBA::Any (struct)
219 * \param data : python object
221 void PyCorbaStruct::put(PyObject *data) throw(ConversionException)
223 DEBTRACE("data refcnt: " << data->ob_refcnt);
225 PyObject_Print(data,stderr,Py_PRINT_RAW);
226 std::cerr << std::endl;
228 CORBA::Any *a= convertPyObjectCorba(_port->edGetType(),data);
231 DEBTRACE("refcount CORBA structTC: " << ((omni::TypeCode_base*)a->pd_tc.in())->pd_ref_count);
233 //delete Any that has been allocated by convertPyObjectCorba
236 DEBTRACE("refcount CORBA structTC: " << ((omni::TypeCode_base*)((InputCorbaPort*)_port)->getAny()->pd_tc.in())->pd_ref_count);