another change of policy (with correct aspect ratio)
[enigma2.git] / lib / python / connections.h
index ac5865e51f73f8a395a7e1d8dd1ce102bf73fb94..8ff3a620e30cff1e48f72d45676d26caf29936a4 100644 (file)
@@ -7,48 +7,42 @@
 #include <features.h>
 #undef _POSIX_C_SOURCE
 #define _POSIX_C_SOURCE 200112L
-#include <Python.h>
+
 #include <lib/python/python.h>
 
 class PSignal
 {
+protected:
+       ePyObject m_list;
 public:
-       PyObject *m_list;
-public:
-       PSignal()
-       {
-               m_list = PyList_New(0);
-               Py_INCREF(m_list);
-       }
-       ~PSignal()
-       {
-               Py_DECREF(m_list);
-       }
-       
-       void callPython(PyObject *tuple)
-       {
-               int size = PyList_Size(m_list);
-               int i;
-               for (i=0; i<size; ++i)
-               {
-                       PyObject *b = PyList_GET_ITEM(m_list, i);
-                       ePython::call(b, tuple);
-               }
-       }
-       
-       
-       PyObject *get() { Py_INCREF(m_list); return m_list; }
+       PSignal();
+       ~PSignal();
+       void callPython(SWIG_PYOBJECT(ePyObject) tuple);
+       PyObject *get();
 };
 
+inline PyObject *PyFrom(int v)
+{
+       return PyInt_FromLong(v);
+}
+
+inline PyObject *PyFrom(const char *c)
+{
+       return PyString_FromString(c);
+}
+
 template <class R>
 class PSignal0: public PSignal, public Signal0<R>
 {
 public:
        R operator()()
        {
-               PyObject *pArgs = PyTuple_New(0);
-               callPython(pArgs);
-               Py_DECREF(pArgs);
+               if (m_list)
+               {
+                       PyObject *pArgs = PyTuple_New(0);
+                       callPython(pArgs);
+                       Org_Py_DECREF(pArgs);
+               }
                return Signal0<R>::operator()();
        }
 };
@@ -59,24 +53,13 @@ class PSignal1: public PSignal, public Signal1<R,V0>
 public:
        R operator()(V0 a0)
        {
-               PyObject *pArgs = PyTuple_New(1);
-               PyTuple_SET_ITEM(pArgs, 0, PyInt_FromLong(a0));
-               callPython(pArgs);
-               Py_DECREF(pArgs);
-               return Signal1<R,V0>::operator()(a0);
-       }
-};
-
-template <class R, class V0>
-class PSignal1Str: public PSignal, public Signal1<R,V0>
-{
-public:
-       R operator()(V0 a0)
-       {
-               PyObject *pArgs = PyTuple_New(1);
-               PyTuple_SET_ITEM(pArgs, 0, PyString_FromString(a0));
-               callPython(pArgs);
-               Py_DECREF(pArgs);
+               if (m_list)
+               {
+                       PyObject *pArgs = PyTuple_New(1);
+                       PyTuple_SET_ITEM(pArgs, 0, PyFrom(a0));
+                       callPython(pArgs);
+                       Org_Py_DECREF(pArgs);
+               }
                return Signal1<R,V0>::operator()(a0);
        }
 };
@@ -87,11 +70,14 @@ class PSignal2: public PSignal, public Signal2<R,V0,V1>
 public:
        R operator()(V0 a0, V1 a1)
        {
-               PyObject *pArgs = PyTuple_New(2);
-               PyTuple_SET_ITEM(pArgs, 0, PyInt_FromLong(a0));
-               PyTuple_SET_ITEM(pArgs, 1, PyInt_FromLong(a1));
-               callPython(pArgs);
-               Py_DECREF(pArgs);
+               if (m_list)
+               {
+                       PyObject *pArgs = PyTuple_New(2);
+                       PyTuple_SET_ITEM(pArgs, 0, PyFrom(a0));
+                       PyTuple_SET_ITEM(pArgs, 1, PyFrom(a1));
+                       callPython(pArgs);
+                       Org_Py_DECREF(pArgs);
+               }
                return Signal2<R,V0,V1>::operator()(a0, a1);
        }
 };