Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ResourceWriter.cs
Go to the documentation of this file.
2using System.IO;
3using System.Text;
4
5namespace System.Resources;
6
8{
9 private sealed class PrecannedResource
10 {
11 internal readonly string TypeName;
12
13 internal readonly object Data;
14
15 internal PrecannedResource(string typeName, object data)
16 {
17 TypeName = typeName;
18 Data = data;
19 }
20 }
21
22 private sealed class StreamWrapper
23 {
24 internal readonly Stream Stream;
25
26 internal readonly bool CloseAfterWrite;
27
33 }
34
36
37 private Stream _output;
38
40
42
44
45 private string ResourceReaderTypeName => "System.Resources.ResourceReader, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
46
47 private string ResourceSetTypeName => "System.Resources.RuntimeResourceSet";
48
49 public void AddResource(string name, Stream? value)
50 {
51 if (name == null)
52 {
53 throw new ArgumentNullException("name");
54 }
55 if (_resourceList == null)
56 {
58 }
60 }
61
62 public void AddResourceData(string name, string typeName, byte[] serializedData)
63 {
64 if (name == null)
65 {
66 throw new ArgumentNullException("name");
67 }
68 if (typeName == null)
69 {
70 throw new ArgumentNullException("typeName");
71 }
72 if (serializedData == null)
73 {
74 throw new ArgumentNullException("serializedData");
75 }
76 AddResourceData(name, typeName, (object)serializedData);
77 }
78
80 {
81 byte[] buffer = dataContext as byte[];
82 writer.Write(buffer);
83 }
84
95
110
111 public void AddResource(string name, string? value)
112 {
113 if (name == null)
114 {
115 throw new ArgumentNullException("name");
116 }
117 if (_resourceList == null)
118 {
120 }
121 _caseInsensitiveDups.Add(name, null);
122 _resourceList.Add(name, value);
123 }
124
125 public void AddResource(string name, object? value)
126 {
127 if (name == null)
128 {
129 throw new ArgumentNullException("name");
130 }
131 if (_resourceList == null)
132 {
134 }
135 if (value != null && value is Stream)
136 {
138 return;
139 }
140 _caseInsensitiveDups.Add(name, null);
141 _resourceList.Add(name, value);
142 }
143
144 public void AddResource(string name, Stream? value, bool closeAfterWrite = false)
145 {
146 if (name == null)
147 {
148 throw new ArgumentNullException("name");
149 }
150 if (_resourceList == null)
151 {
153 }
155 }
156
157 private void AddResourceInternal(string name, Stream value, bool closeAfterWrite)
158 {
159 if (value == null)
160 {
161 _caseInsensitiveDups.Add(name, null);
162 _resourceList.Add(name, value);
163 return;
164 }
165 if (!value.CanSeek)
166 {
168 }
169 _caseInsensitiveDups.Add(name, null);
171 }
172
173 public void AddResource(string name, byte[]? value)
174 {
175 if (name == null)
176 {
177 throw new ArgumentNullException("name");
178 }
179 if (_resourceList == null)
180 {
182 }
183 _caseInsensitiveDups.Add(name, null);
184 _resourceList.Add(name, value);
185 }
186
187 private void AddResourceData(string name, string typeName, object data)
188 {
189 if (_resourceList == null)
190 {
192 }
193 _caseInsensitiveDups.Add(name, null);
194 if (_preserializedData == null)
195 {
197 }
198 _preserializedData.Add(name, new PrecannedResource(typeName, data));
199 }
200
201 public void Close()
202 {
203 Dispose(disposing: true);
204 }
205
206 private void Dispose(bool disposing)
207 {
208 if (disposing)
209 {
210 if (_resourceList != null)
211 {
212 Generate();
213 }
214 if (_output != null)
215 {
217 }
218 }
219 _output = null;
221 }
222
223 public void Dispose()
224 {
225 Dispose(disposing: true);
226 }
227
228 public void Generate()
229 {
230 if (_resourceList == null)
231 {
233 }
242 binaryWriter2.Flush();
243 binaryWriter.Write((int)memoryStream.Length);
244 memoryStream.Seek(0L, SeekOrigin.Begin);
245 memoryStream.CopyTo(binaryWriter.BaseStream, (int)memoryStream.Length);
246 binaryWriter.Write(2);
247 int num = _resourceList.Count;
248 if (_preserializedData != null)
249 {
251 }
252 binaryWriter.Write(num);
253 int[] array = new int[num];
254 int[] array2 = new int[num];
255 int num2 = 0;
258 Stream stream = new MemoryStream();
259 using (stream)
260 {
262 if (_preserializedData != null)
263 {
265 {
267 }
268 }
270 {
272 array2[num2++] = (int)binaryWriter3.Seek(0, SeekOrigin.Current);
273 binaryWriter3.Write(resource.Key);
274 binaryWriter3.Write((int)binaryWriter4.Seek(0, SeekOrigin.Current));
275 object value = resource.Value;
277 binaryWriter4.Write7BitEncodedInt((int)resourceTypeCode);
279 {
281 }
282 else
283 {
285 }
286 }
287 binaryWriter.Write(list.Count);
288 foreach (string item in list)
289 {
290 binaryWriter.Write(item);
291 }
293 binaryWriter.Flush();
294 int num3 = (int)binaryWriter.BaseStream.Position & 7;
295 if (num3 > 0)
296 {
297 for (int i = 0; i < 8 - num3; i++)
298 {
299 binaryWriter.Write("PAD"[i % 3]);
300 }
301 }
302 int[] array3 = array;
303 foreach (int value2 in array3)
304 {
305 binaryWriter.Write(value2);
306 }
307 int[] array4 = array2;
308 foreach (int value3 in array4)
309 {
310 binaryWriter.Write(value3);
311 }
312 binaryWriter.Flush();
313 binaryWriter3.Flush();
314 binaryWriter4.Flush();
315 int num4 = (int)(binaryWriter.Seek(0, SeekOrigin.Current) + memoryStream2.Length);
316 num4 += 4;
317 binaryWriter.Write(num4);
318 if (memoryStream2.Length > 0)
319 {
320 memoryStream2.Seek(0L, SeekOrigin.Begin);
321 memoryStream2.CopyTo(binaryWriter.BaseStream, (int)memoryStream2.Length);
322 }
323 binaryWriter3.Dispose();
324 stream.Position = 0L;
325 stream.CopyTo(binaryWriter.BaseStream);
326 binaryWriter4.Dispose();
327 }
328 binaryWriter.Flush();
329 _resourceList = null;
330 }
331
333 {
334 if (value == null)
335 {
336 return System.Resources.ResourceTypeCode.Null;
337 }
339 if (type == typeof(string))
340 {
341 return System.Resources.ResourceTypeCode.String;
342 }
343 if (type == typeof(int))
344 {
345 return System.Resources.ResourceTypeCode.Int32;
346 }
347 if (type == typeof(bool))
348 {
349 return System.Resources.ResourceTypeCode.Boolean;
350 }
351 if (type == typeof(char))
352 {
353 return System.Resources.ResourceTypeCode.Char;
354 }
355 if (type == typeof(byte))
356 {
357 return System.Resources.ResourceTypeCode.Byte;
358 }
359 if (type == typeof(sbyte))
360 {
361 return System.Resources.ResourceTypeCode.SByte;
362 }
363 if (type == typeof(short))
364 {
365 return System.Resources.ResourceTypeCode.Int16;
366 }
367 if (type == typeof(long))
368 {
369 return System.Resources.ResourceTypeCode.Int64;
370 }
371 if (type == typeof(ushort))
372 {
373 return System.Resources.ResourceTypeCode.UInt16;
374 }
375 if (type == typeof(uint))
376 {
377 return System.Resources.ResourceTypeCode.UInt32;
378 }
379 if (type == typeof(ulong))
380 {
381 return System.Resources.ResourceTypeCode.UInt64;
382 }
383 if (type == typeof(float))
384 {
385 return System.Resources.ResourceTypeCode.Single;
386 }
387 if (type == typeof(double))
388 {
389 return System.Resources.ResourceTypeCode.Double;
390 }
391 if (type == typeof(decimal))
392 {
393 return System.Resources.ResourceTypeCode.Decimal;
394 }
395 if (type == typeof(DateTime))
396 {
397 return System.Resources.ResourceTypeCode.DateTime;
398 }
399 if (type == typeof(TimeSpan))
400 {
401 return System.Resources.ResourceTypeCode.TimeSpan;
402 }
403 if (type == typeof(byte[]))
404 {
405 return System.Resources.ResourceTypeCode.ByteArray;
406 }
407 if (type == typeof(StreamWrapper))
408 {
409 return System.Resources.ResourceTypeCode.Stream;
410 }
412 {
413 string typeName = ((PrecannedResource)value).TypeName;
414 if (typeName.StartsWith("ResourceTypeCode.", StringComparison.Ordinal))
415 {
416 typeName = typeName.Substring(17);
417 return (System.Resources.ResourceTypeCode)Enum.Parse(typeof(System.Resources.ResourceTypeCode), typeName);
418 }
419 int num = types.IndexOf(typeName);
420 if (num == -1)
421 {
422 num = types.Count;
423 types.Add(typeName);
424 }
425 return (System.Resources.ResourceTypeCode)(num + 64);
426 }
428 }
429
430 private void WriteValue(System.Resources.ResourceTypeCode typeCode, object value, BinaryWriter writer)
431 {
432 switch (typeCode)
433 {
434 case System.Resources.ResourceTypeCode.String:
435 writer.Write((string)value);
436 break;
437 case System.Resources.ResourceTypeCode.Boolean:
438 writer.Write((bool)value);
439 break;
440 case System.Resources.ResourceTypeCode.Char:
441 writer.Write((ushort)(char)value);
442 break;
443 case System.Resources.ResourceTypeCode.Byte:
444 writer.Write((byte)value);
445 break;
446 case System.Resources.ResourceTypeCode.SByte:
447 writer.Write((sbyte)value);
448 break;
449 case System.Resources.ResourceTypeCode.Int16:
450 writer.Write((short)value);
451 break;
452 case System.Resources.ResourceTypeCode.UInt16:
453 writer.Write((ushort)value);
454 break;
455 case System.Resources.ResourceTypeCode.Int32:
456 writer.Write((int)value);
457 break;
458 case System.Resources.ResourceTypeCode.UInt32:
459 writer.Write((uint)value);
460 break;
461 case System.Resources.ResourceTypeCode.Int64:
462 writer.Write((long)value);
463 break;
464 case System.Resources.ResourceTypeCode.UInt64:
465 writer.Write((ulong)value);
466 break;
467 case System.Resources.ResourceTypeCode.Single:
468 writer.Write((float)value);
469 break;
470 case System.Resources.ResourceTypeCode.Double:
471 writer.Write((double)value);
472 break;
473 case System.Resources.ResourceTypeCode.Decimal:
474 writer.Write((decimal)value);
475 break;
476 case System.Resources.ResourceTypeCode.DateTime:
477 {
478 long value2 = ((DateTime)value).ToBinary();
479 writer.Write(value2);
480 break;
481 }
482 case System.Resources.ResourceTypeCode.TimeSpan:
483 writer.Write(((TimeSpan)value).Ticks);
484 break;
485 case System.Resources.ResourceTypeCode.ByteArray:
486 {
487 byte[] array3 = (byte[])value;
488 writer.Write(array3.Length);
489 writer.Write(array3, 0, array3.Length);
490 break;
491 }
492 case System.Resources.ResourceTypeCode.Stream:
493 {
495 if (streamWrapper.Stream.GetType() == typeof(MemoryStream))
496 {
498 if (memoryStream.Length > int.MaxValue)
499 {
501 }
502 byte[] array = memoryStream.ToArray();
503 writer.Write(array.Length);
504 writer.Write(array, 0, array.Length);
505 break;
506 }
507 Stream stream = streamWrapper.Stream;
508 if (stream.Length > int.MaxValue)
509 {
511 }
512 stream.Position = 0L;
513 writer.Write((int)stream.Length);
514 byte[] array2 = new byte[4096];
515 int num = 0;
516 while ((num = stream.Read(array2, 0, array2.Length)) != 0)
517 {
518 writer.Write(array2, 0, num);
519 }
520 if (streamWrapper.CloseAfterWrite)
521 {
522 stream.Close();
523 }
524 break;
525 }
526 default:
528 case System.Resources.ResourceTypeCode.Null:
529 break;
530 }
531 }
532}
static void Sort(Array array)
Definition Array.cs:2329
void CopyTo(KeyValuePair< TKey, TValue >[] array, int index)
void Add(TKey key, TValue value)
void ICollection< KeyValuePair< TKey, TValue > >. Add(KeyValuePair< TKey, TValue > keyValuePair)
static object Parse(Type enumType, string value)
Definition Enum.cs:368
void Dispose()
Definition Stream.cs:639
static readonly FastResourceComparer Default
static readonly int HeaderVersionNumber
PrecannedResource(string typeName, object data)
StreamWrapper(Stream s, bool closeAfterWrite)
void AddResourceData(string name, string typeName, byte[] serializedData)
void WriteValue(System.Resources.ResourceTypeCode typeCode, object value, BinaryWriter writer)
void AddResourceInternal(string name, Stream value, bool closeAfterWrite)
void AddResource(string name, Stream? value)
void AddResource(string name, string? value)
void AddResource(string name, Stream? value, bool closeAfterWrite=false)
void AddResourceData(string name, string typeName, object data)
SortedDictionary< string, object > _resourceList
Dictionary< string, object > _caseInsensitiveDups
void AddResource(string name, byte[]? value)
void WriteData(BinaryWriter writer, object dataContext)
Func< Type, string >? TypeNameConverter
System.Resources.ResourceTypeCode FindTypeCode(object value, List< string > types)
void AddResource(string name, object? value)
Dictionary< string, PrecannedResource > _preserializedData
static string NotSupported_BinarySerializedResources
Definition SR.cs:20
static string Argument_StreamNotWritable
Definition SR.cs:878
static string NotSupported_UnseekableStream
Definition SR.cs:26
static string InvalidOperation_ResourceWriterSaved
Definition SR.cs:14
static string ArgumentOutOfRange_StreamLength
Definition SR.cs:1110
Definition SR.cs:7
static StringComparer OrdinalIgnoreCase
static Encoding Unicode
Definition Encoding.cs:519
static Encoding UTF8
Definition Encoding.cs:526
static ? Type GetType(string typeName, bool throwOnError, bool ignoreCase)
Definition Type.cs:408