DotnetStandardStreams/source/DotnetStandardStreams/BinaryStdinReader.cs

61 lines
1.6 KiB
C#

using System;
namespace DotnetStandardStreams
{
public class BytesReadEventArgs
{
public byte[] Data { get; }
public int Size { get; }
public BytesReadEventArgs(byte[] data, int size)
{
Data = data;
Size = size;
}
}
public delegate void BytesReadEventHandler(object sender, BytesReadEventArgs e);
// TODO: This class is unfinished, untested, unused. Ignore it or fix it but don't use it as-is. Notice there is no interface to it yet.
public class BinaryStdinReader
{
protected readonly Action<byte[], int>? dataReceiverProc;
protected readonly Action<int>? doneProc;
public event BytesReadEventHandler? OnBytesRead;
public event EventHandler? OnDone;
public BinaryStdinReader(Action<byte[], int> dataReceiverProc, Action<int> doneProc)
{
this.dataReceiverProc = dataReceiverProc;
this.doneProc = doneProc;
}
public BinaryStdinReader() { }
public void ReadBytes(Action<byte[], int> receiverProc, Action<int> doneProc)
{
using System.IO.Stream stdinStream = System.Console.OpenStandardInput();
int totalBytesRead = 0;
const int bufferSize = 2048;
byte[] buffer = new byte[bufferSize];
int bytesRead = stdinStream.Read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
OnBytesRead?.Invoke(this, new BytesReadEventArgs(buffer, bytesRead));
receiverProc?.Invoke(buffer, bytesRead);
if (bytesRead < bufferSize)
break;
bytesRead = stdinStream.Read(buffer, 0, bufferSize);
totalBytesRead += bytesRead;
}
OnDone?.Invoke(this, new EventArgs());
doneProc?.Invoke(totalBytesRead);
}
}
}