diff options
author | Richard Ipsum <richard.ipsum@codethink.co.uk> | 2014-02-24 18:21:33 +0000 |
---|---|---|
committer | Richard Ipsum <richard.ipsum@codethink.co.uk> | 2014-03-21 16:47:28 +0000 |
commit | 1de342b8a4cf13b295805855bfaa341bcd86277e (patch) | |
tree | 2b550a0d60532446dad50ee3ecc703a90bb6d780 /distbuild/sockserv.py | |
parent | f4b503b036f76c23c4f2cb99ca6596823b323035 (diff) | |
download | morph-1de342b8a4cf13b295805855bfaa341bcd86277e.tar.gz |
Add the distbuild libs
Diffstat (limited to 'distbuild/sockserv.py')
-rw-r--r-- | distbuild/sockserv.py | 45 |
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)) + |