Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Xml / System / Xml / XPath / Internal / UnionExpr.cs / 1305376 / UnionExpr.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace MS.Internal.Xml.XPath { using System; using System.Xml; using System.Xml.XPath; using System.Diagnostics; using System.Xml.Xsl; internal sealed class UnionExpr : Query { internal Query qy1, qy2; private bool advance1, advance2; private XPathNavigator currentNode; private XPathNavigator nextNode; public UnionExpr(Query query1, Query query2) { this.qy1 = query1; this.qy2 = query2; this.advance1 = true; this.advance2 = true; } private UnionExpr(UnionExpr other) : base(other) { this.qy1 = Clone(other.qy1); this.qy2 = Clone(other.qy2); this.advance1 = other.advance1; this.advance2 = other.advance2; this.currentNode = Clone(other.currentNode); this.nextNode = Clone(other.nextNode); } public override void Reset() { qy1.Reset(); qy2.Reset(); advance1 = true; advance2 = true; nextNode = null; } public override void SetXsltContext(XsltContext xsltContext) { qy1.SetXsltContext(xsltContext); qy2.SetXsltContext(xsltContext); } public override object Evaluate(XPathNodeIterator context) { qy1.Evaluate(context); qy2.Evaluate(context); advance1 = true; advance2 = true; nextNode = null; base.ResetCount(); return this; } private XPathNavigator ProcessSamePosition(XPathNavigator result){ currentNode = result; advance1 = advance2 = true; return result; } private XPathNavigator ProcessBeforePosition(XPathNavigator res1, XPathNavigator res2){ nextNode = res2; advance2 = false; advance1 = true; currentNode = res1; return res1; } private XPathNavigator ProcessAfterPosition(XPathNavigator res1, XPathNavigator res2){ nextNode = res1; advance1 = false; advance2 = true; currentNode = res2; return res2; } public override XPathNavigator Advance() { XPathNavigator res1, res2; XmlNodeOrder order = 0; if (advance1) { res1 = qy1.Advance(); } else { res1 = nextNode; } if (advance2) { res2 = qy2.Advance(); } else { res2 = nextNode; } if (res1 != null && res2 != null) { order = CompareNodes(res1, res2); } else if (res2 == null) { advance1 = true; advance2 = false; currentNode = res1; nextNode = null; return res1; } else { advance1 = false; advance2 = true; currentNode = res2; nextNode = null; return res2; } if (order == XmlNodeOrder.Before) { return ProcessBeforePosition(res1, res2); } else if (order == XmlNodeOrder.After) { return ProcessAfterPosition(res1, res2); } else { // BugBug. In case of Unknown we sorting as the same. return ProcessSamePosition(res1); } } public override XPathNavigator MatchNode(XPathNavigator xsltContext) { if (xsltContext != null) { XPathNavigator result = qy1.MatchNode(xsltContext); if (result != null) { return result; } return qy2.MatchNode(xsltContext); } return null; } public override XPathResultType StaticType { get { return XPathResultType.NodeSet; } } public override XPathNodeIterator Clone() { return new UnionExpr(this); } public override XPathNavigator Current { get { return currentNode; } } public override int CurrentPosition { get { throw new InvalidOperationException(); } } public override void PrintQuery(XmlWriter w) { w.WriteStartElement(this.GetType().Name); if (qy1 != null) { qy1.PrintQuery(w); } if (qy2 != null) { qy2.PrintQuery(w); } w.WriteEndElement(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace MS.Internal.Xml.XPath { using System; using System.Xml; using System.Xml.XPath; using System.Diagnostics; using System.Xml.Xsl; internal sealed class UnionExpr : Query { internal Query qy1, qy2; private bool advance1, advance2; private XPathNavigator currentNode; private XPathNavigator nextNode; public UnionExpr(Query query1, Query query2) { this.qy1 = query1; this.qy2 = query2; this.advance1 = true; this.advance2 = true; } private UnionExpr(UnionExpr other) : base(other) { this.qy1 = Clone(other.qy1); this.qy2 = Clone(other.qy2); this.advance1 = other.advance1; this.advance2 = other.advance2; this.currentNode = Clone(other.currentNode); this.nextNode = Clone(other.nextNode); } public override void Reset() { qy1.Reset(); qy2.Reset(); advance1 = true; advance2 = true; nextNode = null; } public override void SetXsltContext(XsltContext xsltContext) { qy1.SetXsltContext(xsltContext); qy2.SetXsltContext(xsltContext); } public override object Evaluate(XPathNodeIterator context) { qy1.Evaluate(context); qy2.Evaluate(context); advance1 = true; advance2 = true; nextNode = null; base.ResetCount(); return this; } private XPathNavigator ProcessSamePosition(XPathNavigator result){ currentNode = result; advance1 = advance2 = true; return result; } private XPathNavigator ProcessBeforePosition(XPathNavigator res1, XPathNavigator res2){ nextNode = res2; advance2 = false; advance1 = true; currentNode = res1; return res1; } private XPathNavigator ProcessAfterPosition(XPathNavigator res1, XPathNavigator res2){ nextNode = res1; advance1 = false; advance2 = true; currentNode = res2; return res2; } public override XPathNavigator Advance() { XPathNavigator res1, res2; XmlNodeOrder order = 0; if (advance1) { res1 = qy1.Advance(); } else { res1 = nextNode; } if (advance2) { res2 = qy2.Advance(); } else { res2 = nextNode; } if (res1 != null && res2 != null) { order = CompareNodes(res1, res2); } else if (res2 == null) { advance1 = true; advance2 = false; currentNode = res1; nextNode = null; return res1; } else { advance1 = false; advance2 = true; currentNode = res2; nextNode = null; return res2; } if (order == XmlNodeOrder.Before) { return ProcessBeforePosition(res1, res2); } else if (order == XmlNodeOrder.After) { return ProcessAfterPosition(res1, res2); } else { // BugBug. In case of Unknown we sorting as the same. return ProcessSamePosition(res1); } } public override XPathNavigator MatchNode(XPathNavigator xsltContext) { if (xsltContext != null) { XPathNavigator result = qy1.MatchNode(xsltContext); if (result != null) { return result; } return qy2.MatchNode(xsltContext); } return null; } public override XPathResultType StaticType { get { return XPathResultType.NodeSet; } } public override XPathNodeIterator Clone() { return new UnionExpr(this); } public override XPathNavigator Current { get { return currentNode; } } public override int CurrentPosition { get { throw new InvalidOperationException(); } } public override void PrintQuery(XmlWriter w) { w.WriteStartElement(this.GetType().Name); if (qy1 != null) { qy1.PrintQuery(w); } if (qy2 != null) { qy2.PrintQuery(w); } w.WriteEndElement(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EditBehavior.cs
- EncryptedPackageFilter.cs
- OleServicesContext.cs
- ViewCellSlot.cs
- SourceSwitch.cs
- CapabilitiesSection.cs
- MethodBuilderInstantiation.cs
- DataServiceHost.cs
- TypeTypeConverter.cs
- StaticFileHandler.cs
- ControlTemplate.cs
- PerformanceCounterPermissionAttribute.cs
- CrossContextChannel.cs
- HeaderCollection.cs
- CheckBoxAutomationPeer.cs
- ListViewDeleteEventArgs.cs
- ModifierKeysConverter.cs
- FormsAuthenticationEventArgs.cs
- NativeMethods.cs
- VectorAnimation.cs
- DataGridViewSelectedRowCollection.cs
- KnownBoxes.cs
- PermissionAttributes.cs
- DynamicMethod.cs
- TypeToken.cs
- QueryOptionExpression.cs
- GeometryModel3D.cs
- ClrPerspective.cs
- ConfigurationStrings.cs
- ProcessHostFactoryHelper.cs
- SerializationEventsCache.cs
- DataSysAttribute.cs
- AnnouncementSendsAsyncResult.cs
- OrthographicCamera.cs
- ToolStripSettings.cs
- FamilyMap.cs
- PropertyEntry.cs
- ConstraintStruct.cs
- DiscardableAttribute.cs
- DataGridViewCellStateChangedEventArgs.cs
- CreatingCookieEventArgs.cs
- MeasureData.cs
- NumericUpDown.cs
- BaseTransportHeaders.cs
- DataGridColumnsPage.cs
- HttpListenerRequest.cs
- TableLayoutPanelCellPosition.cs
- CodeMethodReturnStatement.cs
- CustomBindingCollectionElement.cs
- StandardTransformFactory.cs
- MemberProjectedSlot.cs
- XsltCompileContext.cs
- XamlTreeBuilderBamlRecordWriter.cs
- CachedPathData.cs
- InstanceData.cs
- DisableDpiAwarenessAttribute.cs
- WebBrowserBase.cs
- TableRow.cs
- UTF7Encoding.cs
- TileBrush.cs
- CapiSymmetricAlgorithm.cs
- BridgeDataRecord.cs
- TextViewDesigner.cs
- _SpnDictionary.cs
- LogSwitch.cs
- ToolStripMenuItemCodeDomSerializer.cs
- SessionChannels.cs
- SessionSwitchEventArgs.cs
- Effect.cs
- StorageModelBuildProvider.cs
- OutOfProcStateClientManager.cs
- EnvironmentPermission.cs
- CodeMemberField.cs
- DesignerAdRotatorAdapter.cs
- LoginName.cs
- TrueReadOnlyCollection.cs
- DataTemplate.cs
- Literal.cs
- Color.cs
- ToolStripOverflow.cs
- MatrixCamera.cs
- DeviceContexts.cs
- RuleSettings.cs
- ElementsClipboardData.cs
- Int64Animation.cs
- ExpressionBinding.cs
- WSSecurityOneDotZeroReceiveSecurityHeader.cs
- METAHEADER.cs
- UnionCodeGroup.cs
- LocatorManager.cs
- DataGridViewButtonCell.cs
- DictationGrammar.cs
- InkCanvas.cs
- TreeViewAutomationPeer.cs
- IdentityValidationException.cs
- HashFinalRequest.cs
- EnvironmentPermission.cs
- TokenFactoryFactory.cs
- AddressAccessDeniedException.cs
- GridViewEditEventArgs.cs