RPCClientPipeTransport.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using System;
  2. using H.Pipes;
  3. using InABox.Core;
  4. namespace InABox.Rpc
  5. {
  6. public class RpcClientPipeTransport : RpcClientTransport, IDisposable
  7. {
  8. private PipeClient<RpcMessage> _pipe;
  9. private String _name;
  10. public RpcClientPipeTransport(string name)
  11. {
  12. _name = name;
  13. _pipe = new PipeClient<RpcMessage>(_name);
  14. _pipe.Connected += PipeConnected;
  15. _pipe.Disconnected += PipeDisconnected;
  16. _pipe.MessageReceived += PipeMessageReceived;
  17. _pipe.ExceptionOccurred += PipeExceptionOccurred;
  18. }
  19. public override void Connect()
  20. {
  21. _pipe.ConnectAsync().Wait();
  22. }
  23. public override bool IsConnected() => _pipe?.IsConnected == true;
  24. public override bool IsSecure() => false;
  25. public override void Disconnect()
  26. {
  27. _pipe.DisconnectAsync();
  28. }
  29. public override void Send(RpcMessage message)
  30. {
  31. _pipe.WriteAsync(message);
  32. }
  33. private void PipeConnected(object? sender, H.Pipes.Args.ConnectionEventArgs<RpcMessage> e)
  34. {
  35. DoOpen();
  36. }
  37. private void PipeDisconnected(object? sender, H.Pipes.Args.ConnectionEventArgs<RpcMessage> e)
  38. {
  39. DoClose(RpcTransportCloseEventType.Closed);
  40. }
  41. private void PipeExceptionOccurred(object? sender, H.Pipes.Args.ExceptionEventArgs e)
  42. {
  43. Logger.Send(LogType.Error, "", $"Exception occured: {e.Exception.Message}");
  44. }
  45. private void PipeMessageReceived(object? sender, H.Pipes.Args.ConnectionMessageEventArgs<RpcMessage?> e)
  46. {
  47. Accept(e.Message);
  48. }
  49. public void Dispose()
  50. {
  51. _pipe.DisposeAsync().AsTask().Wait();
  52. }
  53. ~RpcClientPipeTransport()
  54. {
  55. Dispose();
  56. }
  57. protected override RpcClientTransport Clone() => new RpcClientPipeTransport(_name);
  58. }
  59. }