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