Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
FtpDataStream.cs
Go to the documentation of this file.
1using System.IO;
4
5namespace System.Net;
6
7internal sealed class FtpDataStream : Stream, ICloseEx
8{
9 private readonly FtpWebRequest _request;
10
11 private readonly NetworkStream _networkStream;
12
13 private bool _writeable;
14
15 private bool _readable;
16
17 private bool _isFullyRead;
18
19 private bool _closing;
20
21 public override bool CanRead => _readable;
22
23 public override bool CanSeek => _networkStream.CanSeek;
24
25 public override bool CanWrite => _writeable;
26
27 public override long Length => _networkStream.Length;
28
29 public override long Position
30 {
31 get
32 {
34 }
35 set
36 {
37 _networkStream.Position = value;
38 }
39 }
40
41 public override bool CanTimeout => _networkStream.CanTimeout;
42
43 public override int ReadTimeout
44 {
45 get
46 {
48 }
49 set
50 {
51 _networkStream.ReadTimeout = value;
52 }
53 }
54
55 public override int WriteTimeout
56 {
57 get
58 {
60 }
61 set
62 {
63 _networkStream.WriteTimeout = value;
64 }
65 }
66
67 internal FtpDataStream(NetworkStream networkStream, FtpWebRequest request, TriState writeOnly)
68 {
69 if (System.Net.NetEventSource.Log.IsEnabled())
70 {
71 System.Net.NetEventSource.Info(this, null, ".ctor");
72 }
73 _readable = true;
74 _writeable = true;
75 switch (writeOnly)
76 {
77 case TriState.True:
78 _readable = false;
79 break;
80 case TriState.False:
81 _writeable = false;
82 break;
83 }
84 _networkStream = networkStream;
85 _request = request;
86 }
87
88 protected override void Dispose(bool disposing)
89 {
90 try
91 {
92 if (disposing)
93 {
94 ((ICloseEx)this).CloseEx(CloseExState.Normal);
95 }
96 else
97 {
98 ((ICloseEx)this).CloseEx(CloseExState.Abort | CloseExState.Silent);
99 }
100 }
101 finally
102 {
103 base.Dispose(disposing);
104 }
105 }
106
108 {
109 if (System.Net.NetEventSource.Log.IsEnabled())
110 {
111 System.Net.NetEventSource.Info(this, $"state = {closeState}", "CloseEx");
112 }
113 lock (this)
114 {
115 if (_closing)
116 {
117 return;
118 }
119 _closing = true;
120 _writeable = false;
121 _readable = false;
122 }
123 try
124 {
125 try
126 {
127 if ((closeState & CloseExState.Abort) == 0)
128 {
130 }
131 else
132 {
134 }
135 }
136 finally
137 {
138 _request.DataStreamClosed(closeState);
139 }
140 }
141 catch (Exception ex)
142 {
143 bool flag = true;
144 if (ex is WebException { Response: FtpWebResponse response } && !_isFullyRead && response.StatusCode == FtpStatusCode.ConnectionClosed)
145 {
146 flag = false;
147 }
148 if (flag && (closeState & CloseExState.Silent) == 0)
149 {
150 throw;
151 }
152 }
153 }
154
155 private void CheckError()
156 {
157 if (_request.Aborted)
158 {
160 }
161 }
162
163 public override long Seek(long offset, SeekOrigin origin)
164 {
165 CheckError();
166 try
167 {
168 return _networkStream.Seek(offset, origin);
169 }
170 catch
171 {
172 CheckError();
173 throw;
174 }
175 }
176
177 public override int Read(byte[] buffer, int offset, int size)
178 {
179 CheckError();
180 int num;
181 try
182 {
183 num = _networkStream.Read(buffer, offset, size);
184 }
185 catch
186 {
187 CheckError();
188 throw;
189 }
190 if (num == 0)
191 {
192 _isFullyRead = true;
193 Close();
194 }
195 return num;
196 }
197
198 public override void Write(byte[] buffer, int offset, int size)
199 {
200 CheckError();
201 try
202 {
204 }
205 catch
206 {
207 CheckError();
208 throw;
209 }
210 }
211
213 {
214 LazyAsyncResult lazyAsyncResult = (LazyAsyncResult)ar.AsyncState;
215 try
216 {
217 try
218 {
219 int num = _networkStream.EndRead(ar);
220 if (num == 0)
221 {
222 _isFullyRead = true;
223 Close();
224 }
225 lazyAsyncResult.InvokeCallback(num);
226 }
227 catch (Exception result)
228 {
229 if (!lazyAsyncResult.IsCompleted)
230 {
231 lazyAsyncResult.InvokeCallback(result);
232 }
233 }
234 }
235 catch
236 {
237 }
238 }
239
240 public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state)
241 {
242 CheckError();
243 LazyAsyncResult lazyAsyncResult = new LazyAsyncResult(this, state, callback);
244 try
245 {
246 _networkStream.BeginRead(buffer, offset, size, AsyncReadCallback, lazyAsyncResult);
247 return lazyAsyncResult;
248 }
249 catch
250 {
251 CheckError();
252 throw;
253 }
254 }
255
256 public override int EndRead(IAsyncResult ar)
257 {
258 try
259 {
260 object obj = ((LazyAsyncResult)ar).InternalWaitForCompletion();
261 if (obj is Exception source)
262 {
264 }
265 return (int)obj;
266 }
267 finally
268 {
269 CheckError();
270 }
271 }
272
273 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state)
274 {
275 CheckError();
276 try
277 {
278 return _networkStream.BeginWrite(buffer, offset, size, callback, state);
279 }
280 catch
281 {
282 CheckError();
283 throw;
284 }
285 }
286
287 public override void EndWrite(IAsyncResult asyncResult)
288 {
289 try
290 {
292 }
293 finally
294 {
295 CheckError();
296 }
297 }
298
299 public override void Flush()
300 {
302 }
303
304 public override void SetLength(long value)
305 {
307 }
308
310 {
311 _networkStream.ReadTimeout = timeout;
312 _networkStream.WriteTimeout = timeout;
313 }
314}
virtual void Close()
Definition Stream.cs:644
static WebException RequestAbortedException
FtpDataStream(NetworkStream networkStream, FtpWebRequest request, TriState writeOnly)
override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state)
override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state)
override long Seek(long offset, SeekOrigin origin)
override void SetLength(long value)
readonly FtpWebRequest _request
override void EndWrite(IAsyncResult asyncResult)
void AsyncReadCallback(IAsyncResult ar)
override void Dispose(bool disposing)
override int Read(byte[] buffer, int offset, int size)
void SetSocketTimeoutOption(int timeout)
readonly NetworkStream _networkStream
override int EndRead(IAsyncResult ar)
override void Write(byte[] buffer, int offset, int size)
void DataStreamClosed(CloseExState closeState)
void InvokeCallback(object result)
static readonly System.Net.NetEventSource Log
static void Info(object thisOrContextObject, FormattableString formattableString=null, [CallerMemberName] string memberName=null)
override void Write(byte[] buffer, int offset, int count)
override int EndRead(IAsyncResult asyncResult)
override void SetLength(long value)
override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback? callback, object? state)
override long Seek(long offset, SeekOrigin origin)
override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback? callback, object? state)
override void EndWrite(IAsyncResult asyncResult)
override int Read(byte[] buffer, int offset, int count)
void CloseEx(CloseExState closeState)