summaryrefslogtreecommitdiff
path: root/network/zmqglib.py
diff options
context:
space:
mode:
authorCarlo Zancanaro <carlo@zancanaro.id.au>2022-09-04 14:18:02 +1000
committerCarlo Zancanaro <carlo@zancanaro.id.au>2022-09-24 21:19:23 +1000
commite031af6e5e8324fe4cda66d9597904040b17ca80 (patch)
tree0917439655016b088ffe10ae76f85c7e97f1f621 /network/zmqglib.py
parent833f87ebba90e6c2d3cb386b2d51c3d113d98a54 (diff)
Vendor the "simple-network" library
Diffstat (limited to 'network/zmqglib.py')
-rw-r--r--network/zmqglib.py46
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