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