1c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrompackage org.bouncycastle.util.io;
2c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
3c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.ByteArrayOutputStream;
4c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.IOException;
5c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.InputStream;
6c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.OutputStream;
7c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
8c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrompublic final class Streams
9c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom{
10c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    private static int BUFFER_SIZE = 512;
11c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
12c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public static void drain(InputStream inStr)
13c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throws IOException
14c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
15c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        byte[] bs = new byte[BUFFER_SIZE];
16c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        while (inStr.read(bs, 0, bs.length) >= 0)
17c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
18c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
19c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
20c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
21c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public static byte[] readAll(InputStream inStr)
22c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throws IOException
23c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
24c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        ByteArrayOutputStream buf = new ByteArrayOutputStream();
25c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        pipeAll(inStr, buf);
26c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return buf.toByteArray();
27c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
28c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
29c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public static byte[] readAllLimited(InputStream inStr, int limit)
30c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throws IOException
31c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
32c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        ByteArrayOutputStream buf = new ByteArrayOutputStream();
33c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        pipeAllLimited(inStr, limit, buf);
34c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return buf.toByteArray();
35c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
36c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
37c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public static int readFully(InputStream inStr, byte[] buf)
38c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throws IOException
39c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
40c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return readFully(inStr, buf, 0, buf.length);
41c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
42c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
43c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public static int readFully(InputStream inStr, byte[] buf, int off, int len)
44c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throws IOException
45c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
46c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        int totalRead = 0;
47c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        while (totalRead < len)
48c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
49c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            int numRead = inStr.read(buf, off + totalRead, len - totalRead);
50c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            if (numRead < 0)
51c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            {
52c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                break;
53c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            }
54c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            totalRead += numRead;
55c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
56c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return totalRead;
57c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
58c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
59c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public static void pipeAll(InputStream inStr, OutputStream outStr)
60c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throws IOException
61c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
62c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        byte[] bs = new byte[BUFFER_SIZE];
63c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        int numRead;
64c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        while ((numRead = inStr.read(bs, 0, bs.length)) >= 0)
65c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
66c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            outStr.write(bs, 0, numRead);
67c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
68c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
69c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
70c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public static long pipeAllLimited(InputStream inStr, long limit, OutputStream outStr)
71c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throws IOException
72c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
73c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        long total = 0;
74c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        byte[] bs = new byte[BUFFER_SIZE];
75c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        int numRead;
76c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        while ((numRead = inStr.read(bs, 0, bs.length)) >= 0)
77c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
78c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            total += numRead;
79c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            if (total > limit)
80c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            {
81c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom                throw new StreamOverflowException("Data Overflow");
82c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            }
83c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom            outStr.write(bs, 0, numRead);
84c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
85c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return total;
86c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
87c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom}
88