RPCClientPipeTransport.cs 2.2 KB

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