35 lines
1.1 KiB
C#
35 lines
1.1 KiB
C#
|
using CliWrap;
|
||
|
|
||
|
namespace InnovEnergy.Lib.Channels.V2.Pipes;
|
||
|
|
||
|
public class ChannelPipeTarget : PipeTarget
|
||
|
{
|
||
|
private readonly IStreamChannel _StreamChannel;
|
||
|
private Byte[] _Buffer;
|
||
|
|
||
|
private ChannelPipeTarget(IStreamChannel streamChannel, UInt32 bufferSize = 64)
|
||
|
{
|
||
|
_StreamChannel = streamChannel;
|
||
|
_Buffer = new Byte[bufferSize];
|
||
|
}
|
||
|
|
||
|
public static ChannelPipeTarget FromStreamChannel(IStreamChannel streamChannel, UInt32 bufferSize)
|
||
|
{
|
||
|
return new ChannelPipeTarget(streamChannel, bufferSize);
|
||
|
}
|
||
|
|
||
|
public static PipeTarget FromStreamChannel(IStreamChannel streamChannel)
|
||
|
{
|
||
|
return new ChannelPipeTarget(streamChannel);
|
||
|
}
|
||
|
|
||
|
public override async Task CopyFromAsync(Stream source, CancellationToken cancellationToken = new CancellationToken())
|
||
|
{
|
||
|
var nRead = await source.ReadAsync(_Buffer, 0, _Buffer.Length, cancellationToken);
|
||
|
|
||
|
await _StreamChannel.Write(new ArraySegment<Byte>(_Buffer, 0, nRead));
|
||
|
|
||
|
if (nRead >= _Buffer.Length)
|
||
|
_Buffer = new Byte[_Buffer.Length * 2];
|
||
|
}
|
||
|
}
|