# HG changeset patch # User IBBoard # Date 1346496703 -3600 # Node ID 645e71b9a809053f31546fee7acb922353e9785b # Parent e53bf33569147051e903fafa53c3346213179c9a Re #49: XmlResourceResolver fails with HTML DTD on Windows * Rebuild resolver to handle relative and absolute URIs, with absolute mapping to resource ID diff -r e53bf3356914 -r 645e71b9a809 Xml/XmlResourceResolver.cs --- a/Xml/XmlResourceResolver.cs Fri Aug 31 20:40:30 2012 +0100 +++ b/Xml/XmlResourceResolver.cs Sat Sep 01 11:51:43 2012 +0100 @@ -10,38 +10,40 @@ public class XmlResourceResolver : XmlUrlResolver { private Assembly assm; - private Dictionary relativeToUriMap = new Dictionary(); + private Dictionary relativeToAbsoluteMap = new Dictionary(); + private Dictionary absoluteToResourceMap = new Dictionary(); public XmlResourceResolver(Assembly assembly) { assm = assembly; + } + + public void AddMapping(string relativeUri, string absoluteUri, string resourceName) + { + relativeToAbsoluteMap.Add(relativeUri, absoluteUri); + AddMapping(absoluteUri, resourceName); } - public void AddMapping(string relativeURI, string resourceName) - { - string key = MakeKey(relativeURI); - relativeToUriMap[key] = resourceName; - } - - private string MakeKey(string uri) - { - return "resource:///" + Uri.EscapeUriString(uri); + public void AddMapping(string absoluteUri, string resourceName) + { + absoluteToResourceMap[absoluteUri] = resourceName; } public override Uri ResolveUri(Uri baseUri, string relativeUri) { - Uri resolved; - if (relativeToUriMap.ContainsKey(relativeUri)) - { - resolved = new Uri(MakeKey(relativeUri)); - } - else if (relativeToUriMap.ContainsKey(MakeKey(relativeUri))) - { - resolved = new Uri(relativeUri); - } - else - { - resolved = base.ResolveUri(baseUri, relativeUri); + Uri resolved; + + if (relativeToAbsoluteMap.ContainsKey(relativeUri)) + { + resolved = new Uri(relativeToAbsoluteMap[relativeUri], UriKind.Absolute); + } + else if (absoluteToResourceMap.ContainsKey(relativeUri)) + { + resolved = new Uri(relativeUri, UriKind.Absolute); + } + else + { + resolved = base.ResolveUri(baseUri, relativeUri); } return resolved; @@ -49,28 +51,13 @@ public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn) { - string absoluteUriString = absoluteUri.ToString(); - string key = null; - - if (relativeToUriMap.ContainsKey(absoluteUriString)) - { - key = absoluteUriString; - } - else - { - string createdKey = MakeKey(absoluteUriString); - - if (relativeToUriMap.ContainsKey(createdKey)) - { - key = createdKey; - } - } - - if (key != null) - { - string file = relativeToUriMap[key]; - Stream stream = assm.GetManifestResourceStream(file); - return stream; + string absoluteUriString = absoluteUri == null ? null : absoluteUri.ToString(); + Console.WriteLine("Getting entity " + absoluteUriString); + + if (absoluteToResourceMap.ContainsKey(absoluteUriString)) + { + string file = absoluteToResourceMap[absoluteUriString]; + return assm.GetManifestResourceStream(file); } return base.GetEntity(absoluteUri, role, ofObjectToReturn);