import of enigma2
[enigma2.git] / lib / base / message.h
1 #ifndef __lib_base_message_h
2 #define __lib_base_message_h
3
4 #include <lib/base/ebase.h>
5 #include <unistd.h>
6 #include <lib/base/elock.h>
7
8 /**
9  * \brief A generic messagepump.
10  *
11  * You can send and receive messages with this class. Internally a fifo is used,
12  * so you can use them together with a \c eMainloop.
13  */
14 class eMessagePump
15 {
16         int fd[2];
17         eLock content;
18         int ismt;
19 public:
20         eMessagePump(int mt=0);
21         ~eMessagePump();
22         int send(const void *data, int len);
23         int recv(void *data, int len); // blockierend
24         int getInputFD() const;
25         int getOutputFD() const;
26 };
27
28 /**
29  * \brief A messagepump with fixed-length packets.
30  *
31  * Based on \ref eMessagePump, with this class you can send and receive fixed size messages.
32  * Automatically creates a eSocketNotifier and gives you a callback.
33  */
34 template<class T>
35 class eFixedMessagePump: private eMessagePump, public Object
36 {
37         eSocketNotifier *sn;
38         void do_recv(int)
39         {
40                 T msg;
41                 recv(&msg, sizeof(msg));
42                 /*emit*/ recv_msg(msg);
43         }
44 public:
45         Signal1<void,const T&> recv_msg;
46         void send(const T &msg)
47         {
48                 eMessagePump::send(&msg, sizeof(msg));
49         }
50         eFixedMessagePump(eMainloop *context, int mt): eMessagePump(mt)
51         {
52                 sn=new eSocketNotifier(context, getOutputFD(), eSocketNotifier::Read);
53                 CONNECT(sn->activated, eFixedMessagePump<T>::do_recv);
54                 sn->start();
55         }
56         ~eFixedMessagePump()
57         {
58                 delete sn;
59         }
60         void start() { sn->start(); }
61         void stop() { sn->stop(); }
62 };
63
64 #endif