DotnetStandardStreams/source/DotnetStreams/BinaryStdinReader.cs
2025-05-15 13:27:49 -06:00

59 lines
1.5 KiB
C#

using System;
namespace DotnetStreams
{
public class BytesReadEventArgs
{
public byte[] Data { get; }
public int Size { get; }
public BytesReadEventArgs(byte[] data, int size)
{
this.Data = data;
this.Size = size;
}
}
public delegate void BytesReadEventHandler(object sender, BytesReadEventArgs e);
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;
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);
}
}
}