167 lines
4.8 KiB
C#
167 lines
4.8 KiB
C#
|
//----------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//----------------------------------------------------------------
|
||
|
namespace System.ServiceModel.Discovery
|
||
|
{
|
||
|
using System;
|
||
|
using System.Collections.ObjectModel;
|
||
|
using System.Runtime;
|
||
|
using System.Xml;
|
||
|
using System.Xml.Linq;
|
||
|
using System.Xml.Schema;
|
||
|
using SR2 = System.ServiceModel.Discovery.SR;
|
||
|
|
||
|
[Fx.Tag.XamlVisible(false)]
|
||
|
public class ResolveCriteria
|
||
|
{
|
||
|
static TimeSpan defaultDuration = TimeSpan.FromSeconds(20);
|
||
|
|
||
|
EndpointAddress endpointAddress;
|
||
|
TimeSpan duration;
|
||
|
NonNullItemCollection<XElement> extensions;
|
||
|
|
||
|
public ResolveCriteria()
|
||
|
: this(new EndpointAddress(EndpointAddress.AnonymousUri))
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public ResolveCriteria(EndpointAddress address)
|
||
|
{
|
||
|
if (address == null)
|
||
|
{
|
||
|
throw FxTrace.Exception.ArgumentNull("address");
|
||
|
}
|
||
|
|
||
|
this.endpointAddress = address;
|
||
|
this.duration = ResolveCriteria.defaultDuration;
|
||
|
}
|
||
|
|
||
|
public EndpointAddress Address
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.endpointAddress;
|
||
|
}
|
||
|
|
||
|
set
|
||
|
{
|
||
|
if (value == null)
|
||
|
{
|
||
|
throw FxTrace.Exception.ArgumentNull("value");
|
||
|
}
|
||
|
|
||
|
this.endpointAddress = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public TimeSpan Duration
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.duration;
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
if (value.CompareTo(TimeSpan.Zero) <= 0)
|
||
|
{
|
||
|
throw FxTrace.Exception.ArgumentOutOfRange("value", value, SR2.DiscoveryResolveDurationLessThanZero);
|
||
|
}
|
||
|
this.duration = value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public Collection<XElement> Extensions
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (this.extensions == null)
|
||
|
{
|
||
|
this.extensions = new NonNullItemCollection<XElement>();
|
||
|
}
|
||
|
|
||
|
return this.extensions;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
[Fx.Tag.Throws(typeof(XmlException), "throws on incorrect xml data")]
|
||
|
internal void ReadFrom(DiscoveryVersion discoveryVersion, XmlReader reader)
|
||
|
{
|
||
|
if (discoveryVersion == null)
|
||
|
{
|
||
|
throw FxTrace.Exception.ArgumentNull("discoveryVersion");
|
||
|
}
|
||
|
if (reader == null)
|
||
|
{
|
||
|
throw FxTrace.Exception.ArgumentNull("reader");
|
||
|
}
|
||
|
|
||
|
reader.MoveToContent();
|
||
|
if (reader.IsEmptyElement)
|
||
|
{
|
||
|
reader.Read();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
int startDepth = reader.Depth;
|
||
|
reader.ReadStartElement();
|
||
|
|
||
|
this.endpointAddress = SerializationUtility.ReadEndpointAddress(discoveryVersion, reader);
|
||
|
|
||
|
this.extensions = null;
|
||
|
this.duration = TimeSpan.MaxValue;
|
||
|
while (true)
|
||
|
{
|
||
|
reader.MoveToContent();
|
||
|
|
||
|
if ((reader.NodeType == XmlNodeType.EndElement) && (reader.Depth == startDepth))
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
else if (reader.IsStartElement(ProtocolStrings.SchemaNames.DurationElement, ProtocolStrings.VersionInternal.Namespace))
|
||
|
{
|
||
|
this.duration = SerializationUtility.ReadDuration(reader);
|
||
|
}
|
||
|
else if (reader.IsStartElement())
|
||
|
{
|
||
|
XElement xElement = XElement.ReadFrom(reader) as XElement;
|
||
|
Extensions.Add(xElement);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
reader.Read();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal void WriteTo(DiscoveryVersion discoveryVersion, XmlWriter writer)
|
||
|
{
|
||
|
if (discoveryVersion == null)
|
||
|
{
|
||
|
throw FxTrace.Exception.ArgumentNull("discoveryVersion");
|
||
|
}
|
||
|
if (writer == null)
|
||
|
{
|
||
|
throw FxTrace.Exception.ArgumentNull("writer");
|
||
|
}
|
||
|
|
||
|
SerializationUtility.WriteEndPointAddress(discoveryVersion, this.endpointAddress, writer);
|
||
|
|
||
|
if (this.duration != TimeSpan.MaxValue)
|
||
|
{
|
||
|
writer.WriteElementString(
|
||
|
ProtocolStrings.SchemaNames.DurationElement,
|
||
|
ProtocolStrings.VersionInternal.Namespace,
|
||
|
XmlConvert.ToString(this.duration));
|
||
|
}
|
||
|
|
||
|
if (this.extensions != null)
|
||
|
{
|
||
|
foreach (XElement xElement in Extensions)
|
||
|
{
|
||
|
xElement.WriteTo(writer);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|