using System;
using System.IO;
namespace Org.BouncyCastle.Utilities.IO
{
public static class Streams
{
private const int BufferSize = 4096;
public static void Drain(Stream inStr)
{
inStr.CopyTo(Stream.Null, BufferSize);
}
/// Write the full contents of inStr to the destination stream outStr.
/// Source stream.
/// Destination stream.
/// In case of IO failure.
public static void PipeAll(Stream inStr, Stream outStr)
{
inStr.CopyTo(outStr, BufferSize);
}
/// Write the full contents of inStr to the destination stream outStr.
/// Source stream.
/// Destination stream.
/// The size of temporary buffer to use.
/// In case of IO failure.
public static void PipeAll(Stream inStr, Stream outStr, int bufferSize)
{
inStr.CopyTo(outStr, bufferSize);
}
///
/// Pipe all bytes from inStr to outStr, throwing StreamFlowException if greater
/// than limit bytes in inStr.
///
///
/// A
///
///
/// A
///
///
/// A
///
/// The number of bytes actually transferred, if not greater than limit
///
public static long PipeAllLimited(Stream inStr, long limit, Stream outStr)
{
var limited = new LimitedInputStream(inStr, limit);
limited.CopyTo(outStr, BufferSize);
return limit - limited.CurrentLimit;
}
public static byte[] ReadAll(Stream inStr)
{
MemoryStream buf = new MemoryStream();
PipeAll(inStr, buf);
return buf.ToArray();
}
public static byte[] ReadAll(MemoryStream inStr)
{
return inStr.ToArray();
}
public static byte[] ReadAllLimited(Stream inStr, int limit)
{
MemoryStream buf = new MemoryStream();
PipeAllLimited(inStr, limit, buf);
return buf.ToArray();
}
public static int ReadFully(Stream inStr, byte[] buf)
{
return ReadFully(inStr, buf, 0, buf.Length);
}
public static int ReadFully(Stream inStr, byte[] buf, int off, int len)
{
int totalRead = 0;
while (totalRead < len)
{
int numRead = inStr.Read(buf, off + totalRead, len - totalRead);
if (numRead < 1)
break;
totalRead += numRead;
}
return totalRead;
}
#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER
public static int ReadFully(Stream inStr, Span buffer)
{
int totalRead = 0;
while (totalRead < buffer.Length)
{
int numRead = inStr.Read(buffer[totalRead..]);
if (numRead < 1)
break;
totalRead += numRead;
}
return totalRead;
}
#endif
public static void ValidateBufferArguments(byte[] buffer, int offset, int count)
{
if (buffer == null)
throw new ArgumentNullException("buffer");
int available = buffer.Length - offset;
if ((offset | available) < 0)
throw new ArgumentOutOfRangeException("offset");
int remaining = available - count;
if ((count | remaining) < 0)
throw new ArgumentOutOfRangeException("count");
}
///
public static int WriteBufTo(MemoryStream buf, byte[] output, int offset)
{
#if NETCOREAPP2_0_OR_GREATER || NETSTANDARD2_1_OR_GREATER
if (buf.TryGetBuffer(out var buffer))
{
buffer.CopyTo(output, offset);
return buffer.Count;
}
#endif
int size = Convert.ToInt32(buf.Length);
buf.WriteTo(new MemoryStream(output, offset, size));
return size;
}
}
}