summaryrefslogtreecommitdiff
path: root/distbuild/sockserv.py
diff options
context:
space:
mode:
authorRichard Ipsum <richard.ipsum@codethink.co.uk>2014-02-24 18:21:33 +0000
committerRichard Ipsum <richard.ipsum@codethink.co.uk>2014-03-21 16:47:28 +0000
commit1de342b8a4cf13b295805855bfaa341bcd86277e (patch)
tree2b550a0d60532446dad50ee3ecc703a90bb6d780 /distbuild/sockserv.py
parentf4b503b036f76c23c4f2cb99ca6596823b323035 (diff)
downloadmorph-1de342b8a4cf13b295805855bfaa341bcd86277e.tar.gz
Add the distbuild libs
Diffstat (limited to 'distbuild/sockserv.py')
-rw-r--r--distbuild/sockserv.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/distbuild/sockserv.py b/distbuild/sockserv.py
new file mode 100644
index 00000000..6d8f216e
--- /dev/null
+++ b/distbuild/sockserv.py
@@ -0,0 +1,45 @@
+# mainloop/sockserv.py -- socket server state machines
+#
+# Copyright 2012 Codethink Limited
+# All rights reserved.
+
+
+import logging
+
+from sm import StateMachine
+from socketsrc import NewConnection, SocketError, ListeningSocketEventSource
+
+
+class ListenServer(StateMachine):
+
+ '''Listen for new connections on a port, send events for them.'''
+
+ def __init__(self, addr, port, machine, extra_args=None):
+ StateMachine.__init__(self, 'listening')
+ self._addr = addr
+ self._port = port
+ self._machine = machine
+ self._extra_args = extra_args or []
+
+ def setup(self):
+ src = ListeningSocketEventSource(self._addr, self._port)
+ self.mainloop.add_event_source(src)
+
+ spec = [
+ ('listening', src, NewConnection, 'listening', self.new_conn),
+ ('listening', src, SocketError, None, self.report_error),
+ ]
+ self.add_transitions(spec)
+
+ def new_conn(self, event_source, event):
+ logging.debug(
+ 'ListenServer: Creating new %s using %s and %s' %
+ (repr(self._machine),
+ repr(event.connection),
+ repr(self._extra_args)))
+ m = self._machine(event.connection, *self._extra_args)
+ self.mainloop.add_state_machine(m)
+
+ def report_error(self, event_source, event):
+ logging.error(str(event))
+