From 19fd9d19627759414ec716b05425176117fec394 Mon Sep 17 00:00:00 2001 From: PhilipTrauner Date: Mon, 4 Jan 2016 03:56:24 +0100 Subject: [PATCH] Started transition to async networking on client-side --- Sublime/fl0w/fl0w.py | 54 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/Sublime/fl0w/fl0w.py b/Sublime/fl0w/fl0w.py index 640e0ff..993be58 100644 --- a/Sublime/fl0w/fl0w.py +++ b/Sublime/fl0w/fl0w.py @@ -1,5 +1,7 @@ from sys import path import os +import _thread + fl0w_path = os.path.dirname(os.path.realpath(__file__)) shared_path = os.path.dirname(os.path.realpath(__file__)) + "/Shared/" if fl0w_path not in path: @@ -16,15 +18,49 @@ import sublime_plugin import socket from ESock import ESock +import Routing from SublimeMenu import * import webbrowser def plugin_unloaded(): observer.stop() + try: + fl0w.sock.close() + except: + pass print("Observer stopped!") +class HandledESock: + def __init__(self, sock, disconnect): + self._sock = sock + self.disconnect = disconnect + + def __getattr__(self, attr): + if attr == "send": + return self.send + return getattr(self._sock, attr) + + def send(self, data, prefix): + try: + self._sock.send(data, prefix) + except OSError: + self.disconnect() + + def recv(self): + try: + return self._sock.recv() + except OSError: + self.disconnect() + + +def sock_handler(sock, routes, handler): + data = sock.recv() + if data[1] in routes: + routes[data[1]].run(data[0], handler) + + class ReloadHandler(FileSystemEventHandler): def on_modified(self, event): print("Modified: %s" % event) @@ -44,6 +80,7 @@ class Fl0w: self.start_menu.add_item(Item("Connect", "Connect to a fl0w server", action=self.invoke_connect)) self.start_menu.add_item(Item("About", "Information about fl0w", action=self.invoke_about)) self.main_menu = Items() + self.main_menu.add_item(Item("Choose Link", "Select Link on which code is executed", action=self.invoke_info)) self.main_menu.add_item(Item("Info", "Server info", action=self.invoke_info)) self.main_menu.add_item(Item("Disconnect", "Disconnect from server", action=self.invoke_disconnect)) @@ -58,10 +95,13 @@ class Fl0w: webbrowser.open("http://robot0nfire.com") def invoke_info(self): - self.sock.send({"info" : ""}) - sublime.message_dialog(self.sock.recv()) - self.sock.send("") - sublime.message_dialog(self.sock.recv()) + self.sock.send({}, "info") + + class Info(Routing.Route): + def run(self, data, fl0w): + sublime.message_dialog(data) + + def invoke_disconnect(self): self.sock.close() @@ -69,14 +109,16 @@ class Fl0w: sublime.message_dialog("Connection closed") + def connect(self, connect_details): connect_details = connect_details.split(":") if len(connect_details) == 2: try: - self.sock = ESock(socket.create_connection((connect_details[0], int(connect_details[1])))) + self.sock = HandledESock(ESock(socket.create_connection((connect_details[0], int(connect_details[1])))), self.invoke_disconnect) sublime.status_message("Connected to %s:%s." % (connect_details[0], connect_details[1])) self.connected = True - except Exception as e: + _thread.start_new_thread(sock_handler, (self.sock, {"info" : Fl0w.Info()}, self)) + except OSError as e: sublime.error_message("Error during connection creation:\n %s" % str(e)) else: sublime.error_message("Invalid input.")