Started transition to async networking on client-side
This commit is contained in:
parent
424e012651
commit
19fd9d1962
1 changed files with 48 additions and 6 deletions
|
@ -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.")
|
||||
|
|
Reference in a new issue