Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
XPathNodePointer.cs
Go to the documentation of this file.
1using System.Data;
4
5namespace System.Xml;
6
7internal sealed class XPathNodePointer : IXmlDataVirtualNode
8{
9 private readonly WeakReference _owner;
10
11 private readonly XmlDataDocument _doc;
12
13 private XmlNode _node;
14
16
17 private bool _fOnValue;
18
20
22
23 private bool _bNeedFoliate;
24
25 internal bool IsEmptyElement
26 {
27 get
28 {
29 if (_node != null && _column == null && _node.NodeType == XmlNodeType.Element)
30 {
31 return ((XmlElement)_node).IsEmpty;
32 }
33 return false;
34 }
35 }
36
38 {
39 get
40 {
42 if (_node == null)
43 {
44 return XPathNodeType.All;
45 }
46 if (_column == null)
47 {
48 return ConvertNodeType(_node);
49 }
50 if (_fOnValue)
51 {
52 return XPathNodeType.Text;
53 }
54 if (_column.ColumnMapping == MappingType.Attribute)
55 {
56 if (_column.Namespace == "http://www.w3.org/2000/xmlns/")
57 {
58 return XPathNodeType.Namespace;
59 }
60 return XPathNodeType.Attribute;
61 }
62 return XPathNodeType.Element;
63 }
64 }
65
66 internal string LocalName
67 {
68 get
69 {
71 if (_node == null)
72 {
73 return string.Empty;
74 }
75 if (_column == null)
76 {
77 XmlNodeType nodeType = _node.NodeType;
78 if (IsNamespaceNode(nodeType, _node.NamespaceURI) && _node.LocalName == "xmlns")
79 {
80 return string.Empty;
81 }
82 if (nodeType == XmlNodeType.Element || nodeType == XmlNodeType.Attribute || nodeType == XmlNodeType.ProcessingInstruction)
83 {
84 return _node.LocalName;
85 }
86 return string.Empty;
87 }
88 if (_fOnValue)
89 {
90 return string.Empty;
91 }
93 }
94 }
95
96 internal string Name
97 {
98 get
99 {
100 RealFoliate();
101 if (_node == null)
102 {
103 return string.Empty;
104 }
105 if (_column == null)
106 {
107 XmlNodeType nodeType = _node.NodeType;
108 if (IsNamespaceNode(nodeType, _node.NamespaceURI))
109 {
110 if (_node.LocalName == "xmlns")
111 {
112 return string.Empty;
113 }
114 return _node.LocalName;
115 }
116 if (nodeType == XmlNodeType.Element || nodeType == XmlNodeType.Attribute || nodeType == XmlNodeType.ProcessingInstruction)
117 {
118 return _node.Name;
119 }
120 return string.Empty;
121 }
122 if (_fOnValue)
123 {
124 return string.Empty;
125 }
127 }
128 }
129
130 internal string NamespaceURI
131 {
132 get
133 {
134 RealFoliate();
135 if (_node == null)
136 {
137 return string.Empty;
138 }
139 if (_column == null)
140 {
142 if (xPathNodeType == XPathNodeType.Element || xPathNodeType == XPathNodeType.Root || xPathNodeType == XPathNodeType.Attribute)
143 {
144 return _node.NamespaceURI;
145 }
146 return string.Empty;
147 }
148 if (_fOnValue)
149 {
150 return string.Empty;
151 }
152 if (_column.Namespace == "http://www.w3.org/2000/xmlns/")
153 {
154 return string.Empty;
155 }
157 }
158 }
159
160 internal string Prefix
161 {
162 get
163 {
164 RealFoliate();
165 if (_node == null)
166 {
167 return string.Empty;
168 }
169 if (_column == null)
170 {
172 {
173 return string.Empty;
174 }
175 return _node.Prefix;
176 }
177 return string.Empty;
178 }
179 }
180
181 internal string Value
182 {
183 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
184 get
185 {
186 RealFoliate();
187 if (_node == null)
188 {
189 return null;
190 }
191 if (_column == null)
192 {
193 string text = _node.Value;
195 {
196 XmlNode parentNode = _node.ParentNode;
197 if (parentNode == null)
198 {
199 return text;
200 }
202 while (xmlNode != null && XmlDataDocument.IsTextNode(xmlNode.NodeType))
203 {
204 text += xmlNode.Value;
206 }
207 }
208 return text;
209 }
210 if (_column.ColumnMapping == MappingType.Attribute || _fOnValue)
211 {
212 DataRow row = Row;
213 DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current);
214 object value = row[_column, version];
215 if (!Convert.IsDBNull(value))
216 {
218 }
219 return null;
220 }
221 return null;
222 }
223 }
224
225 internal string InnerText
226 {
227 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
228 get
229 {
230 RealFoliate();
231 if (_node == null)
232 {
233 return string.Empty;
234 }
235 if (_column == null)
236 {
237 if (_node.NodeType == XmlNodeType.Document)
238 {
239 XmlElement documentElement = ((XmlDocument)_node).DocumentElement;
240 if (documentElement != null)
241 {
243 }
244 return string.Empty;
245 }
246 return _node.InnerText;
247 }
248 DataRow row = Row;
249 DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current);
250 object value = row[_column, version];
251 if (!Convert.IsDBNull(value))
252 {
254 }
255 return string.Empty;
256 }
257 }
258
259 internal string BaseURI
260 {
261 get
262 {
263 RealFoliate();
264 if (_node != null)
265 {
266 return _node.BaseURI;
267 }
268 return string.Empty;
269 }
270 }
271
272 internal string XmlLang
273 {
274 get
275 {
276 RealFoliate();
279 object obj = null;
280 while (xmlNode != null)
281 {
283 {
284 if (xmlBoundElement2.ElementState == ElementState.Defoliated)
285 {
287 foreach (DataColumn column in row.Table.Columns)
288 {
289 if (column.Prefix == "xml" && column.EncodedColumnName == "lang")
290 {
291 obj = row[column];
292 if (obj == DBNull.Value)
293 {
294 break;
295 }
296 return (string)obj;
297 }
298 }
299 }
300 else if (xmlBoundElement2.HasAttribute("xml:lang"))
301 {
302 return xmlBoundElement2.GetAttribute("xml:lang");
303 }
304 }
305 xmlNode = ((xmlNode.NodeType != XmlNodeType.Attribute) ? xmlNode.ParentNode : ((XmlAttribute)xmlNode).OwnerElement);
306 }
307 return string.Empty;
308 }
309 }
310
312
313 internal int AttributeCount
314 {
315 get
316 {
317 RealFoliate();
318 if (_node != null && _column == null && _node.NodeType == XmlNodeType.Element)
319 {
320 if (!IsFoliated(_node))
321 {
322 return ColumnCount(Row, fAttribute: true);
323 }
324 int num = 0;
325 {
327 {
328 if (attribute.NamespaceURI != "http://www.w3.org/2000/xmlns/")
329 {
330 num++;
331 }
332 }
333 return num;
334 }
335 }
336 return 0;
337 }
338 }
339
340 internal bool HasChildren
341 {
342 get
343 {
344 RealFoliate();
345 if (_node == null)
346 {
347 return false;
348 }
349 if (_column != null)
350 {
352 {
353 return false;
354 }
355 return !_fOnValue;
356 }
357 if (!IsFoliated(_node))
358 {
359 DataRow row = Row;
361 {
363 {
364 return true;
365 }
366 }
367 }
369 {
371 {
372 return true;
373 }
374 }
375 return false;
376 }
377 }
378
379 internal XmlNode Node
380 {
381 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
382 get
383 {
384 RealFoliate();
385 if (_node == null)
386 {
387 return null;
388 }
390 if (rowElement != null)
391 {
394 _doc.Foliate(rowElement, ElementState.StrongFoliation);
396 }
397 RealFoliate();
398 return _node;
399 }
400 }
401
403
405 {
406 return new int[20]
407 {
408 -1, 1, 2, 4, 4, -1, -1, 7, 8, 0,
409 -1, 0, -1, 6, 5, -1, -1, -1, 0, 0
410 };
411 }
412
414 {
415 XPathNodeType result = XPathNodeType.Whitespace;
417 {
418 switch (xmlNode.NodeType)
419 {
420 case XmlNodeType.SignificantWhitespace:
421 result = XPathNodeType.SignificantWhitespace;
422 break;
423 case XmlNodeType.Text:
424 case XmlNodeType.CDATA:
425 return XPathNodeType.Text;
426 default:
427 return result;
428 case XmlNodeType.Whitespace:
429 break;
430 }
431 }
432 return result;
433 }
434
436 {
437 int num = -1;
438 if (XmlDataDocument.IsTextNode(node.NodeType))
439 {
441 }
442 num = s_xmlNodeType_To_XpathNodeType_Map[(int)node.NodeType];
443 if (num == 2)
444 {
445 if (node.NamespaceURI == "http://www.w3.org/2000/xmlns/")
446 {
447 return XPathNodeType.Namespace;
448 }
449 return XPathNodeType.Attribute;
450 }
451 return (XPathNodeType)num;
452 }
453
454 private bool IsNamespaceNode(XmlNodeType nt, string ns)
455 {
456 if (nt == XmlNodeType.Attribute)
457 {
458 return ns == "http://www.w3.org/2000/xmlns/";
459 }
460 return false;
461 }
462
467
472
484
486 {
487 RealFoliate();
488 return new XPathNodePointer(owner, this);
489 }
490
492 {
493 if (_column != null)
494 {
495 return (XmlBoundElement)_node;
496 }
498 return rowElem;
499 }
500
502 {
503 if (_doc != pointer._doc)
504 {
505 return false;
506 }
507 _node = pointer._node;
508 _column = pointer._column;
509 _fOnValue = pointer._fOnValue;
510 _bNeedFoliate = pointer._bNeedFoliate;
511 return true;
512 }
513
514 private void MoveTo(XmlNode node)
515 {
516 _node = node;
517 _column = null;
518 _fOnValue = false;
519 }
520
522 {
523 _node = node;
524 _column = column;
526 }
527
528 private bool IsFoliated(XmlNode node)
529 {
530 if (node != null && node is XmlBoundElement)
531 {
532 return ((XmlBoundElement)node).IsFoliated;
533 }
534 return true;
535 }
536
538 {
539 DataColumn dataColumn = null;
540 int num = 0;
541 while ((dataColumn = NextColumn(row, dataColumn, fAttribute)) != null)
542 {
543 if (dataColumn.Namespace != "http://www.w3.org/2000/xmlns/")
544 {
545 num++;
546 }
547 }
548 return num;
549 }
550
552 {
553 if (row.RowState == DataRowState.Deleted)
554 {
555 return null;
556 }
557 DataTable table = row.Table;
559 int i = ((col != null) ? (col.Ordinal + 1) : 0);
560 int count = columns.Count;
561 DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current);
562 for (; i < count; i++)
563 {
566 {
567 return dataColumn;
568 }
569 }
570 return null;
571 }
572
574 {
575 if (row.RowState == DataRowState.Deleted)
576 {
577 return null;
578 }
579 DataTable table = row.Table;
581 int num = ((col != null) ? (col.Ordinal - 1) : (columns.Count - 1));
582 DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current);
583 while (num >= 0)
584 {
587 {
588 return dataColumn;
589 }
590 num--;
591 }
592 return null;
593 }
594
595 internal bool MoveToAttribute(string localName, string namespaceURI)
596 {
597 RealFoliate();
598 if (namespaceURI == "http://www.w3.org/2000/xmlns/")
599 {
600 return false;
601 }
602 if (_node != null && (_column == null || _column.ColumnMapping == MappingType.Attribute) && _node.NodeType == XmlNodeType.Element)
603 {
604 if (!IsFoliated(_node))
605 {
606 DataColumn dataColumn = null;
607 while ((dataColumn = NextColumn(Row, dataColumn, fAttribute: true)) != null)
608 {
609 if (dataColumn.EncodedColumnName == localName && dataColumn.Namespace == namespaceURI)
610 {
612 return true;
613 }
614 }
615 }
616 else
617 {
619 if (namedItem != null)
620 {
621 MoveTo(namedItem, null, fOnValue: false);
622 return true;
623 }
624 }
625 }
626 return false;
627 }
628
629 internal bool MoveToNextAttribute(bool bFirst)
630 {
631 RealFoliate();
632 if (_node != null)
633 {
634 if (bFirst && (_column != null || _node.NodeType != XmlNodeType.Element))
635 {
636 return false;
637 }
638 if (!bFirst)
639 {
640 if (_column != null && _column.ColumnMapping != MappingType.Attribute)
641 {
642 return false;
643 }
644 if (_column == null && _node.NodeType != XmlNodeType.Attribute)
645 {
646 return false;
647 }
648 }
649 if (!IsFoliated(_node))
650 {
652 while ((dataColumn = NextColumn(Row, dataColumn, fAttribute: true)) != null)
653 {
654 if (dataColumn.Namespace != "http://www.w3.org/2000/xmlns/")
655 {
657 return true;
658 }
659 }
660 return false;
661 }
662 if (bFirst)
663 {
665 foreach (XmlAttribute item in attributes)
666 {
667 if (item.NamespaceURI != "http://www.w3.org/2000/xmlns/")
668 {
669 MoveTo(item, null, fOnValue: false);
670 return true;
671 }
672 }
673 }
674 else
675 {
676 XmlAttributeCollection attributes2 = ((XmlAttribute)_node).OwnerElement.Attributes;
677 bool flag = false;
678 foreach (XmlAttribute item2 in attributes2)
679 {
680 if (flag && item2.NamespaceURI != "http://www.w3.org/2000/xmlns/")
681 {
682 MoveTo(item2, null, fOnValue: false);
683 return true;
684 }
685 if (item2 == _node)
686 {
687 flag = true;
688 }
689 }
690 }
691 }
692 return false;
693 }
694
695 private bool IsValidChild(XmlNode parent, XmlNode child)
696 {
697 int num = s_xmlNodeType_To_XpathNodeType_Map[(int)child.NodeType];
698 if (num == -1)
699 {
700 return false;
701 }
702 return s_xmlNodeType_To_XpathNodeType_Map[(int)parent.NodeType] switch
703 {
704 0 => num == 1 || num == 8 || num == 7,
705 1 => num == 1 || num == 4 || num == 8 || num == 6 || num == 5 || num == 7,
706 _ => false,
707 };
708 }
709
710 private bool IsValidChild(XmlNode parent, DataColumn c)
711 {
712 return s_xmlNodeType_To_XpathNodeType_Map[(int)parent.NodeType] switch
713 {
714 0 => c.ColumnMapping == MappingType.Element,
715 1 => c.ColumnMapping == MappingType.Element || c.ColumnMapping == MappingType.SimpleContent,
716 _ => false,
717 };
718 }
719
720 internal bool MoveToNextSibling()
721 {
722 RealFoliate();
723 if (_node != null)
724 {
725 if (_column != null)
726 {
727 if (_fOnValue)
728 {
729 return false;
730 }
731 DataRow row = Row;
732 for (DataColumn dataColumn = NextColumn(row, _column, fAttribute: false); dataColumn != null; dataColumn = NextColumn(row, dataColumn, fAttribute: false))
733 {
734 if (IsValidChild(_node, dataColumn))
735 {
736 MoveTo(_node, dataColumn, _doc.IsTextOnly(dataColumn));
737 return true;
738 }
739 }
740 XmlNode xmlNode = _doc.SafeFirstChild(_node);
741 if (xmlNode != null)
742 {
743 MoveTo(xmlNode);
744 return true;
745 }
746 }
747 else
748 {
749 XmlNode xmlNode2 = _node;
750 XmlNode parentNode = _node.ParentNode;
751 if (parentNode == null)
752 {
753 return false;
754 }
755 bool flag = XmlDataDocument.IsTextNode(_node.NodeType);
756 do
757 {
758 xmlNode2 = _doc.SafeNextSibling(xmlNode2);
759 }
760 while ((xmlNode2 != null && flag && XmlDataDocument.IsTextNode(xmlNode2.NodeType)) || (xmlNode2 != null && !IsValidChild(parentNode, xmlNode2)));
761 if (xmlNode2 != null)
762 {
763 MoveTo(xmlNode2);
764 return true;
765 }
766 }
767 }
768 return false;
769 }
770
771 internal bool MoveToPreviousSibling()
772 {
773 RealFoliate();
774 if (_node != null)
775 {
776 if (_column != null)
777 {
778 if (_fOnValue)
779 {
780 return false;
781 }
782 DataRow row = Row;
783 for (DataColumn dataColumn = PreviousColumn(row, _column, fAttribute: false); dataColumn != null; dataColumn = PreviousColumn(row, dataColumn, fAttribute: false))
784 {
785 if (IsValidChild(_node, dataColumn))
786 {
787 MoveTo(_node, dataColumn, _doc.IsTextOnly(dataColumn));
788 return true;
789 }
790 }
791 }
792 else
793 {
794 XmlNode xmlNode = _node;
795 XmlNode parentNode = _node.ParentNode;
796 if (parentNode == null)
797 {
798 return false;
799 }
800 bool flag = XmlDataDocument.IsTextNode(_node.NodeType);
801 do
802 {
803 xmlNode = _doc.SafePreviousSibling(xmlNode);
804 }
805 while ((xmlNode != null && flag && XmlDataDocument.IsTextNode(xmlNode.NodeType)) || (xmlNode != null && !IsValidChild(parentNode, xmlNode)));
806 if (xmlNode != null)
807 {
808 MoveTo(xmlNode);
809 return true;
810 }
811 if (!IsFoliated(parentNode) && parentNode is XmlBoundElement)
812 {
813 DataRow row2 = ((XmlBoundElement)parentNode).Row;
814 if (row2 != null)
815 {
816 DataColumn dataColumn2 = PreviousColumn(row2, null, fAttribute: false);
817 if (dataColumn2 != null)
818 {
819 MoveTo(parentNode, dataColumn2, _doc.IsTextOnly(dataColumn2));
820 return true;
821 }
822 }
823 }
824 }
825 }
826 return false;
827 }
828
829 internal bool MoveToFirst()
830 {
831 RealFoliate();
832 if (_node != null)
833 {
834 DataRow dataRow = null;
835 XmlNode xmlNode = null;
836 if (_column != null)
837 {
838 dataRow = Row;
839 xmlNode = _node;
840 }
841 else
842 {
843 xmlNode = _node.ParentNode;
844 if (xmlNode == null)
845 {
846 return false;
847 }
848 if (!IsFoliated(xmlNode) && xmlNode is XmlBoundElement)
849 {
850 dataRow = ((XmlBoundElement)xmlNode).Row;
851 }
852 }
853 if (dataRow != null)
854 {
855 for (DataColumn dataColumn = NextColumn(dataRow, null, fAttribute: false); dataColumn != null; dataColumn = NextColumn(dataRow, dataColumn, fAttribute: false))
856 {
857 if (IsValidChild(_node, dataColumn))
858 {
859 MoveTo(_node, dataColumn, _doc.IsTextOnly(dataColumn));
860 return true;
861 }
862 }
863 }
864 for (XmlNode xmlNode2 = _doc.SafeFirstChild(xmlNode); xmlNode2 != null; xmlNode2 = _doc.SafeNextSibling(xmlNode2))
865 {
866 if (IsValidChild(xmlNode, xmlNode2))
867 {
868 MoveTo(xmlNode2);
869 return true;
870 }
871 }
872 }
873 return false;
874 }
875
876 internal bool MoveToFirstChild()
877 {
878 RealFoliate();
879 if (_node == null)
880 {
881 return false;
882 }
883 if (_column != null)
884 {
885 if (_column.ColumnMapping == MappingType.Attribute || _column.ColumnMapping == MappingType.Hidden)
886 {
887 return false;
888 }
889 if (_fOnValue)
890 {
891 return false;
892 }
893 _fOnValue = true;
894 return true;
895 }
896 if (!IsFoliated(_node))
897 {
898 DataRow row = Row;
899 for (DataColumn dataColumn = NextColumn(row, null, fAttribute: false); dataColumn != null; dataColumn = NextColumn(row, dataColumn, fAttribute: false))
900 {
901 if (IsValidChild(_node, dataColumn))
902 {
903 MoveTo(_node, dataColumn, _doc.IsTextOnly(dataColumn));
904 return true;
905 }
906 }
907 }
908 for (XmlNode xmlNode = _doc.SafeFirstChild(_node); xmlNode != null; xmlNode = _doc.SafeNextSibling(xmlNode))
909 {
910 if (IsValidChild(_node, xmlNode))
911 {
912 MoveTo(xmlNode);
913 return true;
914 }
915 }
916 return false;
917 }
918
919 internal bool MoveToParent()
920 {
921 RealFoliate();
922 if (NodeType == XPathNodeType.Namespace)
923 {
924 MoveTo(_parentOfNS);
925 return true;
926 }
927 if (_node != null)
928 {
929 if (_column != null)
930 {
931 if (_fOnValue && !_doc.IsTextOnly(_column))
932 {
933 MoveTo(_node, _column, fOnValue: false);
934 return true;
935 }
936 MoveTo(_node, null, fOnValue: false);
937 return true;
938 }
939 XmlNode xmlNode = null;
940 xmlNode = ((_node.NodeType != XmlNodeType.Attribute) ? _node.ParentNode : ((XmlAttribute)_node).OwnerElement);
941 if (xmlNode != null)
942 {
943 MoveTo(xmlNode);
944 return true;
945 }
946 }
947 return false;
948 }
949
951 {
952 return ConvertNodeType(node) switch
953 {
954 XPathNodeType.Namespace => _parentOfNS,
955 XPathNodeType.Attribute => ((XmlAttribute)node).OwnerElement,
956 _ => node.ParentNode,
957 };
958 }
959
960 internal void MoveToRoot()
961 {
962 XmlNode node = _node;
963 for (XmlNode xmlNode = _node; xmlNode != null; xmlNode = GetParent(xmlNode))
964 {
965 node = xmlNode;
966 }
967 _node = node;
968 _column = null;
969 _fOnValue = false;
970 }
971
972 internal bool IsSamePosition(XPathNodePointer pointer)
973 {
974 RealFoliate();
975 pointer.RealFoliate();
976 if (_column == null && pointer._column == null)
977 {
978 if (pointer._node == _node)
979 {
980 return pointer._parentOfNS == _parentOfNS;
981 }
982 return false;
983 }
984 if (pointer._doc == _doc && pointer._node == _node && pointer._column == _column && pointer._fOnValue == _fOnValue)
985 {
986 return pointer._parentOfNS == _parentOfNS;
987 }
988 return false;
989 }
990
991 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
993 {
994 XPathNodePointer xPathNodePointer = Clone((DataDocumentXPathNavigator)_owner.Target);
996 while (xPathNodePointer.MoveToNextNamespace(XPathNamespaceScope.All))
997 {
998 if (xPathNodePointer.IsSamePosition(pointer))
999 {
1000 return XmlNodeOrder.Before;
1001 }
1002 }
1003 return XmlNodeOrder.After;
1004 }
1005
1006 private static XmlNode GetRoot(XmlNode node, ref int depth)
1007 {
1008 depth = 0;
1009 XmlNode xmlNode = node;
1010 XmlNode xmlNode2 = ((xmlNode.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute)xmlNode).OwnerElement : xmlNode.ParentNode);
1011 while (xmlNode2 != null)
1012 {
1013 xmlNode = xmlNode2;
1014 xmlNode2 = xmlNode.ParentNode;
1015 depth++;
1016 }
1017 return xmlNode;
1018 }
1019
1020 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
1022 {
1023 RealFoliate();
1024 other.RealFoliate();
1025 if (IsSamePosition(other))
1026 {
1027 return XmlNodeOrder.Same;
1028 }
1029 XmlNode xmlNode = null;
1030 XmlNode xmlNode2 = null;
1031 if (NodeType == XPathNodeType.Namespace && other.NodeType == XPathNodeType.Namespace)
1032 {
1033 if (_parentOfNS == other._parentOfNS)
1034 {
1035 return CompareNamespacePosition(other);
1036 }
1037 xmlNode = _parentOfNS;
1038 xmlNode2 = other._parentOfNS;
1039 }
1040 else if (NodeType == XPathNodeType.Namespace)
1041 {
1042 if (_parentOfNS == other._node)
1043 {
1044 if (other._column == null)
1045 {
1046 return XmlNodeOrder.After;
1047 }
1048 return XmlNodeOrder.Before;
1049 }
1050 xmlNode = _parentOfNS;
1051 xmlNode2 = other._node;
1052 }
1053 else if (other.NodeType == XPathNodeType.Namespace)
1054 {
1055 if (_node == other._parentOfNS)
1056 {
1057 if (_column == null)
1058 {
1059 return XmlNodeOrder.Before;
1060 }
1061 return XmlNodeOrder.After;
1062 }
1063 xmlNode = _node;
1064 xmlNode2 = other._parentOfNS;
1065 }
1066 else
1067 {
1068 if (_node == other._node)
1069 {
1070 if (_column == other._column)
1071 {
1072 if (_fOnValue)
1073 {
1074 return XmlNodeOrder.After;
1075 }
1076 return XmlNodeOrder.Before;
1077 }
1078 if (_column == null)
1079 {
1080 return XmlNodeOrder.Before;
1081 }
1082 if (other._column == null)
1083 {
1084 return XmlNodeOrder.After;
1085 }
1086 if (_column.Ordinal < other._column.Ordinal)
1087 {
1088 return XmlNodeOrder.Before;
1089 }
1090 return XmlNodeOrder.After;
1091 }
1092 xmlNode = _node;
1093 xmlNode2 = other._node;
1094 }
1095 if (xmlNode == null || xmlNode2 == null)
1096 {
1097 return XmlNodeOrder.Unknown;
1098 }
1099 int depth = -1;
1100 int depth2 = -1;
1101 XmlNode root = GetRoot(xmlNode, ref depth);
1102 XmlNode root2 = GetRoot(xmlNode2, ref depth2);
1103 if (root != root2)
1104 {
1105 return XmlNodeOrder.Unknown;
1106 }
1107 if (depth > depth2)
1108 {
1109 while (xmlNode != null && depth > depth2)
1110 {
1111 xmlNode = ((xmlNode.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute)xmlNode).OwnerElement : xmlNode.ParentNode);
1112 depth--;
1113 }
1114 if (xmlNode == xmlNode2)
1115 {
1116 return XmlNodeOrder.After;
1117 }
1118 }
1119 else if (depth2 > depth)
1120 {
1121 while (xmlNode2 != null && depth2 > depth)
1122 {
1123 xmlNode2 = ((xmlNode2.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute)xmlNode2).OwnerElement : xmlNode2.ParentNode);
1124 depth2--;
1125 }
1126 if (xmlNode == xmlNode2)
1127 {
1128 return XmlNodeOrder.Before;
1129 }
1130 }
1131 XmlNode xmlNode3 = GetParent(xmlNode);
1132 XmlNode xmlNode4 = GetParent(xmlNode2);
1133 XmlNode xmlNode5 = null;
1134 while (xmlNode3 != null && xmlNode4 != null)
1135 {
1136 if (xmlNode3 == xmlNode4)
1137 {
1138 while (xmlNode != null)
1139 {
1140 xmlNode5 = xmlNode.NextSibling;
1141 if (xmlNode5 == xmlNode2)
1142 {
1143 return XmlNodeOrder.Before;
1144 }
1145 xmlNode = xmlNode5;
1146 }
1147 return XmlNodeOrder.After;
1148 }
1149 xmlNode = xmlNode3;
1150 xmlNode2 = xmlNode4;
1151 xmlNode3 = xmlNode.ParentNode;
1152 xmlNode4 = xmlNode2.ParentNode;
1153 }
1154 return XmlNodeOrder.Unknown;
1155 }
1156
1158 {
1159 RealFoliate();
1160 return nodeToCheck == _node;
1161 }
1162
1164 {
1165 if (_node == foliatedNode && _column != null)
1166 {
1167 _bNeedFoliate = true;
1168 }
1169 }
1170
1171 private void RealFoliate()
1172 {
1173 if (!_bNeedFoliate)
1174 {
1175 return;
1176 }
1177 _bNeedFoliate = false;
1178 XmlNode xmlNode = null;
1179 if (_doc.IsTextOnly(_column))
1180 {
1181 xmlNode = _node.FirstChild;
1182 }
1183 else
1184 {
1185 if (_column.ColumnMapping == MappingType.Attribute)
1186 {
1187 xmlNode = _node.Attributes.GetNamedItem(_column.EncodedColumnName, _column.Namespace);
1188 }
1189 else
1190 {
1191 xmlNode = _node.FirstChild;
1192 while (xmlNode != null && (!(xmlNode.LocalName == _column.EncodedColumnName) || !(xmlNode.NamespaceURI == _column.Namespace)))
1193 {
1194 xmlNode = xmlNode.NextSibling;
1195 }
1196 }
1197 if (xmlNode != null && _fOnValue)
1198 {
1199 xmlNode = xmlNode.FirstChild;
1200 }
1201 }
1202 if (xmlNode == null)
1203 {
1205 }
1206 _node = xmlNode;
1207 _column = null;
1208 _fOnValue = false;
1209 _bNeedFoliate = false;
1210 }
1211
1212 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
1213 private string GetNamespace(XmlBoundElement be, string name)
1214 {
1215 if (be == null)
1216 {
1217 return null;
1218 }
1219 XmlAttribute xmlAttribute = null;
1220 if (be.IsFoliated)
1221 {
1222 return be.GetAttributeNode(name, "http://www.w3.org/2000/xmlns/")?.Value;
1223 }
1224 DataRow row = be.Row;
1225 if (row == null)
1226 {
1227 return null;
1228 }
1229 for (DataColumn dataColumn = PreviousColumn(row, null, fAttribute: true); dataColumn != null; dataColumn = PreviousColumn(row, dataColumn, fAttribute: true))
1230 {
1231 if (dataColumn.Namespace == "http://www.w3.org/2000/xmlns/")
1232 {
1233 DataRowVersion version = ((row.RowState == DataRowState.Detached) ? DataRowVersion.Proposed : DataRowVersion.Current);
1234 return dataColumn.ConvertObjectToXml(row[dataColumn, version]);
1235 }
1236 }
1237 return null;
1238 }
1239
1240 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
1241 internal string GetNamespace(string name)
1242 {
1243 switch (name)
1244 {
1245 case "xml":
1246 return "http://www.w3.org/XML/1998/namespace";
1247 case "xmlns":
1248 return "http://www.w3.org/2000/xmlns/";
1249 default:
1250 if (name.Length == 0)
1251 {
1252 name = "xmlns";
1253 }
1254 break;
1255 case null:
1256 break;
1257 }
1258 RealFoliate();
1259 XmlNode xmlNode = _node;
1260 XmlNodeType nodeType = xmlNode.NodeType;
1261 string text = null;
1262 while (xmlNode != null)
1263 {
1264 while (xmlNode != null && (nodeType = xmlNode.NodeType) != XmlNodeType.Element)
1265 {
1266 xmlNode = ((nodeType != XmlNodeType.Attribute) ? xmlNode.ParentNode : ((XmlAttribute)xmlNode).OwnerElement);
1267 }
1268 if (xmlNode != null)
1269 {
1270 text = GetNamespace((XmlBoundElement)xmlNode, name);
1271 if (text != null)
1272 {
1273 return text;
1274 }
1275 xmlNode = xmlNode.ParentNode;
1276 }
1277 }
1278 return string.Empty;
1279 }
1280
1281 internal bool MoveToNamespace(string name)
1282 {
1283 _parentOfNS = _node as XmlBoundElement;
1284 if (_parentOfNS == null)
1285 {
1286 return false;
1287 }
1288 string text = name;
1289 if (text == "xmlns")
1290 {
1291 text = "xmlns:xmlns";
1292 }
1293 if (text != null && text.Length == 0)
1294 {
1295 text = "xmlns";
1296 }
1297 RealFoliate();
1298 XmlNode xmlNode = _node;
1299 XmlAttribute xmlAttribute = null;
1300 XmlBoundElement xmlBoundElement = null;
1301 while (xmlNode != null)
1302 {
1303 if (xmlNode is XmlBoundElement xmlBoundElement2)
1304 {
1305 if (xmlBoundElement2.IsFoliated)
1306 {
1307 xmlAttribute = xmlBoundElement2.GetAttributeNode(name, "http://www.w3.org/2000/xmlns/");
1308 if (xmlAttribute != null)
1309 {
1310 MoveTo(xmlAttribute);
1311 return true;
1312 }
1313 }
1314 else
1315 {
1316 DataRow row = xmlBoundElement2.Row;
1317 if (row == null)
1318 {
1319 return false;
1320 }
1321 for (DataColumn dataColumn = PreviousColumn(row, null, fAttribute: true); dataColumn != null; dataColumn = PreviousColumn(row, dataColumn, fAttribute: true))
1322 {
1323 if (dataColumn.Namespace == "http://www.w3.org/2000/xmlns/" && dataColumn.ColumnName == name)
1324 {
1325 MoveTo(xmlBoundElement2, dataColumn, fOnValue: false);
1326 return true;
1327 }
1328 }
1329 }
1330 }
1331 do
1332 {
1333 xmlNode = xmlNode.ParentNode;
1334 }
1335 while (xmlNode != null && xmlNode.NodeType != XmlNodeType.Element);
1336 }
1337 _parentOfNS = null;
1338 return false;
1339 }
1340
1341 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
1343 {
1344 if (be != null)
1345 {
1346 if (be.IsFoliated)
1347 {
1348 XmlAttributeCollection attributes = be.Attributes;
1349 XmlAttribute xmlAttribute = null;
1350 bool flag = false;
1351 if (curAttr == null)
1352 {
1353 flag = true;
1354 }
1355 int num = attributes.Count;
1356 while (num > 0)
1357 {
1358 num--;
1359 xmlAttribute = attributes[num];
1360 if (flag && xmlAttribute.NamespaceURI == "http://www.w3.org/2000/xmlns/" && !DuplicateNS(be, xmlAttribute.LocalName))
1361 {
1362 MoveTo(xmlAttribute);
1363 return true;
1364 }
1365 if (xmlAttribute == curAttr)
1366 {
1367 flag = true;
1368 }
1369 }
1370 }
1371 else
1372 {
1373 DataRow row = be.Row;
1374 if (row == null)
1375 {
1376 return false;
1377 }
1378 for (DataColumn dataColumn = PreviousColumn(row, col, fAttribute: true); dataColumn != null; dataColumn = PreviousColumn(row, dataColumn, fAttribute: true))
1379 {
1380 if (dataColumn.Namespace == "http://www.w3.org/2000/xmlns/" && !DuplicateNS(be, dataColumn.ColumnName))
1381 {
1382 MoveTo(be, dataColumn, fOnValue: false);
1383 return true;
1384 }
1385 }
1386 }
1387 }
1388 return false;
1389 }
1390
1391 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
1392 internal bool MoveToFirstNamespace(XPathNamespaceScope namespaceScope)
1393 {
1394 RealFoliate();
1395 _parentOfNS = _node as XmlBoundElement;
1396 if (_parentOfNS == null)
1397 {
1398 return false;
1399 }
1400 XmlNode xmlNode = _node;
1401 XmlBoundElement xmlBoundElement = null;
1402 while (true)
1403 {
1404 if (xmlNode != null)
1405 {
1406 xmlBoundElement = xmlNode as XmlBoundElement;
1407 if (MoveToNextNamespace(xmlBoundElement, null, null))
1408 {
1409 return true;
1410 }
1411 if (namespaceScope == XPathNamespaceScope.Local)
1412 {
1413 break;
1414 }
1415 do
1416 {
1417 xmlNode = xmlNode.ParentNode;
1418 }
1419 while (xmlNode != null && xmlNode.NodeType != XmlNodeType.Element);
1420 continue;
1421 }
1422 if (namespaceScope != 0)
1423 {
1424 break;
1425 }
1426 MoveTo(_doc._attrXml, null, fOnValue: false);
1427 return true;
1428 }
1429 _parentOfNS = null;
1430 return false;
1431 }
1432
1433 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
1434 private bool DuplicateNS(XmlBoundElement endElem, string lname)
1435 {
1436 if (_parentOfNS == null || endElem == null)
1437 {
1438 return false;
1439 }
1440 XmlBoundElement xmlBoundElement = _parentOfNS;
1441 XmlNode xmlNode = null;
1442 while (xmlBoundElement != null && xmlBoundElement != endElem)
1443 {
1444 if (GetNamespace(xmlBoundElement, lname) != null)
1445 {
1446 return true;
1447 }
1448 xmlNode = xmlBoundElement;
1449 do
1450 {
1451 xmlNode = xmlNode.ParentNode;
1452 }
1453 while (xmlNode != null && xmlNode.NodeType != XmlNodeType.Element);
1454 xmlBoundElement = xmlNode as XmlBoundElement;
1455 }
1456 return false;
1457 }
1458
1459 [RequiresUnreferencedCode("Members from serialized types may be trimmed if not referenced directly.")]
1460 internal bool MoveToNextNamespace(XPathNamespaceScope namespaceScope)
1461 {
1462 RealFoliate();
1463 XmlNode xmlNode = _node;
1464 if (_column != null)
1465 {
1466 if (namespaceScope == XPathNamespaceScope.Local && _parentOfNS != _node)
1467 {
1468 return false;
1469 }
1470 XmlBoundElement xmlBoundElement = _node as XmlBoundElement;
1471 DataRow row = xmlBoundElement.Row;
1472 for (DataColumn dataColumn = PreviousColumn(row, _column, fAttribute: true); dataColumn != null; dataColumn = PreviousColumn(row, dataColumn, fAttribute: true))
1473 {
1474 if (dataColumn.Namespace == "http://www.w3.org/2000/xmlns/")
1475 {
1476 MoveTo(xmlBoundElement, dataColumn, fOnValue: false);
1477 return true;
1478 }
1479 }
1480 if (namespaceScope == XPathNamespaceScope.Local)
1481 {
1482 return false;
1483 }
1484 do
1485 {
1486 xmlNode = xmlNode.ParentNode;
1487 }
1488 while (xmlNode != null && xmlNode.NodeType != XmlNodeType.Element);
1489 }
1490 else if (_node.NodeType == XmlNodeType.Attribute)
1491 {
1492 XmlAttribute xmlAttribute = (XmlAttribute)_node;
1493 xmlNode = xmlAttribute.OwnerElement;
1494 if (xmlNode == null)
1495 {
1496 return false;
1497 }
1498 if (namespaceScope == XPathNamespaceScope.Local && _parentOfNS != xmlNode)
1499 {
1500 return false;
1501 }
1502 if (MoveToNextNamespace((XmlBoundElement)xmlNode, null, xmlAttribute))
1503 {
1504 return true;
1505 }
1506 if (namespaceScope == XPathNamespaceScope.Local)
1507 {
1508 return false;
1509 }
1510 do
1511 {
1512 xmlNode = xmlNode.ParentNode;
1513 }
1514 while (xmlNode != null && xmlNode.NodeType != XmlNodeType.Element);
1515 }
1516 while (xmlNode != null)
1517 {
1518 XmlBoundElement be = xmlNode as XmlBoundElement;
1519 if (MoveToNextNamespace(be, null, null))
1520 {
1521 return true;
1522 }
1523 do
1524 {
1525 xmlNode = xmlNode.ParentNode;
1526 }
1527 while (xmlNode != null && xmlNode.NodeType == XmlNodeType.Element);
1528 }
1529 if (namespaceScope == XPathNamespaceScope.All)
1530 {
1531 MoveTo(_doc._attrXml, null, fOnValue: false);
1532 return true;
1533 }
1534 return false;
1535 }
1536
1538 {
1539 return _owner.IsAlive;
1540 }
1541}
static bool IsDBNull([NotNullWhen(true)] object? value)
Definition Convert.cs:215
static readonly DBNull Value
Definition DBNull.cs:8
string ConvertObjectToXml(object value)
virtual MappingType ColumnMapping
DataColumnCollection Columns
Definition DataTable.cs:327
static string DataDom_Foliation
Definition SR.cs:684
Definition SR.cs:7
bool GetRegion(XmlNode node, [NotNullWhen(true)] out XmlBoundElement rowElem)
XmlNodeOrder CompareNamespacePosition(XPathNodePointer other)
DataColumn NextColumn(DataRow row, DataColumn col, bool fAttribute)
XPathNodePointer(DataDocumentXPathNavigator owner, XmlDataDocument doc, XmlNode node)
int ColumnCount(DataRow row, bool fAttribute)
XPathNodePointer(DataDocumentXPathNavigator owner, XmlDataDocument doc, XmlNode node, DataColumn c, bool bOnValue, XmlBoundElement parentOfNS)
string GetNamespace(XmlBoundElement be, string name)
void MoveTo(XmlNode node, DataColumn column, bool fOnValue)
readonly WeakReference _owner
bool MoveToFirstNamespace(XPathNamespaceScope namespaceScope)
bool IsNamespaceNode(XmlNodeType nt, string ns)
readonly XmlDataDocument _doc
XmlNodeOrder ComparePosition(XPathNodePointer other)
bool MoveToNextAttribute(bool bFirst)
XPathNodePointer Clone(DataDocumentXPathNavigator owner)
string GetNamespace(string name)
bool MoveToNextNamespace(XmlBoundElement be, DataColumn col, XmlAttribute curAttr)
bool IsValidChild(XmlNode parent, XmlNode child)
DataColumn PreviousColumn(DataRow row, DataColumn col, bool fAttribute)
bool IsSamePosition(XPathNodePointer pointer)
bool IsValidChild(XmlNode parent, DataColumn c)
bool MoveTo(XPathNodePointer pointer)
bool MoveToNextNamespace(XPathNamespaceScope namespaceScope)
bool DuplicateNS(XmlBoundElement endElem, string lname)
static int[] CreateXmlNodeTypeToXpathNodeTypeMap()
static readonly int[] s_xmlNodeType_To_XpathNodeType_Map
bool MoveToAttribute(string localName, string namespaceURI)
static XmlNode GetRoot(XmlNode node, ref int depth)
XPathNodePointer(DataDocumentXPathNavigator owner, XPathNodePointer pointer)
XPathNodeType DecideXPNodeTypeForTextNodes(XmlNode node)
XPathNodeType ConvertNodeType(XmlNode node)
XmlNode GetParent(XmlNode node)
virtual ? XmlElement OwnerElement
override string LocalName
override string Value
override string NamespaceURI
override XmlAttributeCollection Attributes
XmlNode SafeFirstChild(XmlNode n)
bool IsNotMapped(DataColumn c)
void AddPointer(IXmlDataVirtualNode pointer)
XmlNode SafeNextSibling(XmlNode n)
void Foliate(XmlBoundElement node, ElementState newState)
static bool IsTextNode(XmlNodeType nt)
override? XmlNode ParentNode
Definition XmlElement.cs:47
override string InnerText
virtual ? XmlAttribute GetAttributeNode(string name)
string Add(char[] array, int offset, int length)
virtual ? XmlNode GetNamedItem(string name)
virtual ? string Value
Definition XmlNode.cs:62
virtual string BaseURI
Definition XmlNode.cs:233
virtual string InnerText
Definition XmlNode.cs:157
virtual ? XmlNode ParentNode
Definition XmlNode.cs:76
virtual ? XmlNode NextSibling
Definition XmlNode.cs:104
virtual string NamespaceURI
Definition XmlNode.cs:139
virtual ? XmlNode FirstChild
Definition XmlNode.cs:120
virtual string Prefix
Definition XmlNode.cs:142
virtual ? XmlAttributeCollection Attributes
Definition XmlNode.cs:106
XmlNodeType NodeType
Definition XmlNode.cs:73
void OnFoliated(XmlNode foliatedNode)
bool IsOnNode(XmlNode nodeToCheck)