internal static FindCriteria ReadXml (XmlReader reader, DiscoveryVersion version)
{
if (reader == null)
throw new ArgumentNullException ("reader");
var ret = new FindCriteria ();
reader.MoveToContent ();
if (!reader.IsStartElement ("Probe", version.Namespace) || reader.IsEmptyElement)
throw new XmlException (String.Format ("Non-empty ProbeType element is expected. Got '{0}' {1} node in namespace '{2}' instead.", reader.LocalName, reader.NodeType, reader.NamespaceURI));
reader.ReadStartElement ("Probe", version.Namespace);
// standard members
reader.MoveToContent ();
if (reader.IsStartElement ("Types", version.Namespace))
ret.ContractTypeNames = new Collection<XmlQualifiedName> ((XmlQualifiedName []) reader.ReadElementContentAs (typeof (XmlQualifiedName []), null, "Types", version.Namespace));
reader.MoveToContent ();
if (reader.IsStartElement ("Types", version.Namespace)) {
if (reader.MoveToAttribute ("MatchBy")) {
ret.ScopeMatchBy = new Uri (reader.Value, UriKind.RelativeOrAbsolute);
reader.MoveToElement ();
}
}
if (reader.IsStartElement ("Scopes", version.Namespace))
ret.Scopes = new Collection<Uri> ((Uri []) reader.ReadElementContentAs (typeof (Uri []), null, "Scopes", version.Namespace));
// non-standard members
for (reader.MoveToContent (); !reader.EOF && reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
if (reader.NamespaceURI == SerializationNS) {
switch (reader.LocalName) {
case "MaxResults":
ret.MaxResults = reader.ReadElementContentAsInt ();
break;
case "Duration":
ret.Duration = (TimeSpan) reader.ReadElementContentAs (typeof (TimeSpan), null);
break;
}
}
else
ret.Extensions.Add (XElement.Load (reader));
}
reader.ReadEndElement ();
return ret;
}