static public ICrossDomainPolicy FromStream (Stream stream)
{
ClientAccessPolicy cap = new ClientAccessPolicy ();
// Silverlight accepts whitespaces before the XML - which is invalid XML
StreamReader sr = new StreamReader (stream);
while (Char.IsWhiteSpace ((char) sr.Peek ()))
sr.Read ();
XmlReaderSettings policy_settings = new XmlReaderSettings ();
policy_settings.DtdProcessing = DtdProcessing.Ignore;
using (XmlReader reader = XmlReader.Create (sr, policy_settings)) {
reader.MoveToContent ();
if (reader.IsEmptyElement) {
reader.Skip ();
return null;
}
reader.ReadStartElement ("access-policy", String.Empty);
for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
if (reader.NodeType != XmlNodeType.Element)
throw new XmlException (String.Format ("Unexpected access-policy content: {0}", reader.NodeType));
if ((reader.LocalName != "cross-domain-access") || reader.IsEmptyElement) {
reader.Skip ();
continue;
}
reader.ReadStartElement ("cross-domain-access", String.Empty);
for (reader.MoveToContent (); reader.NodeType != XmlNodeType.EndElement; reader.MoveToContent ()) {
if (reader.NodeType != XmlNodeType.Element)
throw new XmlException (String.Format ("Unexpected access-policy content: {0}", reader.NodeType));
if ((reader.Name != "policy") || reader.IsEmptyElement) {
reader.Skip ();
continue;
}
ReadPolicyElement (reader, cap);
}
reader.ReadEndElement ();
}
reader.ReadEndElement ();
}
return cap;
}