Merge commit 'origin/bug_138_networkwizard_fixes' into experimental
[enigma2.git] / lib / python / python.h
1 #ifndef __lib_python_python_class_h
2
3 #ifndef SKIP_PART2
4         #define __lib_python_python_class_h
5 #endif
6
7 #include <Python.h>
8 #include <string>
9 #include <lib/base/object.h>
10
11 #if !defined(SKIP_PART1) && !defined(SWIG)
12 class ePyObject
13 {
14         PyObject *m_ob;
15 #ifdef PYTHON_REFCOUNT_DEBUG
16         const char *m_file;
17         int m_line, m_from, m_to;
18         bool m_erased;
19 #endif
20 public:
21         inline ePyObject();
22         inline ePyObject(const ePyObject &ob);
23         inline ePyObject(PyObject *ob);
24 #ifdef PYTHON_REFCOUNT_DEBUG
25         inline ePyObject(PyObject *ob, const char *file, int line);
26 #endif
27         inline ePyObject(PyVarObject *ob);
28         inline ePyObject(PyDictObject *ob);
29         inline ePyObject(PyTupleObject *ob);
30         inline ePyObject(PyListObject *ob);
31         inline ePyObject(PyStringObject *ob);
32         operator bool() const { return !!m_ob; }
33         operator bool() { return !!m_ob; }
34         ePyObject &operator=(const ePyObject &);
35         ePyObject &operator=(PyObject *);
36         ePyObject &operator=(PyVarObject *ob) { return operator=((PyObject*)ob); }
37         ePyObject &operator=(PyDictObject *ob) { return operator=((PyObject*)ob); }
38         ePyObject &operator=(PyTupleObject *ob) { return operator=((PyObject*)ob); }
39         ePyObject &operator=(PyListObject *ob) { return operator=((PyObject*)ob); }
40         ePyObject &operator=(PyStringObject *ob) { return operator=((PyObject*)ob); }
41         operator PyObject*();
42         operator PyVarObject*() { return (PyVarObject*)operator PyVarObject*(); }
43         operator PyTupleObject*() { return (PyTupleObject*)operator PyObject*(); }
44         operator PyListObject*() { return (PyListObject*)operator PyObject*(); }
45         operator PyStringObject*() { return (PyStringObject*)operator PyObject*(); }
46         operator PyDictObject*() { return (PyDictObject*)operator PyObject*(); }
47         PyObject *operator->() { return operator PyObject*(); }
48 #ifdef PYTHON_REFCOUNT_DEBUG
49         void incref(const char *file, int line);
50         void decref(const char *file, int line);
51 #else
52         void incref();
53         void decref();
54 #endif
55 };
56
57 inline ePyObject::ePyObject()
58         :m_ob(0)
59 #ifdef PYTHON_REFCOUNT_DEBUG
60         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
61 #endif
62 {
63 }
64
65 inline ePyObject::ePyObject(const ePyObject &ob)
66         :m_ob(ob.m_ob)
67 #ifdef PYTHON_REFCOUNT_DEBUG
68         ,m_file(ob.m_file), m_line(ob.m_line)
69         ,m_from(ob.m_from), m_to(ob.m_to), m_erased(ob.m_erased)
70 #endif
71 {
72 }
73
74 inline ePyObject::ePyObject(PyObject *ob)
75         :m_ob(ob)
76 #ifdef PYTHON_REFCOUNT_DEBUG
77         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
78 #endif
79 {
80 }
81
82 #ifdef PYTHON_REFCOUNT_DEBUG
83 inline ePyObject::ePyObject(PyObject *ob, const char* file, int line)
84         :m_ob(ob)
85         ,m_file(file), m_line(line), m_from(ob->ob_refcnt), m_to(ob->ob_refcnt), m_erased(false)
86 {
87 }
88 #endif
89
90 inline ePyObject::ePyObject(PyVarObject *ob)
91         :m_ob((PyObject*)ob)
92 #ifdef PYTHON_REFCOUNT_DEBUG
93         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
94 #endif
95 {
96 }
97
98 inline ePyObject::ePyObject(PyDictObject *ob)
99         :m_ob((PyObject*)ob)
100 #ifdef PYTHON_REFCOUNT_DEBUG
101         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
102 #endif
103 {
104 }
105
106 inline ePyObject::ePyObject(PyTupleObject *ob)
107         :m_ob((PyObject*)ob)
108 #ifdef PYTHON_REFCOUNT_DEBUG
109         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
110 #endif
111 {
112 }
113
114 inline ePyObject::ePyObject(PyListObject *ob)
115         :m_ob((PyObject*)ob)
116 #ifdef PYTHON_REFCOUNT_DEBUG
117         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
118 #endif
119 {
120 }
121
122 inline ePyObject::ePyObject(PyStringObject *ob)
123         :m_ob((PyObject*)ob)
124 #ifdef PYTHON_REFCOUNT_DEBUG
125         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
126 #endif
127 {
128 }
129
130 #ifndef PYTHON_REFCOUNT_DEBUG
131 inline ePyObject &ePyObject::operator=(PyObject *ob)
132 {
133         m_ob=ob;
134         return *this;
135 }
136
137 inline ePyObject &ePyObject::operator=(const ePyObject &ob)
138 {
139         m_ob=ob.m_ob;
140         return *this;
141 }
142
143 inline ePyObject::operator PyObject*()
144 {
145         return m_ob;
146 }
147
148 inline void ePyObject::incref()
149 {
150         Py_INCREF(m_ob);
151 }
152
153 inline void ePyObject::decref()
154 {
155         Py_DECREF(m_ob);
156 }
157
158 class ePyObjectWrapper
159 {
160         ePyObject m_obj;
161 public:
162         ePyObjectWrapper(const ePyObjectWrapper &wrapper)
163                 :m_obj(wrapper.m_obj)
164         {
165                 Py_INCREF(m_obj);
166         }
167         ePyObjectWrapper(const ePyObject &obj)
168                 :m_obj(obj)
169         {
170                 Py_INCREF(m_obj);
171         }
172         ~ePyObjectWrapper()
173         {
174                 Py_DECREF(m_obj);
175         }
176         ePyObjectWrapper &operator=(const ePyObjectWrapper &wrapper)
177         {
178                 Py_DECREF(m_obj);
179                 m_obj = wrapper.m_obj;
180                 Py_INCREF(m_obj);
181                 return *this;
182         }
183         operator PyObject*()
184         {
185                 return m_obj;
186         }
187         operator ePyObject()
188         {
189                 return m_obj;
190         }
191 };
192
193 #endif // ! PYTHON_REFCOUNT_DEBUG
194
195 #endif  // !SWIG && !SKIP_PART1
196
197 #ifndef SKIP_PART2
198 #ifndef SWIG
199 #ifdef PYTHON_REFCOUNT_DEBUG
200 inline void Impl_Py_DECREF(const char* file, int line, const ePyObject &obj)
201 {
202         ((ePyObject*)(&obj))->decref(file, line);
203 }
204
205 inline void Impl_Py_INCREF(const char* file, int line, const ePyObject &obj)
206 {
207         ((ePyObject*)(&obj))->incref(file, line);
208 }
209
210 inline void Impl_Py_XDECREF(const char* file, int line, const ePyObject &obj)
211 {
212         if (obj)
213                 ((ePyObject*)(&obj))->decref(file, line);
214 }
215
216 inline void Impl_Py_XINCREF(const char* file, int line, const ePyObject &obj)
217 {
218         if (obj)
219                 ((ePyObject*)(&obj))->incref(file, line);
220 }
221
222 inline ePyObject Impl_PyTuple_New(const char* file, int line, int elements=0)
223 {
224         return ePyObject(PyTuple_New(elements), file, line);
225 }
226
227 inline ePyObject Impl_PyList_New(const char* file, int line, int elements=0)
228 {
229         return ePyObject(PyList_New(elements), file, line);
230 }
231
232 inline ePyObject Impl_PyDict_New(const char* file, int line)
233 {
234         return ePyObject(PyDict_New(), file, line);
235 }
236
237 inline ePyObject Impl_PyString_FromString(const char* file, int line, const char *str)
238 {
239         return ePyObject(PyString_FromString(str), file, line);
240 }
241
242 inline ePyObject Impl_PyString_FromFormat(const char* file, int line, const char *fmt, ...)
243 {
244         va_list ap;
245         va_start(ap, fmt);
246         PyObject *ob = PyString_FromFormatV(fmt, ap);
247         va_end(ap);
248         return ePyObject(ob, file, line);
249 }
250
251 inline ePyObject Impl_PyInt_FromLong(const char* file, int line, long val)
252 {
253         return ePyObject(PyInt_FromLong(val), file, line);
254 }
255
256 inline ePyObject Impl_PyLong_FromLong(const char* file, int line, long val)
257 {
258         return ePyObject(PyLong_FromLong(val), file, line);
259 }
260
261 inline ePyObject Impl_PyLong_FromUnsignedLong(const char* file, int line, unsigned long val)
262 {
263         return ePyObject(PyLong_FromUnsignedLong(val), file, line);
264 }
265
266 inline ePyObject Impl_PyLong_FromLongLong(const char* file, int line, long long val)
267 {
268         return ePyObject(PyLong_FromLongLong(val), file, line);
269 }
270
271 inline ePyObject Impl_PyList_GET_ITEM(const char *file, int line, ePyObject list, unsigned int pos)
272 {
273         return ePyObject(PyList_GET_ITEM(list, pos), file, line);
274 }
275
276 inline ePyObject Impl_PyTuple_GET_ITEM(const char *file, int line, ePyObject list, unsigned int pos)
277 {
278         return ePyObject(PyTuple_GET_ITEM(list, pos), file, line);
279 }
280 #else
281 inline void Impl_Py_DECREF(const ePyObject &obj)
282 {
283         ((ePyObject*)(&obj))->decref();
284 }
285
286 inline void Impl_Py_INCREF(const ePyObject &obj)
287 {
288         ((ePyObject*)(&obj))->incref();
289 }
290
291 inline void Impl_Py_XDECREF(const ePyObject &obj)
292 {
293         if (obj)
294                 ((ePyObject*)(&obj))->decref();
295 }
296
297 inline void Impl_Py_XINCREF(const ePyObject &obj)
298 {
299         if (obj)
300                 ((ePyObject*)(&obj))->incref();
301 }
302
303 inline ePyObject Impl_PyTuple_New(int elements=0)
304 {
305         return PyTuple_New(elements);
306 }
307
308 inline ePyObject Impl_PyList_New(int elements=0)
309 {
310         return PyList_New(elements);
311 }
312
313 inline ePyObject Impl_PyDict_New()
314 {
315         return PyDict_New();
316 }
317
318 inline ePyObject Impl_PyString_FromString(const char *str)
319 {
320         return PyString_FromString(str);
321 }
322
323 inline ePyObject Impl_PyString_FromFormat(const char *fmt, ...)
324 {
325         va_list ap;
326         va_start(ap, fmt);
327         PyObject *ob = PyString_FromFormatV(fmt, ap);
328         va_end(ap);
329         return ePyObject(ob);
330 }
331
332 inline ePyObject Impl_PyInt_FromLong(long val)
333 {
334         return PyInt_FromLong(val);
335 }
336
337 inline ePyObject Impl_PyLong_FromLong(long val)
338 {
339         return PyLong_FromLong(val);
340 }
341
342 inline ePyObject Impl_PyLong_FromUnsignedLong(unsigned long val)
343 {
344         return PyLong_FromUnsignedLong(val);
345 }
346
347 inline ePyObject Impl_PyLong_FromLongLong(long long val)
348 {
349         return PyLong_FromLongLong(val);
350 }
351
352 inline ePyObject Impl_PyList_GET_ITEM(ePyObject list, unsigned int pos)
353 {
354         return PyList_GET_ITEM(list, pos);
355 }
356
357 inline ePyObject Impl_PyTuple_GET_ITEM(ePyObject list, unsigned int pos)
358 {
359         return PyTuple_GET_ITEM(list, pos);
360 }
361 #endif
362
363 inline void Impl_INCREF(PyObject *ob)
364 {
365         Py_INCREF(ob);
366 }
367
368 inline void Impl_DECREF(PyObject *ob)
369 {
370         Py_DECREF(ob);
371 }
372 #define Org_Py_INCREF(obj) Impl_INCREF(obj)
373 #define Org_Py_DECREF(obj) Impl_DECREF(obj)
374 #undef Py_DECREF
375 #undef Py_XDECREF
376 #undef Py_INCREF
377 #undef Py_XINCREF
378 #undef PyList_GET_ITEM
379 #undef PyTuple_GET_ITEM
380 #ifdef PYTHON_REFCOUNT_DEBUG
381 #define Py_DECREF(obj) Impl_Py_DECREF(__FILE__, __LINE__, obj)
382 #define Py_XDECREF(obj) Impl_Py_XDECREF(__FILE__, __LINE__, obj)
383 #define Py_INCREF(obj) Impl_Py_INCREF(__FILE__, __LINE__, obj)
384 #define Py_XINCREF(obj) Impl_Py_XINCREF(__FILE__, __LINE__, obj)
385 #define PyList_New(args...) Impl_PyList_New(__FILE__, __LINE__, args)
386 #define PyTuple_New(args...) Impl_PyTuple_New(__FILE__, __LINE__, args)
387 #define PyDict_New(...) Impl_PyDict_New(__FILE__, __LINE__)
388 #define PyString_FromString(str) Impl_PyString_FromString(__FILE__, __LINE__, str)
389 #define PyString_FromFormat(str, args...) Impl_PyString_FromFormat(__FILE__, __LINE__, str, args)
390 #define PyInt_FromLong(val) Impl_PyInt_FromLong(__FILE__, __LINE__, val)
391 #define PyLong_FromLong(val) Impl_PyLong_FromLong(__FILE__, __LINE__, val)
392 #define PyLong_FromUnsignedLong(val) Impl_PyLong_FromUnsignedLong(__FILE__, __LINE__, val)
393 #define PyLong_FromLongLong(val) Impl_PyLong_FromLongLong(__FILE__, __LINE__, val)
394 #define PyList_GET_ITEM(list, pos) Impl_PyList_GET_ITEM(__FILE__, __LINE__, list, pos)
395 #define PyTuple_GET_ITEM(list, pos) Impl_PyTuple_GET_ITEM(__FILE__, __LINE__, list, pos)
396 #else
397 #define Py_DECREF(obj) Impl_Py_DECREF(obj)
398 #define Py_XDECREF(obj) Impl_Py_XDECREF(obj)
399 #define Py_INCREF(obj) Impl_Py_INCREF(obj)
400 #define Py_XINCREF(obj) Impl_Py_XINCREF(obj)
401 #define PyList_New(args...) Impl_PyList_New(args)
402 #define PyTuple_New(args...) Impl_PyTuple_New(args)
403 #define PyDict_New(...) Impl_PyDict_New()
404 #define PyString_FromString(str) Impl_PyString_FromString(str)
405 #define PyString_FromFormat(str, args...) Impl_PyString_FromFormat(str, args)
406 #define PyInt_FromLong(val) Impl_PyInt_FromLong(val)
407 #define PyLong_FromLong(val) Impl_PyLong_FromLong(val)
408 #define PyLong_FromUnsignedLong(val) Impl_PyLong_FromUnsignedLong(val)
409 #define PyLong_FromLongLong(val) Impl_PyLong_FromLongLong(val)
410 #define PyList_GET_ITEM(list, pos) Impl_PyList_GET_ITEM(list, pos)
411 #define PyTuple_GET_ITEM(list, pos) Impl_PyTuple_GET_ITEM(list, pos)
412 #endif
413
414 class ePython
415 {
416 public:
417         ePython();
418         ~ePython();
419         int execFile(const char *file);
420         int execute(const std::string &pythonfile, const std::string &funcname);
421         static int call(ePyObject pFunc, ePyObject args);
422         static ePyObject resolve(const std::string &pythonfile, const std::string &funcname);
423 private:
424 };
425
426 #endif // SWIG
427 #endif // SKIP_PART2
428 #endif // __lib_python_python_class_h