61 lines
1.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|