add language selection
[enigma2.git] / lib / python / connections.h
1 #ifndef __lib_python_connections_h
2 #define __lib_python_connections_h
3
4 #include <libsig_comp.h>
5
6                 /* avoid warnigs :) */
7 #include <features.h>
8 #undef _POSIX_C_SOURCE
9 #define _POSIX_C_SOURCE 200112L
10 #include <Python.h>
11 #include <lib/python/python.h>
12
13 class PSignal
14 {
15 public:
16         PyObject *m_list;
17 public:
18         PSignal()
19         {
20                 m_list = PyList_New(0);
21                 Py_INCREF(m_list);
22         }
23         ~PSignal()
24         {
25                 Py_DECREF(m_list);
26         }
27         
28         void callPython(PyObject *tuple)
29         {
30                 int size = PyList_Size(m_list);
31                 int i;
32                 for (i=0; i<size; ++i)
33                 {
34                         PyObject *b = PyList_GetItem(m_list, i);
35                         ePython::call(b, tuple);
36                 }
37         }
38         
39         
40         PyObject *get() { Py_INCREF(m_list); return m_list; }
41 };
42
43 inline PyObject *PyFrom(int v)
44 {
45         return PyInt_FromLong(v);
46 }
47
48 template <class R>
49 class PSignal0: public PSignal, public Signal0<R>
50 {
51 public:
52         R operator()()
53         {
54                 PyObject *pArgs = PyTuple_New(0);
55                 callPython(pArgs);
56                 Py_DECREF(pArgs);
57                 return Signal0<R>::operator()();
58         }
59 };
60
61 template <class R, class V0>
62 class PSignal1: public PSignal, public Signal1<R,V0>
63 {
64 public:
65         R operator()(V0 a0)
66         {
67                 PyObject *pArgs = PyTuple_New(1);
68                 PyTuple_SetItem(pArgs, 0, PyFrom(a0));
69                 callPython(pArgs);
70                 Py_DECREF(pArgs);
71                 return Signal1<R,V0>::operator()(a0);
72         }
73 };
74
75 template <class R, class V0, class V1>
76 class PSignal2: public PSignal, public Signal2<R,V0,V1>
77 {
78 public:
79         R operator()(V0 a0, V1 a1)
80         {
81                 PyObject *pArgs = PyTuple_New(2);
82                 PyTuple_SetItem(pArgs, 0, PyFrom(a0));
83                 PyTuple_SetItem(pArgs, 1, PyFrom(a1));
84                 callPython(pArgs);
85                 Py_DECREF(pArgs);
86                 return Signal2<R,V0,V1>::operator()(a0, a1);
87         }
88 };
89
90 #endif