Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
BufferedReadStream.cs
Go to the documentation of this file.
1using System.IO;
4
5namespace System.Net;
6
7internal sealed class BufferedReadStream : DelegatedStream
8{
9 private sealed class ReadAsyncResult : System.Net.LazyAsyncResult
10 {
11 private readonly BufferedReadStream _parent;
12
13 private int _read;
14
15 private static readonly AsyncCallback s_onRead = OnRead;
16
17 internal ReadAsyncResult(BufferedReadStream parent, AsyncCallback callback, object state)
18 : base(null, state, callback)
19 {
20 _parent = parent;
21 }
22
23 internal void Read(byte[] buffer, int offset, int count)
24 {
26 {
29 _parent._storedOffset += _read;
30 if (_read == count || !_parent._readMore)
31 {
33 return;
34 }
35 count -= _read;
36 offset += _read;
37 }
39 if (asyncResult.CompletedSynchronously)
40 {
43 }
44 }
45
46 internal static int End(IAsyncResult result)
47 {
48 ReadAsyncResult readAsyncResult = (ReadAsyncResult)result;
49 readAsyncResult.InternalWaitForCompletion();
50 return readAsyncResult._read;
51 }
52
53 private static void OnRead(IAsyncResult result)
54 {
55 if (result.CompletedSynchronously)
56 {
57 return;
58 }
59 ReadAsyncResult readAsyncResult = (ReadAsyncResult)result.AsyncState;
60 try
61 {
62 readAsyncResult._read += readAsyncResult._parent.BaseStream.EndRead(result);
63 readAsyncResult.InvokeCallback();
64 }
65 catch (Exception result2)
66 {
67 if (readAsyncResult.IsCompleted)
68 {
69 throw;
70 }
71 readAsyncResult.InvokeCallback(result2);
72 }
73 }
74 }
75
76 private byte[] _storedBuffer;
77
78 private int _storedLength;
79
80 private int _storedOffset;
81
82 private readonly bool _readMore;
83
84 public override bool CanWrite => false;
85
86 public override bool CanSeek => false;
87
89 : this(stream, readMore: false)
90 {
91 }
92
93 internal BufferedReadStream(Stream stream, bool readMore)
94 : base(stream)
95 {
96 _readMore = readMore;
97 }
98
99 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
100 {
101 ReadAsyncResult readAsyncResult = new ReadAsyncResult(this, callback, state);
102 readAsyncResult.Read(buffer, offset, count);
103 return readAsyncResult;
104 }
105
106 public override int EndRead(IAsyncResult asyncResult)
107 {
109 }
110
111 public override int Read(byte[] buffer, int offset, int count)
112 {
113 int num = 0;
115 {
118 _storedOffset += num;
119 if (num == count || !_readMore)
120 {
121 return num;
122 }
123 offset += num;
124 count -= num;
125 }
126 return num + base.Read(buffer, offset, count);
127 }
128
130 {
131 int num = 0;
133 {
134 return base.ReadAsync(buffer, offset, count, cancellationToken);
135 }
138 _storedOffset += num;
139 if (num == count || !_readMore)
140 {
141 return Task.FromResult(num);
142 }
143 offset += num;
144 count -= num;
146 }
147
148 private async Task<int> ReadMoreAsync(int bytesAlreadyRead, byte[] buffer, int offset, int count, CancellationToken cancellationToken)
149 {
150 return bytesAlreadyRead + await ReadAsync(buffer.AsMemory(offset, count), cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
151 }
152
153 public override int ReadByte()
154 {
156 {
158 }
159 return base.ReadByte();
160 }
161
162 internal void Push(byte[] buffer, int offset, int count)
163 {
164 if (count == 0)
165 {
166 return;
167 }
169 {
170 if (_storedBuffer == null || _storedBuffer.Length < count)
171 {
172 _storedBuffer = new byte[count];
173 }
174 _storedOffset = 0;
176 }
177 else if (count <= _storedOffset)
178 {
180 }
181 else if (count <= _storedBuffer.Length - _storedLength + _storedOffset)
182 {
185 _storedOffset = 0;
186 }
187 else
188 {
189 byte[] array = new byte[count + _storedLength - _storedOffset];
192 _storedOffset = 0;
194 }
196 }
197}
static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count)
Definition Buffer.cs:102
virtual IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback? callback, object? state)
Definition Stream.cs:688
virtual int EndRead(IAsyncResult asyncResult)
Definition Stream.cs:737
static byte Min(byte val1, byte val2)
Definition Math.cs:912
void Read(byte[] buffer, int offset, int count)
ReadAsyncResult(BufferedReadStream parent, AsyncCallback callback, object state)
override int Read(byte[] buffer, int offset, int count)
override Task< int > ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
void Push(byte[] buffer, int offset, int count)
override int EndRead(IAsyncResult asyncResult)
BufferedReadStream(Stream stream, bool readMore)
override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
async Task< int > ReadMoreAsync(int bytesAlreadyRead, byte[] buffer, int offset, int count, CancellationToken cancellationToken)
void InvokeCallback(object result)
new ConfiguredTaskAwaitable< TResult > ConfigureAwait(bool continueOnCapturedContext)
Definition Task.cs:226