|
|
|
@ -10,22 +10,22 @@ public class AnsiProcess : Process
|
|
|
|
|
{ |
|
|
|
|
private AsyncStreamReader? stdoutReader; |
|
|
|
|
private AsyncStreamReader? stderrReader; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public AnsiProcess(ProcessStartInfo startInfo) |
|
|
|
|
{ |
|
|
|
|
StartInfo = startInfo; |
|
|
|
|
EnableRaisingEvents = false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
StartInfo.UseShellExecute = false; |
|
|
|
|
StartInfo.CreateNoWindow = true; |
|
|
|
|
StartInfo.RedirectStandardOutput = true; |
|
|
|
|
StartInfo.RedirectStandardInput = true; |
|
|
|
|
StartInfo.RedirectStandardError = true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Need this to parse ANSI escape sequences correctly |
|
|
|
|
StartInfo.StandardOutputEncoding = Encoding.UTF8; |
|
|
|
|
StartInfo.StandardErrorEncoding = Encoding.UTF8; |
|
|
|
|
StartInfo.StandardInputEncoding = Encoding.UTF8; |
|
|
|
|
StartInfo.StandardOutputEncoding = new UTF8Encoding(false); |
|
|
|
|
StartInfo.StandardErrorEncoding = new UTF8Encoding(false); |
|
|
|
|
StartInfo.StandardInputEncoding = new UTF8Encoding(false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
@ -35,23 +35,33 @@ public class AnsiProcess : Process
|
|
|
|
|
public void BeginAnsiRead(Action<ProcessOutput> callback) |
|
|
|
|
{ |
|
|
|
|
var stdoutStream = StandardOutput.BaseStream; |
|
|
|
|
stdoutReader = new AsyncStreamReader(stdoutStream, s => |
|
|
|
|
{ |
|
|
|
|
if (s == null) return; |
|
|
|
|
callback(ProcessOutput.FromStdOutLine(s)); |
|
|
|
|
}, StandardOutput.CurrentEncoding); |
|
|
|
|
|
|
|
|
|
stdoutReader = new AsyncStreamReader( |
|
|
|
|
stdoutStream, |
|
|
|
|
s => |
|
|
|
|
{ |
|
|
|
|
if (s == null) |
|
|
|
|
return; |
|
|
|
|
callback(ProcessOutput.FromStdOutLine(s)); |
|
|
|
|
}, |
|
|
|
|
StandardOutput.CurrentEncoding |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
var stderrStream = StandardError.BaseStream; |
|
|
|
|
stderrReader = new AsyncStreamReader(stderrStream, s => |
|
|
|
|
{ |
|
|
|
|
if (s == null) return; |
|
|
|
|
callback(ProcessOutput.FromStdErrLine(s)); |
|
|
|
|
}, StandardError.CurrentEncoding); |
|
|
|
|
stderrReader = new AsyncStreamReader( |
|
|
|
|
stderrStream, |
|
|
|
|
s => |
|
|
|
|
{ |
|
|
|
|
if (s == null) |
|
|
|
|
return; |
|
|
|
|
callback(ProcessOutput.FromStdErrLine(s)); |
|
|
|
|
}, |
|
|
|
|
StandardError.CurrentEncoding |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
stdoutReader.BeginReadLine(); |
|
|
|
|
stderrReader.BeginReadLine(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|
/// Waits for output readers to finish |
|
|
|
|
/// </summary> |
|
|
|
|