X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fbase%2Fmessage.h;h=6e9eb07c3629c48b024da8539267a7882ade7bd0;hp=de14db0fd61cda4c70587685e5f76e3b6bb88444;hb=10e7e45ae92d4fe06f70126ed256b87896dbc432;hpb=62b8a649fcae500c983215fac2e5202916c0195f diff --git a/lib/base/message.h b/lib/base/message.h index de14db0..6e9eb07 100644 --- a/lib/base/message.h +++ b/lib/base/message.h @@ -2,15 +2,19 @@ #define __lib_base_message_h #include +#include +#include #include #include + /** * \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; @@ -34,7 +39,7 @@ public: template class eFixedMessagePump: private eMessagePump, public Object { - eSocketNotifier *sn; + ePtr sn; void do_recv(int) { T msg; @@ -49,14 +54,36 @@ public: } eFixedMessagePump(eMainloop *context, int mt): eMessagePump(mt) { - sn=new eSocketNotifier(context, getOutputFD(), eSocketNotifier::Read); + sn=eSocketNotifier::create(context, getOutputFD(), eSocketNotifier::Read); CONNECT(sn->activated, eFixedMessagePump::do_recv); sn->start(); } - ~eFixedMessagePump() + void start() { if (sn) sn->start(); } + void stop() { if (sn) sn->stop(); } +}; +#endif + +class ePythonMessagePump: public eMessagePump, public Object +{ + ePtr sn; + void do_recv(int) { - delete sn; - sn=0; + int msg; + recv(&msg, sizeof(msg)); + /*emit*/ recv_msg(msg); + } +public: + PSignal1 recv_msg; + void send(int msg) + { + eMessagePump::send(&msg, sizeof(msg)); + } + ePythonMessagePump() + :eMessagePump(1) + { + sn=eSocketNotifier::create(eApp, getOutputFD(), eSocketNotifier::Read); + CONNECT(sn->activated, ePythonMessagePump::do_recv); + sn->start(); } void start() { if (sn) sn->start(); } void stop() { if (sn) sn->stop(); }