RPCClientPipeTransport.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 string? ServerName() => _name;
  26. public override void Disconnect()
  27. {
  28. _pipe.DisconnectAsync();
  29. }
  30. public override void Send(RpcMessage message)
  31. {
  32. _pipe.WriteAsync(message);
  33. }
  34. private void PipeConnected(object? sender, H.Pipes.Args.ConnectionEventArgs<RpcMessage> e)
  35. {
  36. DoOpen();
  37. }
  38. private void PipeDisconnected(object? sender, H.Pipes.Args.ConnectionEventArgs<RpcMessage> e)
  39. {
  40. DoClose(RpcTransportCloseEventType.Closed);
  41. }
  42. private void PipeExceptionOccurred(object? sender, H.Pipes.Args.ExceptionEventArgs e)
  43. {
  44. Logger.Send(LogType.Error, "", $"Exception occured: {e.Exception.Message}");
  45. }
  46. private void PipeMessageReceived(object? sender, H.Pipes.Args.ConnectionMessageEventArgs<RpcMessage?> e)
  47. {
  48. Accept(e.Message);
  49. }
  50. public void Dispose()
  51. {
  52. _pipe.DisposeAsync().AsTask().Wait();
  53. }
  54. ~RpcClientPipeTransport()
  55. {
  56. Dispose();
  57. }
  58. protected override RpcClientTransport Clone() => new RpcClientPipeTransport(_name);
  59. }
  60. }