X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5..92929c357751afc31f7f1acbe3e724bdf307cf23:/lib/base/message.h diff --git a/lib/base/message.h b/lib/base/message.h index 6a9ff43e..038fd55d 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]; @@ -18,7 +22,8 @@ class eMessagePump int ismt; public: eMessagePump(int mt=0); - ~eMessagePump(); + virtual ~eMessagePump(); +protected: int send(const void *data, int len); int recv(void *data, int len); // blockierend int getInputFD() const; @@ -56,9 +61,44 @@ public: ~eFixedMessagePump() { delete sn; + sn=0; + } + 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 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() { sn->start(); } - void stop() { sn->stop(); } + void start() { if (sn) sn->start(); } + void stop() { if (sn) sn->stop(); } }; #endif