add support for python threads (python threads are just running when the mainloop
[vuplus_dvbapp] / lib / base / message.h
index de14db0..038fd55 100644 (file)
@@ -2,15 +2,19 @@
 #define __lib_base_message_h
 
 #include <lib/base/ebase.h>
+#include <lib/python/connections.h>
+#include <lib/python/swig.h>
 #include <unistd.h>
 #include <lib/base/elock.h>
 
+
 /**
  * \brief A generic messagepump.
  *
  * You can send and receive messages with this class. Internally a fifo is used,
  * so you can use them together with a \c eMainloop.
  */
+#ifndef SWIG
 class eMessagePump
 {
        int fd[2];
@@ -19,6 +23,7 @@ class eMessagePump
 public:
        eMessagePump(int mt=0);
        virtual ~eMessagePump();
+protected:
        int send(const void *data, int len);
        int recv(void *data, int len); // blockierend
        int getInputFD() const;
@@ -61,5 +66,39 @@ public:
        void start() { if (sn) sn->start(); }
        void stop() { if (sn) sn->stop(); }
 };
+#endif
+
+class ePythonMessagePump: public eMessagePump, public Object
+{
+       eSocketNotifier *sn;
+       void do_recv(int)
+       {
+               int msg;
+               recv(&msg, sizeof(msg));
+               /*emit*/ recv_msg(msg);
+       }
+public:
+       PSignal1<void,int> recv_msg;
+       void send(int msg)
+       {
+               eMessagePump::send(&msg, sizeof(msg));
+       }
+       ePythonMessagePump()
+               :eMessagePump(1)
+       {
+               eDebug("add python messagepump %p", this);
+               sn=new eSocketNotifier(eApp, getOutputFD(), eSocketNotifier::Read);
+               CONNECT(sn->activated, ePythonMessagePump::do_recv);
+               sn->start();
+       }
+       ~ePythonMessagePump()
+       {
+               eDebug("remove python messagepump %p", this);
+               delete sn;
+               sn=0;
+       }
+       void start() { if (sn) sn->start(); }
+       void stop() { if (sn) sn->stop(); }
+};
 
 #endif