add WHERE_FILESCAN
[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 <string>
8 #include <lib/base/object.h>
9 #include <Python.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(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=(PyDictObject *ob) { return operator=((PyObject*)ob); }
36         ePyObject &operator=(PyTupleObject *ob) { return operator=((PyObject*)ob); }
37         ePyObject &operator=(PyListObject *ob) { return operator=((PyObject*)ob); }
38         ePyObject &operator=(PyStringObject *ob) { return operator=((PyObject*)ob); }
39         operator PyObject*();
40         operator PyTupleObject*() { return (PyTupleObject*)operator PyObject*(); }
41         operator PyListObject*() { return (PyListObject*)operator PyObject*(); }
42         operator PyStringObject*() { return (PyStringObject*)operator PyObject*(); }
43         operator PyDictObject*() { return (PyDictObject*)operator PyObject*(); }
44         PyObject *operator->() { return operator PyObject*(); }
45 #ifdef PYTHON_REFCOUNT_DEBUG
46         void incref(const char *file, int line);
47         void decref(const char *file, int line);
48 #else
49         void incref();
50         void decref();
51 #endif
52 };
53
54 inline ePyObject::ePyObject()
55         :m_ob(0)
56 #ifdef PYTHON_REFCOUNT_DEBUG
57         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
58 #endif
59 {
60 }
61
62 inline ePyObject::ePyObject(const ePyObject &ob)
63         :m_ob(ob.m_ob)
64 #ifdef PYTHON_REFCOUNT_DEBUG
65         ,m_file(ob.m_file), m_line(ob.m_line)
66         ,m_from(ob.m_from), m_to(ob.m_to), m_erased(ob.m_erased)
67 #endif
68 {
69 }
70
71 inline ePyObject::ePyObject(PyObject *ob)
72         :m_ob(ob)
73 #ifdef PYTHON_REFCOUNT_DEBUG
74         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
75 #endif
76 {
77 }
78
79 #ifdef PYTHON_REFCOUNT_DEBUG
80 inline ePyObject::ePyObject(PyObject *ob, const char* file, int line)
81         :m_ob(ob)
82         ,m_file(file), m_line(line), m_from(ob->ob_refcnt), m_to(ob->ob_refcnt), m_erased(false)
83 {
84 }
85 #endif
86
87 inline ePyObject::ePyObject(PyDictObject *ob)
88         :m_ob((PyObject*)ob)
89 #ifdef PYTHON_REFCOUNT_DEBUG
90         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
91 #endif
92 {
93 }
94
95 inline ePyObject::ePyObject(PyTupleObject *ob)
96         :m_ob((PyObject*)ob)
97 #ifdef PYTHON_REFCOUNT_DEBUG
98         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
99 #endif
100 {
101 }
102
103 inline ePyObject::ePyObject(PyListObject *ob)
104         :m_ob((PyObject*)ob)
105 #ifdef PYTHON_REFCOUNT_DEBUG
106         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
107 #endif
108 {
109 }
110
111 inline ePyObject::ePyObject(PyStringObject *ob)
112         :m_ob((PyObject*)ob)
113 #ifdef PYTHON_REFCOUNT_DEBUG
114         ,m_file(0), m_line(0), m_from(0), m_to(0), m_erased(false)
115 #endif
116 {
117 }
118
119 #ifndef PYTHON_REFCOUNT_DEBUG
120 inline ePyObject &ePyObject::operator=(PyObject *ob)
121 {
122         m_ob=ob;
123         return *this;
124 }
125
126 inline ePyObject &ePyObject::operator=(const ePyObject &ob)
127 {
128         m_ob=ob.m_ob;
129         return *this;
130 }
131
132 inline ePyObject::operator PyObject*()
133 {
134         return m_ob;
135 }
136
137 inline void ePyObject::incref()
138 {
139         Py_INCREF(m_ob);
140 }
141
142 inline void ePyObject::decref()
143 {
144         Py_DECREF(m_ob);
145 }
146
147 #endif // ! PYTHON_REFCOUNT_DEBUG
148
149 #endif  // !SWIG && !SKIP_PART1
150
151 #ifndef SKIP_PART2
152
153 class TestObj
154 {
155 DECLARE_REF(TestObj);
156 public:
157         TestObj();
158         ~TestObj();
159 };
160 TEMPLATE_TYPEDEF(ePtr<TestObj>, TestObjPtr);
161
162 #ifndef SWIG
163 extern PyObject *New_TestObj();
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_New_TestObj(const char* file, int line)
237 {
238         return ePyObject(New_TestObj(), file, line);
239 }
240
241 inline ePyObject Impl_PyList_GET_ITEM(const char *file, int line, ePyObject list, unsigned int pos)
242 {
243         return ePyObject(PyList_GET_ITEM(list, pos), file, line);
244 }
245
246 inline ePyObject Impl_PyTuple_GET_ITEM(const char *file, int line, ePyObject list, unsigned int pos)
247 {
248         return ePyObject(PyTuple_GET_ITEM(list, pos), file, line);
249 }
250 #else
251 inline void Impl_Py_DECREF(const ePyObject &obj)
252 {
253         ((ePyObject*)(&obj))->decref();
254 }
255
256 inline void Impl_Py_INCREF(const ePyObject &obj)
257 {
258         ((ePyObject*)(&obj))->incref();
259 }
260
261 inline void Impl_Py_XDECREF(const ePyObject &obj)
262 {
263         if (obj)
264                 ((ePyObject*)(&obj))->decref();
265 }
266
267 inline void Impl_Py_XINCREF(const ePyObject &obj)
268 {
269         if (obj)
270                 ((ePyObject*)(&obj))->incref();
271 }
272
273 inline ePyObject Impl_PyTuple_New(int elements=0)
274 {
275         return PyTuple_New(elements);
276 }
277
278 inline ePyObject Impl_PyList_New(int elements=0)
279 {
280         return PyList_New(elements);
281 }
282
283 inline ePyObject Impl_PyDict_New()
284 {
285         return PyDict_New();
286 }
287
288 inline ePyObject Impl_PyString_FromString(const char *str)
289 {
290         return PyString_FromString(str);
291 }
292
293 inline ePyObject Impl_PyString_FromFormat(const char *fmt, ...)
294 {
295         va_list ap;
296         va_start(ap, fmt);
297         PyObject *ob = PyString_FromFormatV(fmt, ap);
298         va_end(ap);
299         return ePyObject(ob);
300 }
301
302 inline ePyObject Impl_PyInt_FromLong(long val)
303 {
304         return PyInt_FromLong(val);
305 }
306
307 inline ePyObject Impl_PyLong_FromLong(long val)
308 {
309         return PyLong_FromLong(val);
310 }
311
312 inline ePyObject Impl_PyLong_FromUnsignedLong(unsigned long val)
313 {
314         return PyLong_FromUnsignedLong(val);
315 }
316
317 inline ePyObject Impl_PyLong_FromLongLong(long long val)
318 {
319         return PyLong_FromLongLong(val);
320 }
321
322 inline ePyObject Impl_New_TestObj()
323 {
324         return New_TestObj();
325 }
326
327 inline ePyObject Impl_PyList_GET_ITEM(ePyObject list, unsigned int pos)
328 {
329         return PyList_GET_ITEM(list, pos);
330 }
331
332 inline ePyObject Impl_PyTuple_GET_ITEM(ePyObject list, unsigned int pos)
333 {
334         return PyTuple_GET_ITEM(list, pos);
335 }
336 #endif
337
338 inline void Impl_DECREF(PyObject *ob)
339 {
340         Py_DECREF(ob);
341 }
342 #define Org_Py_DECREF(obj) Impl_DECREF(obj)
343 #undef Py_DECREF
344 #undef Py_XDECREF
345 #undef Py_INCREF
346 #undef Py_XINCREF
347 #undef PyList_GET_ITEM
348 #undef PyTuple_GET_ITEM
349 #ifdef PYTHON_REFCOUNT_DEBUG
350 #define Py_DECREF(obj) Impl_Py_DECREF(__FILE__, __LINE__, obj)
351 #define Py_XDECREF(obj) Impl_Py_XDECREF(__FILE__, __LINE__, obj)
352 #define Py_INCREF(obj) Impl_Py_INCREF(__FILE__, __LINE__, obj)
353 #define Py_XINCREF(obj) Impl_Py_XINCREF(__FILE__, __LINE__, obj)
354 #define PyList_New(args...) Impl_PyList_New(__FILE__, __LINE__, args)
355 #define PyTuple_New(args...) Impl_PyTuple_New(__FILE__, __LINE__, args)
356 #define PyDict_New(...) Impl_PyDict_New(__FILE__, __LINE__)
357 #define PyString_FromString(str) Impl_PyString_FromString(__FILE__, __LINE__, str)
358 #define PyString_FromFormat(str, args...) Impl_PyString_FromFormat(__FILE__, __LINE__, str, args)
359 #define PyInt_FromLong(val) Impl_PyInt_FromLong(__FILE__, __LINE__, val)
360 #define PyLong_FromLong(val) Impl_PyLong_FromLong(__FILE__, __LINE__, val)
361 #define PyLong_FromUnsignedLong(val) Impl_PyLong_FromUnsignedLong(__FILE__, __LINE__, val)
362 #define PyLong_FromLongLong(val) Impl_PyLong_FromLongLong(__FILE__, __LINE__, val)
363 #define NEW_TestObj(...) Impl_New_TestObj(__FILE__, __LINE__)
364 #define PyList_GET_ITEM(list, pos) Impl_PyList_GET_ITEM(__FILE__, __LINE__, list, pos)
365 #define PyTuple_GET_ITEM(list, pos) Impl_PyTuple_GET_ITEM(__FILE__, __LINE__, list, pos)
366 #else
367 #define Py_DECREF(obj) Impl_Py_DECREF(obj)
368 #define Py_XDECREF(obj) Impl_Py_XDECREF(obj)
369 #define Py_INCREF(obj) Impl_Py_INCREF(obj)
370 #define Py_XINCREF(obj) Impl_Py_XINCREF(obj)
371 #define PyList_New(args...) Impl_PyList_New(args)
372 #define PyTuple_New(args...) Impl_PyTuple_New(args)
373 #define PyDict_New(...) Impl_PyDict_New()
374 #define PyString_FromString(str) Impl_PyString_FromString(str)
375 #define PyString_FromFormat(str, args...) Impl_PyString_FromFormat(str, args)
376 #define PyInt_FromLong(val) Impl_PyInt_FromLong(val)
377 #define PyLong_FromLong(val) Impl_PyLong_FromLong(val)
378 #define PyLong_FromUnsignedLong(val) Impl_PyLong_FromUnsignedLong(val)
379 #define PyLong_FromLongLong(val) Impl_PyLong_FromLongLong(val)
380 #define NEW_TestObj(...) Impl_New_TestObj()
381 #define PyList_GET_ITEM(list, pos) Impl_PyList_GET_ITEM(list, pos)
382 #define PyTuple_GET_ITEM(list, pos) Impl_PyTuple_GET_ITEM(list, pos)
383 #endif
384
385 class ePython
386 {
387 public:
388         ePython();
389         ~ePython();
390         int execute(const std::string &pythonfile, const std::string &funcname);
391         static int call(ePyObject pFunc, ePyObject args);
392         static ePyObject resolve(const std::string &pythonfile, const std::string &funcname);
393 private:
394 };
395
396 #endif // SWIG
397 #endif // SKIP_PART2
398
399 #endif // __lib_python_python_class_h