2 // System.IO.BufferedStream
5 // Matt Kimball (matt@kimball.net)
9 public sealed class BufferedStream : Stream {
13 int m_buffer_read_ahead;
14 bool m_buffer_reading;
16 public BufferedStream(Stream stream) : this(stream, 4096) {
19 public BufferedStream(Stream stream, int buffer_size) {
21 m_buffer = new byte[buffer_size];
24 public override bool CanRead {
26 return m_stream.CanRead;
30 public override bool CanWrite {
32 return m_stream.CanWrite;
36 public override bool CanSeek {
38 return m_stream.CanSeek;
42 public override long Length {
44 return m_stream.Length;
48 public override long Position {
50 return m_stream.Position - m_buffer_read_ahead + m_buffer_pos;
55 m_stream.Position = value;
59 public override void Close() {
65 public override void Dispose() {
70 public override void Flush() {
71 if (m_buffer_reading) {
72 m_stream.Position = Position;
74 m_stream.Write(m_buffer, 0, m_buffer_pos);
77 m_buffer_read_ahead = 0;
81 public override long Seek(long offset, SeekOrigin origin) {
83 return m_stream.Seek(offset, origin);
86 public override void SetLength(long value) {
87 m_stream.SetLength(value);
90 public override int ReadByte() {
91 byte[] b = new byte[1];
93 if (Read(b, 0, 1) == 1) {
100 public override void WriteByte(byte value) {
101 byte[] b = new byte[1];
107 public override int Read(byte[] array, int offset, int count) {
108 if (!m_buffer_reading) {
110 m_buffer_reading = true;
113 if (count <= m_buffer_read_ahead - m_buffer_pos) {
114 Array.Copy(m_buffer, m_buffer_pos, array, offset, count);
116 m_buffer_pos += count;
117 if (m_buffer_pos == m_buffer_read_ahead) {
119 m_buffer_read_ahead = 0;
125 int ret = m_buffer_read_ahead - m_buffer_pos;
126 Array.Copy(m_buffer, m_buffer_pos, array, offset, ret);
128 m_buffer_read_ahead = 0;
132 if (count >= m_buffer.Length) {
133 ret += m_stream.Read(array, offset, count);
135 m_buffer_read_ahead = m_stream.Read(m_buffer, 0, m_buffer.Length);
137 if (count < m_buffer_read_ahead) {
138 Array.Copy(m_buffer, 0, array, offset, count);
139 m_buffer_pos = count;
142 Array.Copy(m_buffer, 0, array, offset, m_buffer_read_ahead);
143 ret += m_buffer_read_ahead;
144 m_buffer_read_ahead = 0;
151 public override void Write(byte[] array, int offset, int count) {
152 if (m_buffer_reading) {
154 m_buffer_reading = false;
157 if (m_buffer_pos + count >= m_buffer.Length) {
159 m_stream.Write(array, offset, count);
161 Array.Copy(array, offset, m_buffer, m_buffer_pos, count);
162 m_buffer_pos += count;