Merge remote branch 'origin/acid-burn/bug_670_plugin_restartoption' into experimental
[vuplus_dvbapp] / lib / python / connections.h
index 9b4abdd..b4cd1c7 100644 (file)
@@ -3,41 +3,20 @@
 
 #include <libsig_comp.h>
 
-               /* avoid warnigs :) */
-#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_GetItem(m_list, i);
-                       ePython::call(b, tuple);
-               }
-       }
-       
-       
-       PyObject *get() { Py_INCREF(m_list); return m_list; }
+       PSignal();
+       ~PSignal();
+       void callPython(SWIG_PYOBJECT(ePyObject) tuple);
+#ifndef SWIG
+       PyObject *getSteal(bool clear=false);
+#endif
+       PyObject *get();
 };
 
 inline PyObject *PyFrom(int v)
@@ -45,15 +24,23 @@ 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()();
        }
 };
@@ -64,10 +51,13 @@ class PSignal1: public PSignal, public Signal1<R,V0>
 public:
        R operator()(V0 a0)
        {
-               PyObject *pArgs = PyTuple_New(1);
-               PyTuple_SetItem(pArgs, 0, PyFrom(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);
        }
 };
@@ -78,11 +68,14 @@ class PSignal2: public PSignal, public Signal2<R,V0,V1>
 public:
        R operator()(V0 a0, V1 a1)
        {
-               PyObject *pArgs = PyTuple_New(2);
-               PyTuple_SetItem(pArgs, 0, PyFrom(a0));
-               PyTuple_SetItem(pArgs, 1, PyFrom(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);
        }
 };