diff options
Diffstat (limited to 'network/zmqglib.py')
-rw-r--r-- | network/zmqglib.py | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/network/zmqglib.py b/network/zmqglib.py new file mode 100644 index 0000000..8334235 --- /dev/null +++ b/network/zmqglib.py @@ -0,0 +1,46 @@ +import zmq + +from gi.repository import GLib + +READ_EVENTS = ( + GLib.IOCondition.IN | + GLib.IOCondition.HUP | + GLib.IOCondition.ERR +) + +class ZMQSource(GLib.Source): + def set_socket(self, sock): + self.sock = sock + + fd = sock.getsockopt(zmq.FD) + self.poll_fd = GLib.PollFD( + fd=fd, + events=READ_EVENTS, + ) + self.add_poll(self.poll_fd) + + def prepare(self): + return (False, -1) + + def check(self): + if not self.poll_fd.revents: + return False + + events = self.sock.getsockopt(zmq.EVENTS) + return bool(events & zmq.POLLIN) + + def dispatch(self, callback, user_data): + try: + while True: + data = self.sock.recv(zmq.NOBLOCK) + callback(self.sock, data, *user_data) + except zmq.ZMQError as e: + if e.errno != zmq.EAGAIN: + raise + return True +_ZMQSource = ZMQSource + +def ZMQSource(sock): + s = _ZMQSource() + s.set_socket(sock) + return s |