Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ExtensionDataReader.cs
Go to the documentation of this file.
3using System.Xml;
4
6
7internal sealed class ExtensionDataReader : XmlReader
8{
10 {
11 None,
12 Element,
14 Text,
15 Xml,
18 }
19
21
23
25
27
29
31
32 private int _depth;
33
34 private string _localName;
35
36 private string _ns;
37
38 private string _prefix;
39
40 private string _value;
41
42 private int _attributeCount;
43
44 private int _attributeIndex;
45
46 private static readonly object s_prefixLock;
47
48 private readonly XmlNodeReader _xmlNodeReader;
49
51
52 private static readonly Hashtable s_nsToPrefixTable;
53
54 private static readonly Hashtable s_prefixToNsTable;
55
56 [MemberNotNullWhen(true, "_xmlNodeReader")]
57 [MemberNotNullWhen(false, "_element")]
58 private bool IsXmlDataNode
59 {
60 [MemberNotNullWhen(true, "_xmlNodeReader")]
61 [MemberNotNullWhen(false, "_element")]
62 get
63 {
65 }
66 }
67
68 public override XmlNodeType NodeType
69 {
70 get
71 {
72 if (!IsXmlDataNode)
73 {
74 return _nodeType;
75 }
77 }
78 }
79
80 public override string LocalName
81 {
82 get
83 {
84 if (!IsXmlDataNode)
85 {
86 return _localName;
87 }
89 }
90 }
91
92 public override string NamespaceURI
93 {
94 get
95 {
96 if (!IsXmlDataNode)
97 {
98 return _ns;
99 }
101 }
102 }
103
104 public override string Prefix
105 {
106 get
107 {
108 if (!IsXmlDataNode)
109 {
110 return _prefix;
111 }
112 return _xmlNodeReader.Prefix;
113 }
114 }
115
116 public override string Value
117 {
118 get
119 {
120 if (!IsXmlDataNode)
121 {
122 return _value;
123 }
124 return _xmlNodeReader.Value;
125 }
126 }
127
128 public override int Depth
129 {
130 get
131 {
132 if (!IsXmlDataNode)
133 {
134 return _depth;
135 }
136 return _xmlNodeReader.Depth;
137 }
138 }
139
140 public override int AttributeCount
141 {
142 get
143 {
144 if (!IsXmlDataNode)
145 {
146 return _attributeCount;
147 }
149 }
150 }
151
152 public override bool EOF
153 {
154 get
155 {
156 if (!IsXmlDataNode)
157 {
158 return _readState == ReadState.EndOfFile;
159 }
160 return _xmlNodeReader.EOF;
161 }
162 }
163
164 public override ReadState ReadState
165 {
166 get
167 {
168 if (!IsXmlDataNode)
169 {
170 return _readState;
171 }
173 }
174 }
175
176 public override bool IsEmptyElement
177 {
178 get
179 {
180 if (!IsXmlDataNode)
181 {
182 return false;
183 }
185 }
186 }
187
188 public override bool IsDefault
189 {
190 get
191 {
192 if (!IsXmlDataNode)
193 {
194 return base.IsDefault;
195 }
197 }
198 }
199
200 public override XmlSpace XmlSpace
201 {
202 get
203 {
204 if (!IsXmlDataNode)
205 {
206 return base.XmlSpace;
207 }
209 }
210 }
211
212 public override string XmlLang
213 {
214 get
215 {
216 if (!IsXmlDataNode)
217 {
218 return base.XmlLang;
219 }
220 return _xmlNodeReader.XmlLang;
221 }
222 }
223
224 public override string this[int i]
225 {
226 get
227 {
228 if (!IsXmlDataNode)
229 {
230 return GetAttribute(i);
231 }
232 return _xmlNodeReader[i];
233 }
234 }
235
236 public override string this[string name]
237 {
238 get
239 {
240 if (!IsXmlDataNode)
241 {
242 return GetAttribute(name);
243 }
244 return _xmlNodeReader[name];
245 }
246 }
247
248 public override string this[string name, string namespaceURI]
249 {
250 get
251 {
252 if (!IsXmlDataNode)
253 {
254 return GetAttribute(name, namespaceURI);
255 }
256 return _xmlNodeReader[name, namespaceURI];
257 }
258 }
259
260 public override string Name
261 {
262 get
263 {
264 if (IsXmlDataNode)
265 {
266 return _xmlNodeReader.Name;
267 }
268 return string.Empty;
269 }
270 }
271
272 public override bool HasValue
273 {
274 get
275 {
276 if (IsXmlDataNode)
277 {
279 }
280 return false;
281 }
282 }
283
284 public override string BaseURI
285 {
286 get
287 {
288 if (IsXmlDataNode)
289 {
290 return _xmlNodeReader.BaseURI;
291 }
292 return string.Empty;
293 }
294 }
295
296 public override XmlNameTable NameTable
297 {
298 get
299 {
300 if (IsXmlDataNode)
301 {
303 }
304 return null;
305 }
306 }
307
309 {
310 s_prefixLock = new object();
313 AddPrefix("i", "http://www.w3.org/2001/XMLSchema-instance");
314 AddPrefix("z", "http://schemas.microsoft.com/2003/10/Serialization/");
315 AddPrefix(string.Empty, string.Empty);
316 }
317
319 {
320 _attributeIndex = -1;
321 _context = context;
322 }
323
325 {
326 IDataNode dataNode = _element.dataNode;
327 Skip();
328 return dataNode;
329 }
330
331 internal void Reset()
332 {
333 _localName = null;
334 _ns = null;
335 _prefix = null;
336 _value = null;
337 _attributeCount = 0;
338 _attributeIndex = -1;
339 _depth = 0;
340 _element = null;
341 _nextElement = null;
342 _elements = null;
343 }
344
345 public override bool MoveToFirstAttribute()
346 {
347 if (IsXmlDataNode)
348 {
350 }
351 if (_attributeCount == 0)
352 {
353 return false;
354 }
356 return true;
357 }
358
359 public override bool MoveToNextAttribute()
360 {
361 if (IsXmlDataNode)
362 {
364 }
366 {
367 return false;
368 }
370 return true;
371 }
372
373 public override void MoveToAttribute(int index)
374 {
375 if (IsXmlDataNode)
376 {
378 return;
379 }
381 {
383 }
384 _nodeType = XmlNodeType.Attribute;
386 _localName = attributeData.localName;
387 _ns = attributeData.ns;
388 _prefix = attributeData.prefix;
389 _value = attributeData.value;
391 }
392
393 public override string GetAttribute(string name, string namespaceURI)
394 {
395 if (IsXmlDataNode)
396 {
398 }
399 for (int i = 0; i < _element.attributeCount; i++)
400 {
402 if (attributeData.localName == name && attributeData.ns == namespaceURI)
403 {
404 return attributeData.value;
405 }
406 }
407 return null;
408 }
409
410 public override bool MoveToAttribute(string name, string namespaceURI)
411 {
412 if (IsXmlDataNode)
413 {
414 return _xmlNodeReader.MoveToAttribute(name, _ns);
415 }
416 for (int i = 0; i < _element.attributeCount; i++)
417 {
419 if (attributeData.localName == name && attributeData.ns == namespaceURI)
420 {
422 return true;
423 }
424 }
425 return false;
426 }
427
428 public override bool MoveToElement()
429 {
430 if (IsXmlDataNode)
431 {
433 }
434 if (_nodeType != XmlNodeType.Attribute)
435 {
436 return false;
437 }
438 SetElement();
439 return true;
440 }
441
442 private void SetElement()
443 {
444 _nodeType = XmlNodeType.Element;
446 _ns = _element.ns;
448 _value = string.Empty;
450 _attributeIndex = -1;
451 }
452
453 public override string LookupNamespace(string prefix)
454 {
455 if (IsXmlDataNode)
456 {
458 }
459 return (string)s_prefixToNsTable[prefix];
460 }
461
462 public override void Skip()
463 {
464 if (IsXmlDataNode)
465 {
467 }
468 else
469 {
470 if (ReadState != ReadState.Interactive)
471 {
472 return;
473 }
476 {
477 int num = 1;
478 while (num != 0)
479 {
480 if (!Read())
481 {
483 }
485 {
486 num++;
487 }
488 else if (_internalNodeType == ExtensionDataNodeType.EndElement)
489 {
491 num--;
492 }
493 }
494 }
495 else
496 {
497 Read();
498 }
499 }
500 }
501
503 {
504 if (nodeType != ExtensionDataNodeType.Element && nodeType != ExtensionDataNodeType.ReferencedElement)
505 {
506 return nodeType == ExtensionDataNodeType.NullElement;
507 }
508 return true;
509 }
510
511 protected override void Dispose(bool disposing)
512 {
513 if (IsXmlDataNode)
514 {
516 }
517 else
518 {
519 Reset();
520 _readState = ReadState.Closed;
521 }
522 base.Dispose(disposing);
523 }
524
525 public override bool Read()
526 {
527 if (_nodeType == XmlNodeType.Attribute && MoveToNextAttribute())
528 {
529 return true;
530 }
532 switch (_internalNodeType)
533 {
534 case ExtensionDataNodeType.Element:
535 case ExtensionDataNodeType.ReferencedElement:
536 case ExtensionDataNodeType.NullElement:
537 PushElement();
538 SetElement();
539 break;
540 case ExtensionDataNodeType.Text:
541 _nodeType = XmlNodeType.Text;
542 _prefix = string.Empty;
543 _ns = string.Empty;
544 _localName = string.Empty;
545 _attributeCount = 0;
546 _attributeIndex = -1;
547 break;
548 case ExtensionDataNodeType.EndElement:
549 _nodeType = XmlNodeType.EndElement;
550 _prefix = string.Empty;
551 _ns = string.Empty;
552 _localName = string.Empty;
553 _value = string.Empty;
554 _attributeCount = 0;
555 _attributeIndex = -1;
556 PopElement();
557 break;
558 case ExtensionDataNodeType.None:
559 if (_depth != 0)
560 {
562 }
563 _nodeType = XmlNodeType.None;
564 _prefix = string.Empty;
565 _ns = string.Empty;
566 _localName = string.Empty;
567 _value = string.Empty;
568 _attributeCount = 0;
569 _readState = ReadState.EndOfFile;
570 return false;
571 default:
573 case ExtensionDataNodeType.Xml:
574 break;
575 }
576 _readState = ReadState.Interactive;
577 return true;
578 }
579
580 public override string GetAttribute(string name)
581 {
582 if (IsXmlDataNode)
583 {
584 return _xmlNodeReader.GetAttribute(name);
585 }
586 return null;
587 }
588
589 public override string GetAttribute(int i)
590 {
591 if (IsXmlDataNode)
592 {
594 }
595 return null;
596 }
597
598 public override bool MoveToAttribute(string name)
599 {
600 if (IsXmlDataNode)
601 {
602 return _xmlNodeReader.MoveToAttribute(name);
603 }
604 return false;
605 }
606
607 public override void ResolveEntity()
608 {
609 if (IsXmlDataNode)
610 {
612 }
613 }
614
615 public override bool ReadAttributeValue()
616 {
617 if (IsXmlDataNode)
618 {
620 }
621 return false;
622 }
623
624 private void MoveNext(IDataNode dataNode)
625 {
627 }
628
629 private void PushElement()
630 {
633 if (_nextElement == null)
634 {
636 return;
637 }
639 _nextElement = null;
640 }
641
642 private void PopElement()
643 {
646 _ns = _element.ns;
647 if (_depth != 0)
648 {
649 _depth--;
650 if (_elements != null)
651 {
653 }
654 }
655 }
656
657 [MemberNotNull("_elements")]
658 private void GrowElementsIfNeeded()
659 {
660 if (_elements == null)
661 {
662 _elements = new ElementData[8];
663 }
664 else if (_elements.Length == _depth)
665 {
669 }
670 }
671
673 {
674 int num = _depth + 1;
675 if (_elements != null && _elements.Length > num && _elements[num] != null)
676 {
677 return _elements[num];
678 }
679 return new ElementData();
680 }
681
682 internal static string GetPrefix(string ns)
683 {
684 ns = ns ?? string.Empty;
685 string text = (string)s_nsToPrefixTable[ns];
686 if (text == null)
687 {
689 {
691 if (text == null)
692 {
693 text = ((ns.Length == 0) ? string.Empty : ("p" + s_nsToPrefixTable.Count));
694 AddPrefix(text, ns);
695 }
696 }
697 }
698 return text;
699 }
700
701 private static void AddPrefix(string prefix, string ns)
702 {
703 s_nsToPrefixTable.Add(ns, prefix);
704 s_prefixToNsTable.Add(prefix, ns);
705 }
706}
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
Definition Array.cs:624
static Exception ByDesign
readonly XmlObjectSerializerReadContext _context
ExtensionDataReader(XmlObjectSerializerReadContext context)
override string GetAttribute(string name, string namespaceURI)
bool IsElementNode(ExtensionDataNodeType nodeType)
static void AddPrefix(string prefix, string ns)
override bool MoveToAttribute(string name, string namespaceURI)
static string InvalidXmlDeserializingExtensionData
Definition SR.cs:526
static string InvalidStateInExtensionDataReader
Definition SR.cs:528
Definition SR.cs:7
override bool MoveToElement()
override bool ReadAttributeValue()
override XmlNameTable NameTable
override void ResolveEntity()
override? string GetAttribute(string name)
override ReadState ReadState
override bool MoveToNextAttribute()
override? string LookupNamespace(string prefix)
override XmlNodeType NodeType
override string LocalName
override string NamespaceURI
override XmlSpace XmlSpace
override bool MoveToAttribute(string name)
override bool MoveToFirstAttribute()
virtual void ReadEndElement()
Definition XmlReader.cs:751