cvs20080628 - trunk
[gitenigma.git] / include / lib / base / message.h
blob0208da3db98cae1bdfe364ad1e3c369d9c164fb8
1 #ifndef __lib_base_message_h
2 #define __lib_base_message_h
4 #include <lib/base/ebase.h>
5 #include <unistd.h>
6 #include <lib/system/elock.h>
8 /**
9 * \brief A generic messagepump.
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.
14 class eMessagePump
16 int fd[2];
17 eLock content;
18 int ismt;
19 public:
20 eMessagePump(int mt=0);
21 virtual ~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;
28 /**
29 * \brief A messagepump with fixed-length packets.
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.
34 template<class T>
35 class eFixedMessagePump: private eMessagePump, public Object
37 eSocketNotifier *sn;
38 void do_recv(int)
40 T msg;
41 recv(&msg, sizeof(msg));
42 /*emit*/ recv_msg(msg);
44 public:
45 Signal1<void,const T&> recv_msg;
46 void send(const T &msg)
48 eMessagePump::send(&msg, sizeof(msg));
50 eFixedMessagePump(eMainloop *context, int mt): eMessagePump(mt)
52 sn=new eSocketNotifier(context, getOutputFD(), eSocketNotifier::Read);
53 CONNECT(sn->activated, eFixedMessagePump<T>::do_recv);
54 sn->start();
56 ~eFixedMessagePump()
58 delete sn;
59 sn=0;
61 void start() { if (sn) sn->start(); }
62 void stop() { if (sn) sn->stop(); }
65 #endif