Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ReaderOutput.cs
Go to the documentation of this file.
4using System.IO;
5using System.Text;
6
8
9internal sealed class ReaderOutput : XmlReader, IRecordOutput
10{
11 private sealed class XmlEncoder
12 {
14
16
17 public char QuoteChar => '"';
18
19 [MemberNotNull("_buffer")]
20 [MemberNotNull("_encoder")]
21 private void Init()
22 {
23 _buffer = new StringBuilder();
25 }
26
27 public string AttributeInnerXml(string value)
28 {
29 if (_encoder == null)
30 {
31 Init();
32 }
37 return _buffer.ToString();
38 }
39
40 public string AttributeOuterXml(string name, string value)
41 {
42 if (_encoder == null)
43 {
44 Init();
45 }
47 _buffer.Append(name);
48 _buffer.Append('=');
54 return _buffer.ToString();
55 }
56 }
57
59
60 private readonly XmlNameTable _nameTable;
61
63
65
67
68 private int _attributeCount;
69
71
73
74 private int _currentIndex;
75
77
79
80 private bool _haveRecord;
81
82 private static readonly BuilderInfo s_DefaultInfo = new BuilderInfo();
83
84 private readonly XmlEncoder _encoder = new XmlEncoder();
85
87
88 public override string Name
89 {
90 get
91 {
92 string prefix = Prefix;
93 string localName = LocalName;
94 if (prefix != null && prefix.Length > 0)
95 {
96 if (localName.Length > 0)
97 {
98 return _nameTable.Add(prefix + ":" + localName);
99 }
100 return prefix;
101 }
102 return localName;
103 }
104 }
105
106 public override string LocalName => _currentInfo.LocalName;
107
108 public override string NamespaceURI => _currentInfo.NamespaceURI;
109
110 public override string Prefix => _currentInfo.Prefix;
111
112 public override bool HasValue => XmlReader.HasValueInternal(NodeType);
113
114 public override string Value => _currentInfo.Value;
115
116 public override int Depth => _currentInfo.Depth;
117
118 public override string BaseURI => string.Empty;
119
120 public override bool IsEmptyElement => _currentInfo.IsEmptyTag;
121
122 public override char QuoteChar => _encoder.QuoteChar;
123
124 public override bool IsDefault => false;
125
126 public override XmlSpace XmlSpace
127 {
128 get
129 {
130 if (_manager == null)
131 {
132 return XmlSpace.None;
133 }
134 return _manager.XmlSpace;
135 }
136 }
137
138 public override string XmlLang
139 {
140 get
141 {
142 if (_manager == null)
143 {
144 return string.Empty;
145 }
146 return _manager.XmlLang;
147 }
148 }
149
150 public override int AttributeCount => _attributeCount;
151
152 public override string this[int i] => GetAttribute(i);
153
154 public override string this[string name, string namespaceURI] => GetAttribute(name, namespaceURI);
155
156 public override bool EOF => _state == ReadState.EndOfFile;
157
158 public override ReadState ReadState => _state;
159
161
163 {
165 _nameTable = processor.NameTable;
166 Reset();
167 }
168
169 public override string GetAttribute(string name)
170 {
171 if (FindAttribute(name, out var attrIndex))
172 {
173 return ((BuilderInfo)_attributeList[attrIndex]).Value;
174 }
175 return null;
176 }
177
178 public override string GetAttribute(string localName, string namespaceURI)
179 {
180 if (FindAttribute(localName, namespaceURI, out var attrIndex))
181 {
182 return ((BuilderInfo)_attributeList[attrIndex]).Value;
183 }
184 return null;
185 }
186
187 public override string GetAttribute(int i)
188 {
190 return builderInfo.Value;
191 }
192
193 public override bool MoveToAttribute(string name)
194 {
195 if (FindAttribute(name, out var attrIndex))
196 {
198 return true;
199 }
200 return false;
201 }
202
203 public override bool MoveToAttribute(string localName, string namespaceURI)
204 {
205 if (FindAttribute(localName, namespaceURI, out var attrIndex))
206 {
208 return true;
209 }
210 return false;
211 }
212
213 public override void MoveToAttribute(int i)
214 {
215 if (i < 0 || _attributeCount <= i)
216 {
217 throw new ArgumentOutOfRangeException("i");
218 }
219 SetAttribute(i);
220 }
221
222 public override bool MoveToFirstAttribute()
223 {
224 if (_attributeCount <= 0)
225 {
226 return false;
227 }
228 SetAttribute(0);
229 return true;
230 }
231
232 public override bool MoveToNextAttribute()
233 {
235 {
237 return true;
238 }
239 return false;
240 }
241
242 public override bool MoveToElement()
243 {
244 if (NodeType == XmlNodeType.Attribute || _currentInfo == _attributeValue)
245 {
246 SetMainNode();
247 return true;
248 }
249 return false;
250 }
251
252 public override bool Read()
253 {
254 if (_state != ReadState.Interactive)
255 {
256 if (_state != 0)
257 {
258 return false;
259 }
260 _state = ReadState.Interactive;
261 }
262 while (true)
263 {
264 if (_haveRecord)
265 {
267 _haveRecord = false;
268 }
270 if (_haveRecord)
271 {
272 switch (NodeType)
273 {
274 case XmlNodeType.Text:
276 {
277 break;
278 }
280 goto IL_0075;
281 case XmlNodeType.Whitespace:
282 goto IL_0075;
283 }
284 }
285 else
286 {
287 _state = ReadState.EndOfFile;
288 Reset();
289 }
290 break;
291 IL_0075:
292 if (Value.Length != 0)
293 {
294 if (XmlSpace == XmlSpace.Preserve)
295 {
296 _currentInfo.NodeType = XmlNodeType.SignificantWhitespace;
297 }
298 break;
299 }
300 }
301 return _haveRecord;
302 }
303
304 public override void Close()
305 {
306 _processor = null;
307 _state = ReadState.Closed;
308 Reset();
309 }
310
311 public override string ReadString()
312 {
313 string text = string.Empty;
314 if (NodeType == XmlNodeType.Element || NodeType == XmlNodeType.Attribute || _currentInfo == _attributeValue)
315 {
317 {
318 return text;
319 }
320 if (!Read())
321 {
323 }
324 }
326 bool flag = true;
327 while (true)
328 {
329 XmlNodeType nodeType = NodeType;
330 if (nodeType != XmlNodeType.Text && (uint)(nodeType - 13) > 1u)
331 {
332 break;
333 }
334 if (flag)
335 {
336 text = Value;
337 flag = false;
338 }
339 else
340 {
341 if (stringBuilder == null)
342 {
344 }
345 stringBuilder.Append(Value);
346 }
347 if (!Read())
348 {
350 }
351 }
352 if (stringBuilder != null)
353 {
354 return stringBuilder.ToString();
355 }
356 return text;
357 }
358
359 public override string ReadInnerXml()
360 {
361 if (ReadState == ReadState.Interactive)
362 {
363 if (NodeType == XmlNodeType.Element && !IsEmptyElement)
364 {
366 stringOutput.OmitXmlDecl();
367 int depth = Depth;
368 Read();
369 while (depth < Depth)
370 {
371 stringOutput.RecordDone(_builder);
372 Read();
373 }
374 Read();
375 stringOutput.TheEnd();
376 return stringOutput.Result;
377 }
378 if (NodeType == XmlNodeType.Attribute)
379 {
381 }
382 Read();
383 }
384 return string.Empty;
385 }
386
387 public override string ReadOuterXml()
388 {
389 if (ReadState == ReadState.Interactive)
390 {
391 if (NodeType == XmlNodeType.Element)
392 {
394 stringOutput.OmitXmlDecl();
396 int depth = Depth;
397 stringOutput.RecordDone(_builder);
398 Read();
399 while (depth < Depth)
400 {
401 stringOutput.RecordDone(_builder);
402 Read();
403 }
404 if (!isEmptyElement)
405 {
406 stringOutput.RecordDone(_builder);
407 Read();
408 }
409 stringOutput.TheEnd();
410 return stringOutput.Result;
411 }
412 if (NodeType == XmlNodeType.Attribute)
413 {
415 }
416 Read();
417 }
418 return string.Empty;
419 }
420
421 public override string LookupNamespace(string prefix)
422 {
423 string text = _nameTable.Get(prefix);
424 if (_manager != null && text != null)
425 {
427 }
428 return null;
429 }
430
431 public override void ResolveEntity()
432 {
433 if (NodeType != XmlNodeType.EntityReference)
434 {
436 }
437 }
438
439 public override bool ReadAttributeValue()
440 {
441 if (ReadState != ReadState.Interactive || NodeType != XmlNodeType.Attribute)
442 {
443 return false;
444 }
445 if (_attributeValue == null)
446 {
449 }
451 {
452 return false;
453 }
457 return true;
458 }
459
460 [MemberNotNull("_builder")]
461 [MemberNotNull("_attributeList")]
463 {
465 _mainNode = record.MainNode;
466 _attributeList = record.AttributeList;
467 _attributeCount = record.AttributeCount;
468 _manager = record.Manager;
469 _haveRecord = true;
470 SetMainNode();
471 return Processor.OutputResult.Interrupt;
472 }
473
474 public void TheEnd()
475 {
476 }
477
478 private void SetMainNode()
479 {
480 _currentIndex = -1;
482 }
483
489
491 {
492 if (attrib < 0 || _attributeCount <= attrib)
493 {
494 throw new ArgumentOutOfRangeException("attrib");
495 }
497 }
498
499 private bool FindAttribute(string localName, string namespaceURI, out int attrIndex)
500 {
501 if (namespaceURI == null)
502 {
503 namespaceURI = string.Empty;
504 }
505 if (localName == null)
506 {
507 localName = string.Empty;
508 }
509 for (int i = 0; i < _attributeCount; i++)
510 {
512 if (builderInfo.NamespaceURI == namespaceURI && builderInfo.LocalName == localName)
513 {
514 attrIndex = i;
515 return true;
516 }
517 }
518 attrIndex = -1;
519 return false;
520 }
521
522 private bool FindAttribute(string name, out int attrIndex)
523 {
524 if (name == null)
525 {
526 name = string.Empty;
527 }
528 for (int i = 0; i < _attributeCount; i++)
529 {
531 if (builderInfo.Name == name)
532 {
533 attrIndex = i;
534 return true;
535 }
536 }
537 attrIndex = -1;
538 return false;
539 }
540
541 [MemberNotNull("_currentInfo")]
542 [MemberNotNull("_mainNode")]
543 private void Reset()
544 {
545 _currentIndex = -1;
548 _manager = null;
549 }
550}
static CultureInfo InvariantCulture
static string Xml_InvalidOperation
Definition SR.cs:18
Definition SR.cs:7
override string ToString()
StringBuilder Append(char value, int repeatCount)
static bool IsOnlyWhitespace(string str)
string Add(char[] array, int offset, int length)
string? Get(char[] array, int offset, int length)
static bool HasValueInternal(XmlNodeType nodeType)
void StartAttribute(bool cacheAttrValue)
void Write(char[] array, int offset, int count)
void Execute(Stream stream)
Definition Processor.cs:266
string AttributeOuterXml(string name, string value)
static readonly BuilderInfo s_DefaultInfo
override string GetAttribute(int i)
override string GetAttribute(string localName, string namespaceURI)
override void MoveToAttribute(int i)
override string GetAttribute(string name)
override bool MoveToAttribute(string name)
Processor.OutputResult RecordDone(RecordBuilder record)
override bool MoveToAttribute(string localName, string namespaceURI)
BuilderInfo GetBuilderInfo(int attrib)
bool FindAttribute(string localName, string namespaceURI, out int attrIndex)
override string LookupNamespace(string prefix)
readonly XmlNameTable _nameTable
bool FindAttribute(string name, out int attrIndex)