aboutsummaryrefslogtreecommitdiff
path: root/lib/base/message.h
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2003-10-17 15:36:42 +0000
committerFelix Domke <tmbinc@elitedvb.net>2003-10-17 15:36:42 +0000
commitd63d2c3c6cbbd574dda4f8b00ebe6c661735edd5 (patch)
tree84d0cacfd0b6c1241c236c7860f7cbd7f26901bb /lib/base/message.h
downloadenigma2-d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5.tar.gz
enigma2-d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5.zip
import of enigma2
Diffstat (limited to 'lib/base/message.h')
-rw-r--r--lib/base/message.h64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/base/message.h b/lib/base/message.h
new file mode 100644
index 00000000..6a9ff43e
--- /dev/null
+++ b/lib/base/message.h
@@ -0,0 +1,64 @@
+#ifndef __lib_base_message_h
+#define __lib_base_message_h
+
+#include <lib/base/ebase.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.
+ */
+class eMessagePump
+{
+ int fd[2];
+ eLock content;
+ int ismt;
+public:
+ eMessagePump(int mt=0);
+ ~eMessagePump();
+ int send(const void *data, int len);
+ int recv(void *data, int len); // blockierend
+ int getInputFD() const;
+ int getOutputFD() const;
+};
+
+/**
+ * \brief A messagepump with fixed-length packets.
+ *
+ * Based on \ref eMessagePump, with this class you can send and receive fixed size messages.
+ * Automatically creates a eSocketNotifier and gives you a callback.
+ */
+template<class T>
+class eFixedMessagePump: private eMessagePump, public Object
+{
+ eSocketNotifier *sn;
+ void do_recv(int)
+ {
+ T msg;
+ recv(&msg, sizeof(msg));
+ /*emit*/ recv_msg(msg);
+ }
+public:
+ Signal1<void,const T&> recv_msg;
+ void send(const T &msg)
+ {
+ eMessagePump::send(&msg, sizeof(msg));
+ }
+ eFixedMessagePump(eMainloop *context, int mt): eMessagePump(mt)
+ {
+ sn=new eSocketNotifier(context, getOutputFD(), eSocketNotifier::Read);
+ CONNECT(sn->activated, eFixedMessagePump<T>::do_recv);
+ sn->start();
+ }
+ ~eFixedMessagePump()
+ {
+ delete sn;
+ }
+ void start() { sn->start(); }
+ void stop() { sn->stop(); }
+};
+
+#endif