Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / Xml / System / Xml / XPath / Internal / FunctionQuery.cs / 1 / FunctionQuery.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
namespace MS.Internal.Xml.XPath {
using System;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;
using System.Diagnostics;
using System.Globalization;
using System.Collections.Generic;
internal sealed class FunctionQuery : ExtensionQuery {
private IList args;
private IXsltContextFunction function;
public FunctionQuery(string prefix, string name, List args) : base(prefix, name) {
this.args = args;
}
private FunctionQuery(FunctionQuery other) : base(other) {
this.function = other.function;
Query[] tmp = new Query[other.args.Count]; {
for (int i = 0; i < tmp.Length; i ++) {
tmp[i] = Clone(other.args[i]);
}
args = tmp;
}
this.args = tmp;
}
public override void SetXsltContext(XsltContext context) {
if (context == null) {
throw XPathException.Create(Res.Xp_NoContext);
}
if (this.xsltContext != context) {
xsltContext = context;
foreach (Query argument in args) {
argument.SetXsltContext(context);
}
XPathResultType[] argTypes = new XPathResultType[args.Count];
for(int i = 0; i < args.Count; i ++) {
argTypes[i] = args[i].StaticType;
}
function = xsltContext.ResolveFunction(prefix, name, argTypes);
// KB article allows to return null, see http://support.microsoft.com/?kbid=324462#6
if (function == null) {
throw XPathException.Create(Res.Xp_UndefFunc, QName);
}
}
}
public override object Evaluate(XPathNodeIterator nodeIterator) {
if (xsltContext == null) {
throw XPathException.Create(Res.Xp_NoContext);
}
// calculate arguments:
object[] argVals = new object[args.Count];
for (int i = 0; i < args.Count; i ++) {
argVals[i] = args[i].Evaluate(nodeIterator);
if (argVals[i] is XPathNodeIterator) {// ForBack Compat. To protect our queries from users. bug#372077 & 20006123
argVals[i] = new XPathSelectionIterator(nodeIterator.Current, args[i]);
}
}
try {
return ProcessResult(function.Invoke(xsltContext, argVals, nodeIterator.Current));
} catch(Exception ex) {
throw XPathException.Create(Res.Xp_FunctionFailed, QName, ex);
}
}
public override XPathNavigator MatchNode(XPathNavigator navigator) {
if (name != "key" && prefix.Length != 0) {
throw XPathException.Create(Res.Xp_InvalidPattern);
}
this.Evaluate(new XPathSingletonIterator(navigator, /*moved:*/true));
XPathNavigator nav = null;
while ((nav = this.Advance()) != null) {
if (nav.IsSamePosition(navigator)) {
return nav;
}
}
return nav;
}
public override XPathResultType StaticType { get {
XPathResultType result = function != null ? function.ReturnType : XPathResultType.Any;
if (result == XPathResultType.Error) {
// In v.1 we confused Error & Any so now for backward compatibility we should allow users to return any of them.
result = XPathResultType.Any;
}
return result;
} }
public override XPathNodeIterator Clone() { return new FunctionQuery(this); }
public override void PrintQuery(XmlWriter w) {
w.WriteStartElement(this.GetType().Name);
w.WriteAttributeString("name", prefix.Length != 0 ? prefix + ':' + name : name);
foreach(Query arg in this.args) {
arg.PrintQuery(w);
}
w.WriteEndElement();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ShaperBuffers.cs
- AnonymousIdentificationSection.cs
- CategoryAttribute.cs
- FixedSOMTableCell.cs
- LocationFactory.cs
- DictionaryGlobals.cs
- MatrixAnimationBase.cs
- FilteredDataSetHelper.cs
- safesecurityhelperavalon.cs
- XPathDocument.cs
- XamlReaderHelper.cs
- KeyValueSerializer.cs
- EllipseGeometry.cs
- ToolStripOverflowButton.cs
- SchemaCollectionCompiler.cs
- _NetworkingPerfCounters.cs
- InvalidOleVariantTypeException.cs
- SHA1.cs
- ColorConverter.cs
- Overlapped.cs
- InputLanguageProfileNotifySink.cs
- PseudoWebRequest.cs
- EntityDataSourceChangedEventArgs.cs
- GridViewDeletedEventArgs.cs
- AmbientValueAttribute.cs
- SignatureConfirmations.cs
- ValidationResult.cs
- AssemblyBuilder.cs
- ApplicationSecurityInfo.cs
- UrlRoutingHandler.cs
- CorrelationKey.cs
- LogicalExpressionEditor.cs
- ExecutionProperties.cs
- ContextMarshalException.cs
- ipaddressinformationcollection.cs
- BitmapSourceSafeMILHandle.cs
- PrincipalPermissionMode.cs
- CheckBoxFlatAdapter.cs
- Vector3DIndependentAnimationStorage.cs
- RegisteredScript.cs
- SecurityHelper.cs
- BuildDependencySet.cs
- FileDialog.cs
- AggregateNode.cs
- CacheAxisQuery.cs
- TextSpanModifier.cs
- WSSecurityPolicy.cs
- DataColumnCollection.cs
- UnsafeNativeMethods.cs
- DependencyObject.cs
- TypeConverterAttribute.cs
- CompositeDuplexBindingElementImporter.cs
- WebPageTraceListener.cs
- CommonDialog.cs
- Wrapper.cs
- ObjectConverter.cs
- DataObjectEventArgs.cs
- HandlerMappingMemo.cs
- BindingObserver.cs
- Matrix3DConverter.cs
- MessageDispatch.cs
- ForAllOperator.cs
- DataGridViewDataErrorEventArgs.cs
- TransactionContextValidator.cs
- HelpKeywordAttribute.cs
- NameValuePermission.cs
- OleDbReferenceCollection.cs
- SqlBulkCopyColumnMapping.cs
- Pair.cs
- IPEndPoint.cs
- GB18030Encoding.cs
- RootBrowserWindowAutomationPeer.cs
- Visual.cs
- x509utils.cs
- InvalidPrinterException.cs
- SelectionWordBreaker.cs
- DictionaryMarkupSerializer.cs
- ProfileSettings.cs
- WindowsListViewItem.cs
- DrawingDrawingContext.cs
- WebPartMovingEventArgs.cs
- WhitespaceRuleReader.cs
- TabletDevice.cs
- RootProfilePropertySettingsCollection.cs
- XamlPathDataSerializer.cs
- VisualStateGroup.cs
- LateBoundBitmapDecoder.cs
- DbMetaDataColumnNames.cs
- UIElementCollection.cs
- DivideByZeroException.cs
- DefaultValueAttribute.cs
- SqlTriggerAttribute.cs
- GridViewDeletedEventArgs.cs
- ListViewItemSelectionChangedEvent.cs
- TextViewDesigner.cs
- ExtensibleClassFactory.cs
- SelectingProviderEventArgs.cs
- ToolStripControlHost.cs
- TableParagraph.cs
- GridViewUpdateEventArgs.cs