static void ReadGrantToElement (XmlReader reader, AccessPolicy policy)
{
var v = new GrantTo ();
bool valid = true;
if (reader.HasAttributes || reader.IsEmptyElement) {
reader.Skip ();
return;
}
reader.ReadStartElement ("grant-to", String.Empty);
for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
if (reader.NodeType != XmlNodeType.Element)
throw new XmlException (String.Format ("Unexpected grant-to content: {0}", reader.NodeType));
if (!String.IsNullOrEmpty (reader.NamespaceURI)) {
reader.Skip ();
continue;
}
switch (reader.LocalName) {
case "resource":
var r = CreateResource (reader);
if (r == null)
valid = false;
else
v.Resources.Add (r);
break;
case "socket-resource":
// ignore everything that is not TCP
if (reader.GetAttribute ("protocol") != "tcp")
break;
// we can merge them all together inside a policy
policy.PortMask |= ParsePorts (reader.GetAttribute ("port"));
break;
default:
valid = false;
break;
}
reader.Skip ();
}
if (valid)
policy.GrantedResources.Add (v);
reader.ReadEndElement ();
}