view Xml/XmlResourceResolver.cs @ 119:645e71b9a809

Re #49: XmlResourceResolver fails with HTML DTD on Windows * Rebuild resolver to handle relative and absolute URIs, with absolute mapping to resource ID
author IBBoard <dev@ibboard.co.uk>
date Sat, 01 Sep 2012 11:51:43 +0100
parents e53bf3356914
children 780169621672
line wrap: on
line source

using System;
using System.Xml;
using System.Reflection;
using System.Collections.Generic;
using System.IO;
using System.Net;

namespace IBBoard.Xml
{
	public class XmlResourceResolver : XmlUrlResolver
	{
		private Assembly assm;
		private Dictionary<string, string> relativeToAbsoluteMap = new Dictionary<string, string>();
		private Dictionary<string, string> absoluteToResourceMap = new Dictionary<string, string>();

		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 absoluteUri, string resourceName)
		{
			absoluteToResourceMap[absoluteUri] = resourceName;
		}

		public override Uri ResolveUri(Uri baseUri, string 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;
		}

		public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
		{
			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);
		}
	}
}