tool/TeamCity.Docker/StreamService.cs (69 lines of code) (raw):
// ReSharper disable ClassNeverInstantiated.Global
namespace TeamCity.Docker
{
using System;
using System.Buffers;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using IoC;
internal class StreamService : IStreamService
{
private readonly ILogger _logger;
public StreamService([NotNull] ILogger logger) => _logger = logger ?? throw new ArgumentNullException(nameof(logger));
public async Task<Result> Copy(Stream sourceStream, Stream targetStream, string description)
{
if (sourceStream == null)
{
throw new ArgumentNullException(nameof(sourceStream));
}
if (targetStream == null)
{
throw new ArgumentNullException(nameof(targetStream));
}
if (description == null)
{
throw new ArgumentNullException(nameof(description));
}
var buffer = ArrayPool<byte>.Shared.Rent(0xffff);
while (true)
{
try
{
var bytes = await sourceStream.ReadAsync(buffer, 0, buffer.Length);
if (bytes <= 0)
{
break;
}
await targetStream.WriteAsync(buffer, 0, bytes);
}
catch (Exception ex)
{
_logger.Log($"{description}: {ex.Message}", Result.Error);
return Result.Error;
}
}
return Result.Success;
}
public void ProcessLines(Stream source, Action<string> handler)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
if (handler == null)
{
throw new ArgumentNullException(nameof(handler));
}
using var streamReader = new StreamReader(source, Encoding.UTF8);
do
{
var line = streamReader.ReadLine();
if (line != null)
{
handler(line);
}
} while (!streamReader.EndOfStream);
}
}
}