using System; using System.ComponentModel; using System.IO.Pipes; using System.Linq; using System.Threading; using OpenTap.Cli; namespace OpenTap { [Browsable(false)] internal class ProcessCliAction : ICliAction { [CommandLineArgument("PipeHandle")] public string PipeHandle { get; set; } public int Execute(CancellationToken cancellationToken) { var client = new NamedPipeClientStream(".", PipeHandle, PipeDirection.InOut); var listener = new EventTraceListener(); listener.MessageLogged += evts => { if (client.IsConnected == false) return; client.WriteMessage(evts.ToArray()); }; try { client.Connect(); var plan = client.ReadMessage(); Log.AddListener(listener); return (int)plan.Execute(Array.Empty()).Verdict; } finally { // ensure the log is flushed before removing the listener. Log.Flush(); Log.RemoveListener(listener); client.Dispose(); } } } }