| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | 
							- using System.IO.Pipes;
 
- using System.Security.Principal;
 
- using H.Formatters;
 
- using H.Pipes;
 
- using H.Pipes.AccessControl;
 
- namespace InABox.Rpc
 
- {
 
-     public class RpcServerPipeTransport : RpcServerTransport<PipeConnection<RpcMessage?>>, IDisposable
 
-     {
 
-         private PipeServer<RpcMessage?> _transport;
 
-         public override bool IsSecure() => false;
 
-         
 
-         private void SetPipeSecurity()
 
-         {
 
-             #pragma warning disable CA1416
 
-             
 
-             var pipeSecurity = new PipeSecurity();
 
-             pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.LocalSid, null), PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow));
 
-             pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.LocalServiceSid, null), PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow));
 
-             pipeSecurity.AddAccessRule(new PipeAccessRule(new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null), PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow));
 
-             _transport.SetPipeSecurity(pipeSecurity);
 
-             
 
-             #pragma warning restore CA1416
 
-         }
 
-         public RpcServerPipeTransport(string name)
 
-         {
 
-             _transport = new PipeServer<RpcMessage?>(name, formatter:new BinaryFormatter());
 
-             #if WINDOWS
 
-             SetPipeSecurity();
 
-             #endif
 
-             
 
-             _transport.ClientConnected += Transport_OnConnected;
 
-             _transport.ClientDisconnected += Transport_OnDisconnected;
 
-             _transport.MessageReceived += Transport_OnMessage;
 
-             _transport.ExceptionOccurred += Transport_OnException;
 
-         }
 
-         
 
-         public override void Start()
 
-         {
 
-             _transport.StartAsync().Wait();
 
-         }
 
-         public override void Stop()
 
-         {
 
-             _transport.StopAsync().Wait();
 
-         }
 
-         
 
-         private void Transport_OnConnected(object? sender, H.Pipes.Args.ConnectionEventArgs<RpcMessage?> e)
 
-         {
 
-             DoOpen(e.Connection);
 
-         }
 
-         private void Transport_OnMessage(object? sender, H.Pipes.Args.ConnectionMessageEventArgs<RpcMessage?> e)
 
-         {
 
-             Task.Run(() =>
 
-             {
 
-                 var response = DoMessage(e.Connection, e.Message);
 
-                 e.Connection.WriteAsync(response);
 
-             });
 
-         }
 
-         public override void Send(PipeConnection<RpcMessage?> connection, RpcMessage message)
 
-         {
 
-             connection.WriteAsync(message);
 
-         }
 
-         private void Transport_OnDisconnected(object? sender, H.Pipes.Args.ConnectionEventArgs<RpcMessage?> e)
 
-         {
 
-             DoClose(e.Connection, RpcTransportCloseEventType.Closed);
 
-             e.Connection.DisposeAsync();
 
-         }
 
-         private void Transport_OnException(object? sender, H.Pipes.Args.ExceptionEventArgs e)
 
-         {
 
-             DoException(null, e.Exception);
 
-         }
 
-         public void Dispose()
 
-         {
 
-             _transport.DisposeAsync().AsTask().Wait();
 
-         }
 
-         
 
-         ~RpcServerPipeTransport()
 
-         {
 
-             Dispose();
 
-         }
 
-     }
 
- }
 
 
  |