59 lines
1.5 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|