Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
MimePart.cs
Go to the documentation of this file.
1using System.IO;
4
5namespace System.Net.Mime;
6
7internal sealed class MimePart : MimeBasePart, IDisposable
8{
9 internal sealed class MimePartContext
10 {
12
14
15 internal int _bytesLeft;
16
18
19 internal byte[] _buffer;
20
21 internal bool _completed;
22
23 internal bool _completedSynchronously = true;
24
26 {
28 _result = result;
29 _buffer = new byte[17408];
30 }
31 }
32
33 private Stream _stream;
34
35 private bool _streamSet;
36
37 private bool _streamUsedOnce;
38
39 private AsyncCallback _readCallback;
40
41 private AsyncCallback _writeCallback;
42
43 internal Stream Stream => _stream;
44
46 {
47 get
48 {
50 }
51 set
52 {
54 if (value == null)
55 {
56 ((HeaderCollection)base.Headers).InternalRemove(MailHeaderInfo.GetString(MailHeaderID.ContentDisposition));
57 }
58 else
59 {
60 _contentDisposition.PersistIfNeeded((HeaderCollection)base.Headers, forcePersist: true);
61 }
62 }
63 }
64
66 {
67 get
68 {
69 string text = base.Headers[MailHeaderInfo.GetString(MailHeaderID.ContentTransferEncoding)];
70 if (text.Equals("base64", StringComparison.OrdinalIgnoreCase))
71 {
72 return TransferEncoding.Base64;
73 }
74 if (text.Equals("quoted-printable", StringComparison.OrdinalIgnoreCase))
75 {
76 return TransferEncoding.QuotedPrintable;
77 }
78 if (text.Equals("7bit", StringComparison.OrdinalIgnoreCase))
79 {
80 return TransferEncoding.SevenBit;
81 }
82 if (text.Equals("8bit", StringComparison.OrdinalIgnoreCase))
83 {
84 return TransferEncoding.EightBit;
85 }
86 return TransferEncoding.Unknown;
87 }
88 set
89 {
90 switch (value)
91 {
92 case TransferEncoding.Base64:
93 base.Headers[MailHeaderInfo.GetString(MailHeaderID.ContentTransferEncoding)] = "base64";
94 break;
95 case TransferEncoding.QuotedPrintable:
96 base.Headers[MailHeaderInfo.GetString(MailHeaderID.ContentTransferEncoding)] = "quoted-printable";
97 break;
98 case TransferEncoding.SevenBit:
99 base.Headers[MailHeaderInfo.GetString(MailHeaderID.ContentTransferEncoding)] = "7bit";
100 break;
101 case TransferEncoding.EightBit:
102 base.Headers[MailHeaderInfo.GetString(MailHeaderID.ContentTransferEncoding)] = "8bit";
103 break;
104 default:
106 }
107 }
108 }
109
110 internal MimePart()
111 {
112 }
113
114 public void Dispose()
115 {
116 _stream?.Close();
117 }
118
119 internal void SetContent(Stream stream)
120 {
121 if (stream == null)
122 {
123 throw new ArgumentNullException("stream");
124 }
125 if (_streamSet)
126 {
127 _stream.Close();
128 _stream = null;
129 _streamSet = false;
130 }
131 _stream = stream;
132 _streamSet = true;
133 _streamUsedOnce = false;
135 }
136
137 internal void SetContent(Stream stream, string name, string mimeType)
138 {
139 if (stream == null)
140 {
141 throw new ArgumentNullException("stream");
142 }
143 if (mimeType != null && mimeType != string.Empty)
144 {
145 _contentType = new ContentType(mimeType);
146 }
147 if (name != null && name != string.Empty)
148 {
149 base.ContentType.Name = name;
150 }
152 }
153
154 internal void SetContent(Stream stream, ContentType contentType)
155 {
156 if (stream == null)
157 {
158 throw new ArgumentNullException("stream");
159 }
160 _contentType = contentType;
162 }
163
164 internal void Complete(IAsyncResult result, Exception e)
165 {
166 MimePartContext mimePartContext = (MimePartContext)result.AsyncState;
167 if (mimePartContext._completed)
168 {
170 }
171 try
172 {
173 if (mimePartContext._outputStream != null)
174 {
175 mimePartContext._outputStream.Close();
176 }
177 }
178 catch (Exception ex)
179 {
180 if (e == null)
181 {
182 e = ex;
183 }
184 }
185 mimePartContext._completed = true;
186 mimePartContext._result.InvokeCallback(e);
187 }
188
189 internal void ReadCallback(IAsyncResult result)
190 {
191 if (result.CompletedSynchronously)
192 {
193 return;
194 }
195 ((MimePartContext)result.AsyncState)._completedSynchronously = false;
196 try
197 {
198 ReadCallbackHandler(result);
199 }
200 catch (Exception e)
201 {
202 Complete(result, e);
203 }
204 }
205
206 internal void ReadCallbackHandler(IAsyncResult result)
207 {
208 MimePartContext mimePartContext = (MimePartContext)result.AsyncState;
209 mimePartContext._bytesLeft = Stream.EndRead(result);
210 if (mimePartContext._bytesLeft > 0)
211 {
212 IAsyncResult asyncResult = mimePartContext._outputStream.BeginWrite(mimePartContext._buffer, 0, mimePartContext._bytesLeft, _writeCallback, mimePartContext);
213 if (asyncResult.CompletedSynchronously)
214 {
216 }
217 }
218 else
219 {
220 Complete(result, null);
221 }
222 }
223
224 internal void WriteCallback(IAsyncResult result)
225 {
226 if (result.CompletedSynchronously)
227 {
228 return;
229 }
230 ((MimePartContext)result.AsyncState)._completedSynchronously = false;
231 try
232 {
233 WriteCallbackHandler(result);
234 }
235 catch (Exception e)
236 {
237 Complete(result, e);
238 }
239 }
240
241 internal void WriteCallbackHandler(IAsyncResult result)
242 {
243 MimePartContext mimePartContext = (MimePartContext)result.AsyncState;
244 mimePartContext._outputStream.EndWrite(result);
245 IAsyncResult asyncResult = Stream.BeginRead(mimePartContext._buffer, 0, mimePartContext._buffer.Length, _readCallback, mimePartContext);
246 if (asyncResult.CompletedSynchronously)
247 {
249 }
250 }
251
253 {
254 Stream stream2 = stream;
256 {
257 stream2 = new Base64Stream(stream2, new Base64WriteStateInfo());
258 }
259 else if (TransferEncoding == TransferEncoding.QuotedPrintable)
260 {
261 stream2 = new QuotedPrintableStream(stream2, encodeCRLF: true);
262 }
263 else if (TransferEncoding == TransferEncoding.SevenBit || TransferEncoding == TransferEncoding.EightBit)
264 {
265 stream2 = new EightBitStream(stream2);
266 }
267 return stream2;
268 }
269
271 {
272 MimePartContext mimePartContext = (MimePartContext)result.AsyncState;
273 Stream stream = mimePartContext._writer.EndGetContentStream(result);
274 mimePartContext._outputStream = GetEncodedStream(stream);
277 IAsyncResult asyncResult = Stream.BeginRead(mimePartContext._buffer, 0, mimePartContext._buffer.Length, _readCallback, mimePartContext);
278 if (asyncResult.CompletedSynchronously)
279 {
281 }
282 }
283
285 {
286 if (result.CompletedSynchronously)
287 {
288 return;
289 }
290 ((MimePartContext)result.AsyncState)._completedSynchronously = false;
291 try
292 {
294 }
295 catch (Exception e)
296 {
297 Complete(result, e);
298 }
299 }
300
301 internal override IAsyncResult BeginSend(BaseWriter writer, AsyncCallback callback, bool allowUnicode, object state)
302 {
303 PrepareHeaders(allowUnicode);
304 writer.WriteHeaders(base.Headers, allowUnicode);
305 MimePartAsyncResult result = new MimePartAsyncResult(this, state, callback);
306 MimePartContext state2 = new MimePartContext(writer, result);
307 ResetStream();
308 _streamUsedOnce = true;
309 IAsyncResult asyncResult = writer.BeginGetContentStream(ContentStreamCallback, state2);
310 if (asyncResult.CompletedSynchronously)
311 {
313 }
314 return result;
315 }
316
317 internal override void Send(BaseWriter writer, bool allowUnicode)
318 {
319 if (Stream != null)
320 {
321 byte[] buffer = new byte[17408];
322 PrepareHeaders(allowUnicode);
323 writer.WriteHeaders(base.Headers, allowUnicode);
324 Stream contentStream = writer.GetContentStream();
325 contentStream = GetEncodedStream(contentStream);
326 ResetStream();
327 _streamUsedOnce = true;
328 int count;
329 while ((count = Stream.Read(buffer, 0, 17408)) > 0)
330 {
331 contentStream.Write(buffer, 0, count);
332 }
333 contentStream.Close();
334 }
335 }
336
337 internal void ResetStream()
338 {
339 if (_streamUsedOnce)
340 {
341 if (!Stream.CanSeek)
342 {
344 }
345 Stream.Seek(0L, SeekOrigin.Begin);
346 _streamUsedOnce = false;
347 }
348 }
349}
long Seek(long offset, SeekOrigin origin)
virtual void Close()
Definition Stream.cs:644
virtual void EndWrite(IAsyncResult asyncResult)
Definition Stream.cs:889
int Read(byte[] buffer, int offset, int count)
void Write(byte[] buffer, int offset, int count)
virtual IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback? callback, object? state)
Definition Stream.cs:688
virtual IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback? callback, object? state)
Definition Stream.cs:813
virtual int EndRead(IAsyncResult asyncResult)
Definition Stream.cs:737
static string GetString(MailHeaderID id)
Stream EndGetContentStream(IAsyncResult result)
void PersistIfNeeded(HeaderCollection headers, bool forcePersist)
ContentDisposition _contentDisposition
void PrepareHeaders(bool allowUnicode)
System.Net.LazyAsyncResult _result
Definition MimePart.cs:13
MimePartContext(BaseWriter writer, System.Net.LazyAsyncResult result)
Definition MimePart.cs:25
void SetContent(Stream stream, ContentType contentType)
Definition MimePart.cs:154
AsyncCallback _readCallback
Definition MimePart.cs:39
void SetContent(Stream stream, string name, string mimeType)
Definition MimePart.cs:137
void Complete(IAsyncResult result, Exception e)
Definition MimePart.cs:164
void ReadCallbackHandler(IAsyncResult result)
Definition MimePart.cs:206
AsyncCallback _writeCallback
Definition MimePart.cs:41
void ContentStreamCallbackHandler(IAsyncResult result)
Definition MimePart.cs:270
override IAsyncResult BeginSend(BaseWriter writer, AsyncCallback callback, bool allowUnicode, object state)
Definition MimePart.cs:301
override void Send(BaseWriter writer, bool allowUnicode)
Definition MimePart.cs:317
void WriteCallback(IAsyncResult result)
Definition MimePart.cs:224
void ContentStreamCallback(IAsyncResult result)
Definition MimePart.cs:284
void SetContent(Stream stream)
Definition MimePart.cs:119
Stream GetEncodedStream(Stream stream)
Definition MimePart.cs:252
void WriteCallbackHandler(IAsyncResult result)
Definition MimePart.cs:241
void ReadCallback(IAsyncResult result)
Definition MimePart.cs:189
static string MimePartCantResetStream
Definition SR.cs:54
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string MimeTransferEncodingNotSupported
Definition SR.cs:44
Definition SR.cs:7