using System; using System.IO; namespace Org.BouncyCastle.Utilities.IO { public sealed class Streams { private const int BufferSize = 512; private Streams() { } public static void Drain(Stream inStr) { byte[] bs = new byte[BufferSize]; while (inStr.Read(bs, 0, bs.Length) > 0) { } } public static byte[] ReadAll(Stream inStr) { MemoryStream buf = new MemoryStream(); PipeAll(inStr, buf); return buf.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; } public static void PipeAll(Stream inStr, Stream outStr) { byte[] bs = new byte[BufferSize]; int numRead; while ((numRead = inStr.Read(bs, 0, bs.Length)) > 0) { outStr.Write(bs, 0, numRead); } } /// /// 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) { byte[] bs = new byte[BufferSize]; long total = 0; int numRead; while ((numRead = inStr.Read(bs, 0, bs.Length)) > 0) { if ((limit - total) < numRead) throw new StreamOverflowException("Data Overflow"); total += numRead; outStr.Write(bs, 0, numRead); } return total; } } }