annotate Util/PrebufferingStream.cs @ 5:2933f7750542

Added read-buffering stream wrapper
author Ivo Smits <Ivo@UCIS.nl>
date Tue, 08 Jan 2013 16:38:21 +0100
parents
children 9525fb2d14ec
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
1 ???using System;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
2 using System.Collections.Generic;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
3 using System.Text;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
4 using System.IO;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
5 using System.Threading;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
6
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
7 namespace UCIS.Util {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
8 public class PrebufferingStream : Stream {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
9 class AsyncResult : AsyncResultBase {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
10 public int Count { get; private set; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
11 public int Left { get; set; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
12 public AsyncResult(AsyncCallback callback, Object state) : base(callback, state) { }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
13 public void SetCompleted(Boolean synchronously, int count, Exception error) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
14 this.Count = count;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
15 base.SetCompleted(synchronously, error);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
16 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
17 public int WaitForCompletion() {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
18 WaitHandle wh = null;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
19 lock (this) if (!IsCompleted) wh = AsyncWaitHandle;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
20 if (wh != null) wh.WaitOne();
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
21 ThrowError();
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
22 return Count;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
23 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
24 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
25
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
26 Stream baseStream;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
27 Byte[] prebuffer = null;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
28 int prebufferoffset = 0;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
29 int prebuffercount = 0;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
30 int defaultbuffersize;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
31
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
32 public Stream BaseStream { get { return baseStream; } }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
33
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
34 public PrebufferingStream(Stream stream) : this(stream, 1024) { }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
35 public PrebufferingStream(Stream stream, int bufferSize) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
36 if (stream == null) throw new ArgumentNullException("stream");
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
37 baseStream = stream;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
38 defaultbuffersize = bufferSize;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
39 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
40
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
41 public IAsyncResult BeginPrebuffering(AsyncCallback callback, Object state) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
42 return BeginPrebuffering(1, callback, state);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
43 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
44 public IAsyncResult BeginPrebuffering(int count, AsyncCallback callback, Object state) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
45 AsyncResult ar = new AsyncResult(callback, state);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
46 if (prebuffercount > count) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
47 ar.SetCompleted(true, count, null);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
48 } else {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
49 PrepareBuffer(count);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
50 int off = prebufferoffset + prebuffercount;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
51 baseStream.BeginRead(prebuffer, off, prebuffer.Length - off, asyncPrebufferReadCallback, ar);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
52 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
53 return ar;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
54 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
55 private void asyncPrebufferReadCallback(IAsyncResult ar) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
56 AsyncResult myar = (AsyncResult)ar.AsyncState;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
57 try {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
58 int len = baseStream.EndRead(ar);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
59 if (len <= 0) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
60 myar.SetCompleted(false, prebuffercount, null);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
61 } else {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
62 myar.Left -= len;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
63 prebuffercount += len;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
64 if (myar.Left > 0) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
65 int off = prebufferoffset + prebuffercount;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
66 baseStream.BeginRead(prebuffer, off, prebuffer.Length - off, asyncPrebufferReadCallback, myar);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
67 } else {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
68 myar.SetCompleted(false, prebuffercount, null);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
69 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
70 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
71 } catch (Exception ex) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
72 myar.SetCompleted(false, prebuffercount, ex);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
73 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
74 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
75 public int EndPrebuffering(IAsyncResult ar) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
76 AsyncResult myar = (AsyncResult)ar;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
77 return myar.WaitForCompletion();
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
78 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
79 public int Prebuffer() {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
80 return Prebuffer(1);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
81 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
82 public int Prebuffer(int count) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
83 count -= prebuffercount;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
84 if (count <= 0) return prebuffercount;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
85 PrepareBuffer(prebuffercount + count);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
86 while (count > 0) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
87 int off = prebufferoffset + prebuffercount;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
88 int len = baseStream.Read(prebuffer, off, prebuffer.Length - off);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
89 if (len <= 0) return prebuffercount;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
90 count -= len;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
91 prebuffercount += len;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
92 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
93 return prebuffercount;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
94 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
95 private void PrepareBuffer(int count) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
96 if (prebuffercount == 0) prebufferoffset = 0;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
97 if (prebuffer == null || (prebuffercount == 0 && prebuffer.Length > defaultbuffersize)) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
98 if (count < defaultbuffersize) count = defaultbuffersize;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
99 prebuffer = new Byte[count];
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
100 prebufferoffset = 0;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
101 } else if (prebufferoffset + count > prebuffer.Length) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
102 if (count > prebuffer.Length) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
103 Byte[] newbuffer = new Byte[prebuffercount + count];
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
104 Buffer.BlockCopy(prebuffer, prebufferoffset, newbuffer, 0, prebuffercount);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
105 prebuffer = newbuffer;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
106 } else {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
107 Buffer.BlockCopy(prebuffer, prebufferoffset, prebuffer, 0, prebuffercount);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
108 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
109 prebufferoffset = 0;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
110 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
111 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
112 public Byte Peek() {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
113 return Peek(0);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
114 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
115 public Byte Peek(int offset) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
116 if (Prebuffer(offset + 1) < offset + 1) throw new EndOfStreamException();
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
117 return prebuffer[prebufferoffset + offset];
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
118 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
119 public void Peek(Byte[] buffer, int offset, int count) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
120 Peek(buffer, offset, 0, count);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
121 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
122 public void Peek(Byte[] buffer, int bufferoffset, int peekoffset, int count) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
123 if (Prebuffer(peekoffset + count) < peekoffset + count) throw new EndOfStreamException();
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
124 Buffer.BlockCopy(prebuffer, prebufferoffset + peekoffset, buffer, bufferoffset, count);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
125 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
126 public int TryPeek() {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
127 return TryPeek(0);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
128 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
129 public int TryPeek(int offset) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
130 if (prebuffercount <= offset) return -1;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
131 return prebuffer[prebufferoffset + offset];
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
132 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
133 public int TryPeek(Byte[] buffer, int offset, int count) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
134 return TryPeek(buffer, offset, 0, count);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
135 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
136 public int TryPeek(Byte[] buffer, int bufferoffset, int peekoffset, int count) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
137 if (prebuffercount < peekoffset + count) count = prebuffercount - peekoffset;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
138 if (count < 0) count = 0;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
139 if (count > 0) Buffer.BlockCopy(prebuffer, prebufferoffset + peekoffset, buffer, bufferoffset, count);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
140 return count;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
141 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
142
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
143 public override int Read(byte[] buffer, int offset, int count) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
144 if (prebuffercount > 0 || count < 16) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
145 if (prebuffercount == 0) if (Prebuffer() < 1) return 0;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
146 if (count > prebuffercount) count = prebuffercount;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
147 Buffer.BlockCopy(prebuffer, prebufferoffset, buffer, offset, count);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
148 prebufferoffset += count;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
149 prebuffercount -= count;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
150 return count;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
151 } else {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
152 return baseStream.Read(buffer, offset, count);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
153 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
154 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
155
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
156 public override int ReadByte() {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
157 if (Prebuffer(1) < 1) return -1;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
158 int v = prebuffer[prebufferoffset];
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
159 prebufferoffset++;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
160 prebuffercount--;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
161 return v;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
162 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
163
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
164 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
165 if (prebuffercount > 0) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
166 if (count > prebuffercount) count = prebuffercount;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
167 Buffer.BlockCopy(prebuffer, prebufferoffset, buffer, offset, count);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
168 prebufferoffset += count;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
169 prebuffercount -= count;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
170 AsyncResult ar = new AsyncResult(callback, state);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
171 ar.SetCompleted(true, count, null);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
172 return ar;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
173 } else {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
174 return baseStream.BeginRead(buffer, offset, count, callback, state);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
175 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
176 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
177
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
178 public override int EndRead(IAsyncResult asyncResult) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
179 AsyncResult myar = asyncResult as AsyncResult;
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
180 if (myar != null) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
181 return myar.WaitForCompletion();
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
182 } else {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
183 return baseStream.EndRead(asyncResult);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
184 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
185 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
186
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
187 public override void Close() {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
188 base.Close();
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
189 baseStream.Close();
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
190 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
191
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
192 public override void Write(byte[] buffer, int offset, int count) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
193 baseStream.Write(buffer, offset, count);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
194 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
195
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
196 public override void WriteByte(byte value) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
197 baseStream.WriteByte(value);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
198 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
199
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
200 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
201 return baseStream.BeginWrite(buffer, offset, count, callback, state);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
202 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
203
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
204 public override void EndWrite(IAsyncResult asyncResult) {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
205 baseStream.EndWrite(asyncResult);
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
206 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
207
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
208 public override int ReadTimeout {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
209 get { return baseStream.ReadTimeout; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
210 set { baseStream.ReadTimeout = value; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
211 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
212
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
213 public override int WriteTimeout {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
214 get { return baseStream.WriteTimeout; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
215 set { baseStream.WriteTimeout = value; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
216 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
217
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
218 public override long Length { get { return prebuffercount + baseStream.Length; } }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
219 public override long Position {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
220 get { return baseStream.Position - prebuffercount; }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
221 set { throw new NotImplementedException(); }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
222 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
223
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
224 public override void SetLength(long value) { throw new NotImplementedException(); }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
225 public override long Seek(long offset, SeekOrigin origin) { throw new NotImplementedException(); }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
226
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
227 public override bool CanRead { get { return prebuffercount > 0 || baseStream.CanRead; } }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
228 public override bool CanSeek { get { return false; } }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
229 public override bool CanTimeout { get { return baseStream.CanTimeout; } }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
230 public override bool CanWrite { get { return baseStream.CanWrite; } }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
231
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
232 public int Buffered { get { return prebuffercount; } }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
233
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
234 public override void Flush() {
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
235 baseStream.Flush();
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
236 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
237 }
2933f7750542 Added read-buffering stream wrapper
Ivo Smits <Ivo@UCIS.nl>
parents:
diff changeset
238 }