socket2event.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import threading
  2. from python_runtime.statecharts_core import Event
  3. import socket
  4. def _recv(controller, sock):
  5. data = sock.recv(4096)
  6. controller.addInput(Event("received_socket", "socket_in", [sock, data]), 0.0)
  7. def _accept(controller, sock):
  8. conn, addr = sock.accept()
  9. controller.addInput(Event("accepted_socket", "socket_in", [sock, conn]), 0.0)
  10. def _connect(controller, sock, destination):
  11. sock.connect(destination)
  12. controller.addInput(Event("connected_socket", "socket_in", [sock]), 0.0)
  13. def _create(controller, _):
  14. sock = socket.socket()
  15. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  16. controller.addInput(Event("created_socket", "socket_in", [sock]), 0.0)
  17. def _send(controller, sock, data):
  18. sent = sock.send(data)
  19. controller.addInput(Event("sent_socket", "socket_in", [sock, sent]), 0.0)
  20. def _close(controller, sock):
  21. sock.close()
  22. controller.addInput(Event("closed_socket", "socket_in", [sock]), 0.0)
  23. def _bind(controller, sock, addr):
  24. sock.bind(addr)
  25. controller.addInput(Event("bound_socket", "socket_in", [sock]), 0.0)
  26. def _listen(controller, sock):
  27. sock.listen(1)
  28. controller.addInput(Event("listened_socket", "socket_in", [sock]), 0.0)
  29. def _wrapper_func(*args):
  30. func = args[0]
  31. controller = args[1]
  32. sock = args[2]
  33. try:
  34. func(*args[1:])
  35. except socket.error as e:
  36. print("ERROR " + str(e))
  37. controller.addInput(Event("error_socket", "socket_in", [sock, e]), 0.0)
  38. except Exception as e:
  39. print("UNKNOWN ERROR " + str(e))
  40. controller.addInput(Event("unknown_error_socket", "socket_in", [sock, e]), 0.0)
  41. def _start_on_daemon_thread(func, args):
  42. new_args = [func]
  43. new_args.extend(args)
  44. args = new_args
  45. thrd = threading.Thread(target=_wrapper_func, args=args)
  46. thrd.daemon = True
  47. thrd.start()
  48. def boot_translation_service(controller):
  49. _start_on_daemon_thread(_poll, [controller, None])
  50. def _poll(controller, _):
  51. socket_out = controller.addOutputListener("socket_out")
  52. while 1:
  53. evt = socket_out.fetch(-1)
  54. name, params = evt.getName(), evt.getParameters()
  55. print("Got event " + str(evt))
  56. if name == "accept_socket":
  57. _start_on_daemon_thread(_accept, [controller, params[0]])
  58. elif name == "recv_socket":
  59. _start_on_daemon_thread(_recv, [controller, params[0]])
  60. elif name == "connect_socket":
  61. _start_on_daemon_thread(_connect, [controller, params[0], params[1]])
  62. elif name == "create_socket":
  63. _start_on_daemon_thread(_create, [controller, None])
  64. elif name == "close_socket":
  65. _start_on_daemon_thread(_close, [controller, params[0]])
  66. elif name == "send_socket":
  67. _start_on_daemon_thread(_send, [controller, params[0], params[1]])
  68. elif name == "bind_socket":
  69. _start_on_daemon_thread(_bind, [controller, params[0], params[1]])
  70. elif name == "listen_socket":
  71. _start_on_daemon_thread(_listen, [controller, params[0]])
  72. elif name == "stop":
  73. break