RPCClientPipeTransport.cs 2.1 KB

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