some more work on plugin manager
[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 #endif // ! PYTHON_REFCOUNT_DEBUG
159
160 #endif  // !SWIG && !SKIP_PART1
161
162 #ifndef SKIP_PART2
163 #ifndef SWIG
164 #ifdef PYTHON_REFCOUNT_DEBUG
165 inline void Impl_Py_DECREF(const char* file, int line, const ePyObject &obj)
166 {
167         ((ePyObject*)(&obj))->decref(file, line);
168 }
169
170 inline void Impl_Py_INCREF(const char* file, int line, const ePyObject &obj)
171 {
172         ((ePyObject*)(&obj))->incref(file, line);
173 }
174
175 inline void Impl_Py_XDECREF(const char* file, int line, const ePyObject &obj)
176 {
177         if (obj)
178                 ((ePyObject*)(&obj))->decref(file, line);
179 }
180
181 inline void Impl_Py_XINCREF(const char* file, int line, const ePyObject &obj)
182 {
183         if (obj)
184                 ((ePyObject*)(&obj))->incref(file, line);
185 }
186
187 inline ePyObject Impl_PyTuple_New(const char* file, int line, int elements=0)
188 {
189         return ePyObject(PyTuple_New(elements), file, line);
190 }
191
192 inline ePyObject Impl_PyList_New(const char* file, int line, int elements=0)
193 {
194         return ePyObject(PyList_New(elements), file, line);
195 }
196
197 inline ePyObject Impl_PyDict_New(const char* file, int line)
198 {
199         return ePyObject(PyDict_New(), file, line);
200 }
201
202 inline ePyObject Impl_PyString_FromString(const char* file, int line, const char *str)
203 {
204         return ePyObject(PyString_FromString(str), file, line);
205 }
206
207 inline ePyObject Impl_PyString_FromFormat(const char* file, int line, const char *fmt, ...)
208 {
209         va_list ap;
210         va_start(ap, fmt);
211         PyObject *ob = PyString_FromFormatV(fmt, ap);
212         va_end(ap);
213         return ePyObject(ob, file, line);
214 }
215
216 inline ePyObject Impl_PyInt_FromLong(const char* file, int line, long val)
217 {
218         return ePyObject(PyInt_FromLong(val), file, line);
219 }
220
221 inline ePyObject Impl_PyLong_FromLong(const char* file, int line, long val)
222 {
223         return ePyObject(PyLong_FromLong(val), file, line);
224 }
225
226 inline ePyObject Impl_PyLong_FromUnsignedLong(const char* file, int line, unsigned long val)
227 {
228         return ePyObject(PyLong_FromUnsignedLong(val), file, line);
229 }
230
231 inline ePyObject Impl_PyLong_FromLongLong(const char* file, int line, long long val)
232 {
233         return ePyObject(PyLong_FromLongLong(val), file, line);
234 }
235
236 inline ePyObject Impl_PyList_GET_ITEM(const char *file, int line, ePyObject list, unsigned int pos)
237 {
238         return ePyObject(PyList_GET_ITEM(list, pos), file, line);
239 }
240
241 inline ePyObject Impl_PyTuple_GET_ITEM(const char *file, int line, ePyObject list, unsigned int pos)
242 {
243         return ePyObject(PyTuple_GET_ITEM(list, pos), file, line);
244 }
245 #else
246 inline void Impl_Py_DECREF(const ePyObject &obj)
247 {
248         ((ePyObject*)(&obj))->decref();
249 }
250
251 inline void Impl_Py_INCREF(const ePyObject &obj)
252 {
253         ((ePyObject*)(&obj))->incref();
254 }
255
256 inline void Impl_Py_XDECREF(const ePyObject &obj)
257 {
258         if (obj)
259                 ((ePyObject*)(&obj))->decref();
260 }
261
262 inline void Impl_Py_XINCREF(const ePyObject &obj)
263 {
264         if (obj)
265                 ((ePyObject*)(&obj))->incref();
266 }
267
268 inline ePyObject Impl_PyTuple_New(int elements=0)
269 {
270         return PyTuple_New(elements);
271 }
272
273 inline ePyObject Impl_PyList_New(int elements=0)
274 {
275         return PyList_New(elements);
276 }
277
278 inline ePyObject Impl_PyDict_New()
279 {
280         return PyDict_New();
281 }
282
283 inline ePyObject Impl_PyString_FromString(const char *str)
284 {
285         return PyString_FromString(str);
286 }
287
288 inline ePyObject Impl_PyString_FromFormat(const char *fmt, ...)
289 {
290         va_list ap;
291         va_start(ap, fmt);
292         PyObject *ob = PyString_FromFormatV(fmt, ap);
293         va_end(ap);
294         return ePyObject(ob);
295 }
296
297 inline ePyObject Impl_PyInt_FromLong(long val)
298 {
299         return PyInt_FromLong(val);
300 }
301
302 inline ePyObject Impl_PyLong_FromLong(long val)
303 {
304         return PyLong_FromLong(val);
305 }
306
307 inline ePyObject Impl_PyLong_FromUnsignedLong(unsigned long val)
308 {
309         return PyLong_FromUnsignedLong(val);
310 }
311
312 inline ePyObject Impl_PyLong_FromLongLong(long long val)
313 {
314         return PyLong_FromLongLong(val);
315 }
316
317 inline ePyObject Impl_PyList_GET_ITEM(ePyObject list, unsigned int pos)
318 {
319         return PyList_GET_ITEM(list, pos);
320 }
321
322 inline ePyObject Impl_PyTuple_GET_ITEM(ePyObject list, unsigned int pos)
323 {
324         return PyTuple_GET_ITEM(list, pos);
325 }
326 #endif
327
328 inline void Impl_INCREF(PyObject *ob)
329 {
330         Py_INCREF(ob);
331 }
332
333 inline void Impl_DECREF(PyObject *ob)
334 {
335         Py_DECREF(ob);
336 }
337 #define Org_Py_INCREF(obj) Impl_INCREF(obj)
338 #define Org_Py_DECREF(obj) Impl_DECREF(obj)
339 #undef Py_DECREF
340 #undef Py_XDECREF
341 #undef Py_INCREF
342 #undef Py_XINCREF
343 #undef PyList_GET_ITEM
344 #undef PyTuple_GET_ITEM
345 #ifdef PYTHON_REFCOUNT_DEBUG
346 #define Py_DECREF(obj) Impl_Py_DECREF(__FILE__, __LINE__, obj)
347 #define Py_XDECREF(obj) Impl_Py_XDECREF(__FILE__, __LINE__, obj)
348 #define Py_INCREF(obj) Impl_Py_INCREF(__FILE__, __LINE__, obj)
349 #define Py_XINCREF(obj) Impl_Py_XINCREF(__FILE__, __LINE__, obj)
350 #define PyList_New(args...) Impl_PyList_New(__FILE__, __LINE__, args)
351 #define PyTuple_New(args...) Impl_PyTuple_New(__FILE__, __LINE__, args)
352 #define PyDict_New(...) Impl_PyDict_New(__FILE__, __LINE__)
353 #define PyString_FromString(str) Impl_PyString_FromString(__FILE__, __LINE__, str)
354 #define PyString_FromFormat(str, args...) Impl_PyString_FromFormat(__FILE__, __LINE__, str, args)
355 #define PyInt_FromLong(val) Impl_PyInt_FromLong(__FILE__, __LINE__, val)
356 #define PyLong_FromLong(val) Impl_PyLong_FromLong(__FILE__, __LINE__, val)
357 #define PyLong_FromUnsignedLong(val) Impl_PyLong_FromUnsignedLong(__FILE__, __LINE__, val)
358 #define PyLong_FromLongLong(val) Impl_PyLong_FromLongLong(__FILE__, __LINE__, val)
359 #define PyList_GET_ITEM(list, pos) Impl_PyList_GET_ITEM(__FILE__, __LINE__, list, pos)
360 #define PyTuple_GET_ITEM(list, pos) Impl_PyTuple_GET_ITEM(__FILE__, __LINE__, list, pos)
361 #else
362 #define Py_DECREF(obj) Impl_Py_DECREF(obj)
363 #define Py_XDECREF(obj) Impl_Py_XDECREF(obj)
364 #define Py_INCREF(obj) Impl_Py_INCREF(obj)
365 #define Py_XINCREF(obj) Impl_Py_XINCREF(obj)
366 #define PyList_New(args...) Impl_PyList_New(args)
367 #define PyTuple_New(args...) Impl_PyTuple_New(args)
368 #define PyDict_New(...) Impl_PyDict_New()
369 #define PyString_FromString(str) Impl_PyString_FromString(str)
370 #define PyString_FromFormat(str, args...) Impl_PyString_FromFormat(str, args)
371 #define PyInt_FromLong(val) Impl_PyInt_FromLong(val)
372 #define PyLong_FromLong(val) Impl_PyLong_FromLong(val)
373 #define PyLong_FromUnsignedLong(val) Impl_PyLong_FromUnsignedLong(val)
374 #define PyLong_FromLongLong(val) Impl_PyLong_FromLongLong(val)
375 #define PyList_GET_ITEM(list, pos) Impl_PyList_GET_ITEM(list, pos)
376 #define PyTuple_GET_ITEM(list, pos) Impl_PyTuple_GET_ITEM(list, pos)
377 #endif
378
379 class ePython
380 {
381 public:
382         ePython();
383         ~ePython();
384         int execFile(const char *file);
385         int execute(const std::string &pythonfile, const std::string &funcname);
386         static int call(ePyObject pFunc, ePyObject args);
387         static ePyObject resolve(const std::string &pythonfile, const std::string &funcname);
388 private:
389 };
390
391 #endif // SWIG
392 #endif // SKIP_PART2
393
394 #endif // __lib_python_python_class_h