Change TryWriteAnsiRequest method to virtual which use common code for all drivers.

This commit is contained in:
BDisp
2024-11-11 01:10:18 +00:00
parent 089f7569fd
commit 36876b9899
14 changed files with 238 additions and 380 deletions

View File

@@ -187,68 +187,6 @@ internal class WindowsDriver : ConsoleDriver
}
}
private readonly ManualResetEventSlim _waitAnsiResponse = new (false);
private CancellationTokenSource? _ansiResponseTokenSource;
/// <inheritdoc/>
public override bool TryWriteAnsiRequest (AnsiEscapeSequenceRequest ansiRequest)
{
if (_mainLoopDriver is null)
{
return false;
}
_ansiResponseTokenSource ??= new ();
try
{
lock (ansiRequest._responseLock)
{
ansiRequest.ResponseFromInput += (s, e) =>
{
Debug.Assert (s == ansiRequest);
Debug.Assert (e == ansiRequest.AnsiEscapeSequenceResponse);
_waitAnsiResponse.Set ();
};
AnsiEscapeSequenceRequests.Add (ansiRequest);
WriteRaw (ansiRequest.Request);
_mainLoopDriver._forceRead = true;
}
_waitAnsiResponse.Wait (_ansiResponseTokenSource.Token);
}
catch (OperationCanceledException)
{
return false;
}
lock (ansiRequest._responseLock)
{
_mainLoopDriver._forceRead = false;
if (AnsiEscapeSequenceRequests.Statuses.TryPeek (out AnsiEscapeSequenceRequestStatus? request))
{
if (AnsiEscapeSequenceRequests.Statuses.Count > 0
&& string.IsNullOrEmpty (request.AnsiRequest.AnsiEscapeSequenceResponse?.Response))
{
lock (request.AnsiRequest._responseLock)
{
// Bad request or no response at all
AnsiEscapeSequenceRequests.Statuses.TryDequeue (out _);
}
}
}
_waitAnsiResponse.Reset ();
return ansiRequest.AnsiEscapeSequenceResponse is { Valid: true };
}
}
internal override void WriteRaw (string ansi) { WinConsole?.WriteANSI (ansi); }
#region Not Implemented