diff options
author | Carlo Zancanaro <carlo@zancanaro.id.au> | 2022-09-04 14:18:02 +1000 |
---|---|---|
committer | Carlo Zancanaro <carlo@zancanaro.id.au> | 2022-09-24 21:19:23 +1000 |
commit | e031af6e5e8324fe4cda66d9597904040b17ca80 (patch) | |
tree | 0917439655016b088ffe10ae76f85c7e97f1f621 /network/zmqglib.py | |
parent | 833f87ebba90e6c2d3cb386b2d51c3d113d98a54 (diff) |
Vendor the "simple-network" library
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 |