//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel.Dispatcher { using System.Runtime; using System.Xml.XPath; public sealed class XPathResult : IDisposable { bool boolResult; SafeNodeSequenceIterator internalIterator; XPathNodeIterator nodeSetResult; double numberResult; XPathResultType resultType; string stringResult; internal XPathResult(XPathNodeIterator nodeSetResult) : this() { this.nodeSetResult = nodeSetResult; this.internalIterator = nodeSetResult as SafeNodeSequenceIterator; this.resultType = XPathResultType.NodeSet; } internal XPathResult(string stringResult) : this() { this.stringResult = stringResult; this.resultType = XPathResultType.String; } internal XPathResult(bool boolResult) : this() { this.boolResult = boolResult; this.resultType = XPathResultType.Boolean; } internal XPathResult(double numberResult) : this() { this.numberResult = numberResult; this.resultType = XPathResultType.Number; } XPathResult() { } public XPathResultType ResultType { get { return this.resultType; } } public void Dispose() { if (this.internalIterator != null) { this.internalIterator.Dispose(); } } public bool GetResultAsBoolean() { switch (this.resultType) { case XPathResultType.Boolean: return this.boolResult; case XPathResultType.NodeSet: return QueryValueModel.Boolean(this.nodeSetResult); case XPathResultType.Number: return QueryValueModel.Boolean(this.numberResult); case XPathResultType.String: return QueryValueModel.Boolean(this.stringResult); default: throw Fx.AssertAndThrow("Unexpected result type."); } } public XPathNodeIterator GetResultAsNodeset() { if (this.resultType != XPathResultType.NodeSet) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.CannotRepresentResultAsNodeset))); } return this.nodeSetResult; } public double GetResultAsNumber() { switch (this.resultType) { case XPathResultType.Boolean: return QueryValueModel.Double(this.boolResult); case XPathResultType.NodeSet: return QueryValueModel.Double(this.nodeSetResult); case XPathResultType.Number: return this.numberResult; case XPathResultType.String: return QueryValueModel.Double(this.stringResult); default: throw Fx.AssertAndThrow("Unexpected result type."); } } public string GetResultAsString() { switch (this.resultType) { case XPathResultType.Boolean: return QueryValueModel.String(this.boolResult); case XPathResultType.NodeSet: return QueryValueModel.String(this.nodeSetResult); case XPathResultType.Number: return QueryValueModel.String(this.numberResult); case XPathResultType.String: return this.stringResult; default: throw Fx.AssertAndThrow("Unexpected result type."); } } internal XPathResult Copy() { XPathResult result = new XPathResult(); result.resultType = this.resultType; switch (this.resultType) { case XPathResultType.Boolean: result.boolResult = this.boolResult; break; case XPathResultType.NodeSet: result.nodeSetResult = this.nodeSetResult.Clone(); break; case XPathResultType.Number: result.numberResult = this.numberResult; break; case XPathResultType.String: result.stringResult = this.stringResult; break; default: throw Fx.AssertAndThrow("Unexpected result type."); } return result; } } }