]> SALOME platform Git repositories - modules/yacs.git/blob - src/runtime/PythonCORBAConv.cxx
Salome HOME
PR: merge from BR_DATACONV_PR tag "mergeto_trunk_25oct06"
[modules/yacs.git] / src / runtime / PythonCORBAConv.cxx
1
2 #include "PythonCORBAConv.hxx"
3 #include "TypeConversions.hxx"
4 #include "RuntimeSALOME.hxx"
5
6 #include <iostream>
7
8 using namespace YACS::ENGINE;
9 using namespace std;
10
11
12 void PyCorbaInt::put(const void *data)  throw(ConversionException)
13 {
14   put((PyObject *)data);
15 }
16
17 //!Convertit un PyObject de type entier en CORBA::Any entier
18 /*!
19  *   \param data : python object
20  */
21
22 void PyCorbaInt::put(PyObject *data)  throw(ConversionException)
23 {
24   CORBA::Long l= PyLong_AsLong(data);
25   CORBA::Any a;
26   a <<= l;
27   _port->put(&a);
28 }
29
30
31 void PyCorbaString::put(const void *data)  throw(ConversionException)
32 {
33   put((PyObject *)data);
34 }
35
36 //!Convertit un PyObject de type string en CORBA::Any string
37 /*!
38  *   \param data : python object
39  */
40
41 void PyCorbaString::put(PyObject *data)  throw(ConversionException)
42 {
43   char * s=PyString_AsString(data);
44   CORBA::Any a;
45   a <<= s;
46   _port->put(&a);
47 }
48
49
50 void PyCorbaDouble::put(const void *data)  throw(ConversionException)
51 {
52   put((PyObject *)data);
53 }
54
55 //!Convertit un PyObject de type double en CORBA::Any Double
56 /*!
57  *   \param data : python object
58  */
59
60 void PyCorbaDouble::put(PyObject *data)  throw(ConversionException)
61 {
62   CORBA::Double d = 0;
63   if (PyFloat_Check(data))
64     d = (CORBA::Double)PyFloat_AS_DOUBLE(data);
65   else if (PyInt_Check(data))
66     d = (CORBA::Double)PyInt_AS_LONG(data);
67   else
68     d = (CORBA::Double)PyLong_AsDouble(data);
69   CORBA::Any a;
70   a <<= d;
71   _port->put(&a);
72 }
73
74 PyCorbaSequence::PyCorbaSequence(InputCorbaPort* p)
75   : ProxyPort(p), Port(p->getNode())
76 {
77   cerr << "CorbaPySequence" << endl;
78 }
79
80 //!Convertit un PyObject de type Sequence en CORBA::Any Sequence
81 /*!
82  *   \param data : python object
83  */
84
85 void PyCorbaSequence::put(const void *data)  throw(ConversionException)
86 {
87   put((PyObject *)data);
88 }
89
90 void PyCorbaSequence::put(PyObject *data)  throw(ConversionException)
91 {
92   cerr << "PyCorbaSequence::put" << endl;
93   cerr << "data refcnt: " << data->ob_refcnt << endl;
94   PyObject_Print(data,stdout,Py_PRINT_RAW);
95   cerr << endl;
96   int length=PySequence_Size(data);
97   cerr <<"length: " << length << endl;
98   CORBA::Any *a= convertCorbaPyObject(_port->type(),data);
99   _port->put(a);
100 }
101
102
103 PyCorbaObjref::PyCorbaObjref(InputCorbaPort* p)
104   : ProxyPort(p), Port(p->getNode())
105 {
106   _pyorb = getSALOMERuntime()->getPyOrb();
107   _orb = getSALOMERuntime()->getOrb();
108   //  _dynFactory = getSALOMERuntime()->getDynFactory();
109 }
110
111 //!Convertit un PyObject de type Objref en CORBA::Any Objref
112 /*!
113  *   \param data : python object
114  */
115
116 void PyCorbaObjref::put(const void *data)  throw(ConversionException)
117 {
118   put((PyObject *)data);
119 }
120
121 void PyCorbaObjref::put(PyObject *data)  throw(ConversionException)
122 {
123   cerr << "PyCorbaObjref::put" << endl;
124   cerr << "data refcnt: " << data->ob_refcnt << endl;
125   PyObject_Print(data,stdout,Py_PRINT_RAW);
126   cerr << endl;
127
128   //ne marche pas ???
129   //hold_lock is true: caller is supposed to hold the GIL. 
130   //omniorb will not take the GIL
131   //CORBA::Object_ptr ob=api->pyObjRefToCxxObjRef(data,(CORBA::Boolean)1);
132
133   PyObject_Print(_pyorb,stdout,Py_PRINT_RAW);
134   cerr << endl;
135   PyObject *pystring = PyObject_CallMethod(_pyorb, "object_to_string", "O", data);
136   if(pystring == NULL)
137     {
138       PyErr_Print();
139       throw Exception("not possible to get objref");
140     }
141
142   PyObject_Print(pystring,stdout,Py_PRINT_RAW);
143   cerr << endl;
144   CORBA::Object_ptr ob= _orb->string_to_object(PyString_AsString(pystring));
145   Py_DECREF(pystring);
146   cerr << "data refcnt: " << data->ob_refcnt << endl;
147
148   CORBA::Any a;
149   a <<= ob;
150   _port->put(&a);
151 }
152