diff options
Diffstat (limited to 'voctogui/lib/connection.py')
-rw-r--r-- | voctogui/lib/connection.py | 187 |
1 files changed, 97 insertions, 90 deletions
diff --git a/voctogui/lib/connection.py b/voctogui/lib/connection.py index 6f8245f..500973d 100644 --- a/voctogui/lib/connection.py +++ b/voctogui/lib/connection.py @@ -12,140 +12,147 @@ port = 9999 command_queue = Queue() signal_handlers = {} + def establish(host): - global conn, port, log, ip + global conn, port, log, ip + + log.info('establishing Connection to %s', host) + conn = socket.create_connection((host, port)) + log.debug('Connection successful \o/') - log.info('establishing Connection to %s', host) - conn = socket.create_connection( (host, port) ) - log.debug('Connection successful \o/') + ip = conn.getpeername()[0] + log.debug('Remote-IP is %s', ip) - ip = conn.getpeername()[0] - log.debug('Remote-IP is %s', ip) def fetchServerConfig(): - global conn, log + global conn, log - log.info('reading server-config') - fd = conn.makefile('rw') - fd.write("get_config\n") - fd.flush() + log.info('reading server-config') + fd = conn.makefile('rw') + fd.write("get_config\n") + fd.flush() - while True: - line = fd.readline() - words = line.split(' ') + while True: + line = fd.readline() + words = line.split(' ') - signal = words[0] - args = words[1:] + signal = words[0] + args = words[1:] - if signal != 'server_config': - continue + if signal != 'server_config': + continue - server_config_json = " ".join(args) - server_config = json.loads(server_config_json) - return server_config + server_config_json = " ".join(args) + server_config = json.loads(server_config_json) + return server_config def enterNonblockingMode(): - global conn, log + global conn, log + + log.debug('entering nonblocking-mode') + conn.setblocking(False) + GObject.io_add_watch(conn, GObject.IO_IN, on_data, ['']) - log.debug('entering nonblocking-mode') - conn.setblocking(False) - GObject.io_add_watch(conn, GObject.IO_IN, on_data, ['']) def on_data(conn, _, leftovers, *args): - global log + global log + + '''Asynchronous connection handler. Pushes data from socket + into command queue linewise''' + try: + while True: + try: + leftovers.append(conn.recv(4096).decode(errors='replace')) + if len(leftovers[-1]) == 0: + log.info("Socket was closed") - '''Asynchronous connection handler. Pushes data from socket - into command queue linewise''' - try: - while True: - try: - leftovers.append(conn.recv(4096).decode(errors='replace')) - if len(leftovers[-1]) == 0: - log.info("Socket was closed") + # FIXME try to reconnect + conn.close() + Gtk.main_quit() + return False - # FIXME try to reconnect - conn.close() - Gtk.main_quit() - return False + except UnicodeDecodeError as e: + continue + except: + pass - except UnicodeDecodeError as e: - continue - except: - pass + data = "".join(leftovers) + del leftovers[:] - data = "".join(leftovers) - del leftovers[:] + lines = data.split('\n') + for line in lines[:-1]: + log.debug("got line: %r", line) - lines = data.split('\n') - for line in lines[:-1]: - log.debug("got line: %r", line) + line = line.strip() + log.debug('re-starting on_loop scheduling') + GObject.idle_add(on_loop) - line = line.strip() - log.debug('re-starting on_loop scheduling') - GObject.idle_add(on_loop) + command_queue.put((line, conn)) - command_queue.put((line, conn)) + if lines[-1] != '': + log.debug("remaining %r", lines[-1]) - if lines[-1] != '': - log.debug("remaining %r", lines[-1]) + leftovers.append(lines[-1]) + return True - leftovers.append(lines[-1]) - return True def on_loop(): - '''Command handler. Processes commands in the command queue whenever - nothing else is happening (registered as GObject idle callback)''' + '''Command handler. Processes commands in the command queue whenever + nothing else is happening (registered as GObject idle callback)''' - global command_queue + global command_queue - log.debug('on_loop called') + log.debug('on_loop called') - if command_queue.empty(): - log.debug('command_queue is empty again, stopping on_loop scheduling') - return False + if command_queue.empty(): + log.debug('command_queue is empty again, stopping on_loop scheduling') + return False - line, requestor = command_queue.get() + line, requestor = command_queue.get() - words = line.split() - if len(words) < 1: - log.debug('command_queue is empty again, stopping on_loop scheduling') - return True + words = line.split() + if len(words) < 1: + log.debug('command_queue is empty again, stopping on_loop scheduling') + return True - signal = words[0] - args = words[1:] + signal = words[0] + args = words[1:] - log.info('received signal %s, dispatching', signal) - if signal not in signal_handlers: - return True + log.info('received signal %s, dispatching', signal) + if signal not in signal_handlers: + return True - for handler in signal_handlers[signal]: - cb = handler['cb'] - if 'one' in handler and handler['one']: - log.debug('removing one-time handler') - del signal_handlers[signal] + for handler in signal_handlers[signal]: + cb = handler['cb'] + if 'one' in handler and handler['one']: + log.debug('removing one-time handler') + del signal_handlers[signal] - cb(*args) + cb(*args) + + return True - return True def send(command, *args): - global conn, log - if len(args) > 0: - command += ' '+(' '.join(args)) + global conn, log + if len(args) > 0: + command += ' ' + (' '.join(args)) + + command += '\n' - command += '\n' + conn.send(command.encode('ascii')) - conn.send(command.encode('ascii')) def on(signal, cb): - if signal not in signal_handlers: - signal_handlers[signal] = [] + if signal not in signal_handlers: + signal_handlers[signal] = [] + + signal_handlers[signal].append({'cb': cb}) - signal_handlers[signal].append({'cb': cb}) def one(signal, cb): - if signal not in signal_handlers: - signal_handlers[signal] = [] + if signal not in signal_handlers: + signal_handlers[signal] = [] - signal_handlers[signal].append({'cb': cb, 'one': True}) + signal_handlers[signal].append({'cb': cb, 'one': True}) |