internal XmlNodeOrder ComparePosition( XPathNodePointer other ) { //Debug.WriteLineIf( XmlTrace.traceXPathNodePointerFunctions.Enabled, "XPathNodePointer:ComparePosition(other)"); RealFoliate(); other.RealFoliate(); Debug.Assert( other != null ); if ( IsSamePosition( other ) ) return XmlNodeOrder.Same; XmlNode curNode1 = null, curNode2 = null; //deal with namespace node first if ( this.NodeType == XPathNodeType.Namespace && other.NodeType == XPathNodeType.Namespace ) { if ( this._parentOfNS == other._parentOfNS ) return this.CompareNamespacePosition( other ); //if not from the same parent curNode1 = this._parentOfNS; curNode2 = other._parentOfNS; } else if ( this.NodeType == XPathNodeType.Namespace ) { Debug.Assert( other.NodeType != XPathNodeType.Namespace ); if ( this._parentOfNS == other._node ) { //from the same region, NS nodes come before all other nodes if ( other._column == null ) return XmlNodeOrder.After; else return XmlNodeOrder.Before; } //if not from the same region curNode1 = this._parentOfNS; curNode2 = other._node; } else if ( other.NodeType == XPathNodeType.Namespace ) { Debug.Assert( this.NodeType != XPathNodeType.Namespace ); if ( this._node == other._parentOfNS ) { //from the same region if ( this._column == null ) return XmlNodeOrder.Before; else return XmlNodeOrder.After; } //if not from the same region curNode1 = this._node; curNode2 = other._parentOfNS; } else { if ( this._node == other._node ) { //compare within the same region if ( this._column == other._column ) { //one is the children of the other Debug.Assert( this._fOnValue != other._fOnValue ); if ( this._fOnValue ) return XmlNodeOrder.After; else return XmlNodeOrder.Before; } else { Debug.Assert( this.Row == other.Row ); //in the same row if ( this._column == null ) return XmlNodeOrder.Before; else if ( other._column == null ) return XmlNodeOrder.After; else if ( this._column.Ordinal < other._column.Ordinal ) return XmlNodeOrder.Before; else return XmlNodeOrder.After; } } curNode1 = this._node; curNode2 = other._node; } Debug.Assert( curNode1 != null ); Debug.Assert( curNode2 != null ); if (curNode1 == null || curNode2 == null) { return XmlNodeOrder.Unknown; } int depth1 = -1, depth2 = -1; XmlNode root1 = XPathNodePointer.GetRoot( curNode1, ref depth1 ); XmlNode root2 = XPathNodePointer.GetRoot( curNode2, ref depth2 ); if ( root1 != root2 ) return XmlNodeOrder.Unknown; if ( depth1 > depth2 ) { while ( curNode1 != null && depth1 > depth2 ) { curNode1 = ( ( curNode1.NodeType == XmlNodeType.Attribute ) ? ( ((XmlAttribute)curNode1).OwnerElement ) : ( curNode1.ParentNode ) ); depth1--; } if ( curNode1 == curNode2 ) return XmlNodeOrder.After; } else if ( depth2 > depth1 ) { while ( curNode2 != null && depth2 > depth1 ) { curNode2 = ( ( curNode2.NodeType == XmlNodeType.Attribute ) ? ( ((XmlAttribute)curNode2).OwnerElement ) : ( curNode2.ParentNode ) ); depth2--; } if ( curNode1 == curNode2 ) return XmlNodeOrder.Before; } XmlNode parent1 = GetParent(curNode1); XmlNode parent2 = GetParent(curNode2); XmlNode nextNode = null; while ( parent1 != null && parent2 != null ) { if ( parent1 == parent2 ) { while (curNode1 != null ) { nextNode = curNode1.NextSibling; if ( nextNode == curNode2 ) return XmlNodeOrder.Before; curNode1 = nextNode; } return XmlNodeOrder.After; } curNode1 = parent1; curNode2 = parent2; parent1 = curNode1.ParentNode; parent2 = curNode2.ParentNode; } //logically, we shouldn't reach here Debug.Assert( false ); return XmlNodeOrder.Unknown; }
internal bool IsSamePosition( XPathNodePointer pointer ) { //Debug.WriteLineIf( XmlTrace.traceXPathNodePointerFunctions.Enabled, "XPathNodePointer:IsSamePosition(pointer)"); RealFoliate(); pointer.RealFoliate(); AssertValid(); pointer.AssertValid(); if (_column == null && pointer._column == null) return ( pointer._node == this._node && pointer._parentOfNS == this._parentOfNS ); return ( pointer._doc == this._doc && pointer._node == this._node && pointer._column == this._column && pointer._fOnValue == this._fOnValue && pointer._parentOfNS == this._parentOfNS ); }
private XmlNodeOrder CompareNamespacePosition( XPathNodePointer other ) { //Debug.WriteLineIf( XmlTrace.traceXPathNodePointerFunctions.Enabled, "XPathNodePointer:CompareNamespacePostion(other)"); XPathNodePointer xp1 = this.Clone((DataDocumentXPathNavigator)(this._owner.Target)); XPathNodePointer xp2 = other.Clone((DataDocumentXPathNavigator)(other._owner.Target)); while ( xp1.MoveToNextNamespace(XPathNamespaceScope.All) ) { if ( xp1.IsSamePosition( other ) ) return XmlNodeOrder.Before; } return XmlNodeOrder.After; }
internal XPathNodePointer( DataDocumentXPathNavigator owner, XPathNodePointer pointer ) : this ( owner, pointer._doc, pointer._node, pointer._column, pointer._fOnValue, pointer._parentOfNS ) { }
internal bool MoveTo( XPathNodePointer pointer ) { //Debug.WriteLineIf( XmlTrace.traceXPathNodePointerFunctions.Enabled, "XPathNodePointer:MoveTo(pointer)"); AssertValid(); if ( this._doc != pointer._doc ) return false; /* XmlDataDocument docOld = this._doc; XmlDataDocument docNew = pointer._doc; if ( docNew != docOld ) { this._doc.RemovePointer( this ); this._doc = pointer._doc; this._doc.AddPointer( this ); } */ this._node = pointer._node; this._column = pointer._column; this._fOnValue = pointer._fOnValue; this._bNeedFoliate = pointer._bNeedFoliate; AssertValid(); return true; }
internal DataDocumentXPathNavigator( XmlDataDocument doc, XmlNode node ) { _curNode = new XPathNodePointer( this, doc, node ); _temp = new XPathNodePointer( this, doc, node ); _doc = doc; }
private DataDocumentXPathNavigator( DataDocumentXPathNavigator other ) { this._curNode = other._curNode.Clone( this ); this._temp = other._temp.Clone( this ); this._doc = other._doc; }
private XmlNodeOrder CompareNamespacePosition(XPathNodePointer other) { XPathNodePointer xp1 = Clone((DataDocumentXPathNavigator)(_owner.Target)); XPathNodePointer xp2 = other.Clone((DataDocumentXPathNavigator)(other._owner.Target)); while (xp1.MoveToNextNamespace(XPathNamespaceScope.All)) { if (xp1.IsSamePosition(other)) return XmlNodeOrder.Before; } return XmlNodeOrder.After; }
internal bool MoveTo(XPathNodePointer pointer) { AssertValid(); if (_doc != pointer._doc) { return false; } _node = pointer._node; _column = pointer._column; _fOnValue = pointer._fOnValue; _bNeedFoliate = pointer._bNeedFoliate; AssertValid(); return true; }
internal bool IsSamePosition(XPathNodePointer pointer) { RealFoliate(); pointer.RealFoliate(); AssertValid(); pointer.AssertValid(); if (_column == null && pointer._column == null) return (pointer._node == _node && pointer._parentOfNS == _parentOfNS); return (pointer._doc == _doc && pointer._node == _node && pointer._column == _column && pointer._fOnValue == _fOnValue && pointer._parentOfNS == _parentOfNS); }
private XmlNodeOrder CompareNamespacePosition(XPathNodePointer other) { XPathNodePointer pointer = this.Clone((DataDocumentXPathNavigator) this._owner.Target); other.Clone((DataDocumentXPathNavigator) other._owner.Target); while (pointer.MoveToNextNamespace(XPathNamespaceScope.All)) { if (pointer.IsSamePosition(other)) { return XmlNodeOrder.Before; } } return XmlNodeOrder.After; }
internal bool MoveTo(XPathNodePointer pointer) { if (this._doc != pointer._doc) { return false; } this._node = pointer._node; this._column = pointer._column; this._fOnValue = pointer._fOnValue; this._bNeedFoliate = pointer._bNeedFoliate; return true; }
internal bool IsSamePosition(XPathNodePointer pointer) { this.RealFoliate(); pointer.RealFoliate(); if ((this._column == null) && (pointer._column == null)) { return ((pointer._node == this._node) && (pointer._parentOfNS == this._parentOfNS)); } return ((((pointer._doc == this._doc) && (pointer._node == this._node)) && ((pointer._column == this._column) && (pointer._fOnValue == this._fOnValue))) && (pointer._parentOfNS == this._parentOfNS)); }
internal XmlNodeOrder ComparePosition(XPathNodePointer other) { this.RealFoliate(); other.RealFoliate(); if (this.IsSamePosition(other)) { return XmlNodeOrder.Same; } XmlNode node = null; XmlNode node2 = null; if ((this.NodeType == XPathNodeType.Namespace) && (other.NodeType == XPathNodeType.Namespace)) { if (this._parentOfNS == other._parentOfNS) { return this.CompareNamespacePosition(other); } node = this._parentOfNS; node2 = other._parentOfNS; } else if (this.NodeType == XPathNodeType.Namespace) { if (this._parentOfNS == other._node) { if (other._column == null) { return XmlNodeOrder.After; } return XmlNodeOrder.Before; } node = this._parentOfNS; node2 = other._node; } else if (other.NodeType == XPathNodeType.Namespace) { if (this._node == other._parentOfNS) { if (this._column == null) { return XmlNodeOrder.Before; } return XmlNodeOrder.After; } node = this._node; node2 = other._parentOfNS; } else { if (this._node == other._node) { if (this._column == other._column) { if (this._fOnValue) { return XmlNodeOrder.After; } return XmlNodeOrder.Before; } if (this._column == null) { return XmlNodeOrder.Before; } if ((other._column != null) && (this._column.Ordinal < other._column.Ordinal)) { return XmlNodeOrder.Before; } return XmlNodeOrder.After; } node = this._node; node2 = other._node; } if ((node != null) && (node2 != null)) { int depth = -1; int num = -1; XmlNode root = GetRoot(node, ref depth); XmlNode node6 = GetRoot(node2, ref num); if (root != node6) { return XmlNodeOrder.Unknown; } if (depth > num) { while ((node != null) && (depth > num)) { node = (node.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute) node).OwnerElement : node.ParentNode; depth--; } if (node == node2) { return XmlNodeOrder.After; } } else if (num > depth) { while ((node2 != null) && (num > depth)) { node2 = (node2.NodeType == XmlNodeType.Attribute) ? ((XmlAttribute) node2).OwnerElement : node2.ParentNode; num--; } if (node == node2) { return XmlNodeOrder.Before; } } XmlNode parent = this.GetParent(node); XmlNode parentNode = this.GetParent(node2); XmlNode nextSibling = null; while ((parent != null) && (parentNode != null)) { if (parent == parentNode) { while (node != null) { nextSibling = node.NextSibling; if (nextSibling == node2) { return XmlNodeOrder.Before; } node = nextSibling; } return XmlNodeOrder.After; } node = parent; node2 = parentNode; parent = node.ParentNode; parentNode = node2.ParentNode; } } return XmlNodeOrder.Unknown; }