XmlUrlResolver.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // System.Xml.XmlUrlResolver.cs
  2. //
  3. // Author: Duncan Mak ([email protected])
  4. // Atsushi Enomoto ([email protected])
  5. //
  6. // (C) Ximian, Inc.
  7. //
  8. using System.Net;
  9. using System.IO;
  10. using System.Text;
  11. using Mono.Xml.Native;
  12. namespace System.Xml
  13. {
  14. public class XmlUrlResolver : XmlResolver
  15. {
  16. // Field
  17. ICredentials credential;
  18. WebClient webClientInternal;
  19. WebClient webClient {
  20. get {
  21. if (webClientInternal == null)
  22. webClientInternal = new WebClient ();
  23. return webClientInternal;
  24. }
  25. }
  26. // Constructor
  27. public XmlUrlResolver ()
  28. : base ()
  29. {
  30. }
  31. // Properties
  32. public override ICredentials Credentials
  33. {
  34. set { credential = value; }
  35. }
  36. // Methods
  37. [MonoTODO("Use Credentials; Uri must be absolute.")]
  38. public override object GetEntity (Uri absoluteUri, string role, Type ofObjectToReturn)
  39. {
  40. if (absoluteUri.Scheme == "file")
  41. return new FileStream (absoluteUri.LocalPath, FileMode.Open, FileAccess.Read, FileShare.Read);
  42. // (MS documentation says) parameter role isn't used yet.
  43. Stream s = null;
  44. using (s) {
  45. WebClient wc = new WebClient ();
  46. // wc.Credentials = credential;
  47. s = wc.OpenRead (absoluteUri.ToString ());
  48. if (s.GetType ().IsSubclassOf (ofObjectToReturn))
  49. return s;
  50. wc.Dispose ();
  51. }
  52. return null;
  53. }
  54. public override Uri ResolveUri (Uri baseUri, string relativeUri)
  55. {
  56. // Don't expect baseUri is not null here.
  57. // if (relativeUri == null)
  58. // return baseUri;
  59. if (baseUri == null) {
  60. // Don't ignore such case that relativeUri is in fact absolute uri.
  61. // return new Uri (Path.GetFullPath (relativeUri));
  62. // extraneous "/a" is required because current Uri stuff
  63. // seems ignorant of difference between "." and "./".
  64. // I'd be appleciate if it is fixed with better solution.
  65. return new Uri (new Uri (Path.GetFullPath ("./a")), relativeUri);
  66. }
  67. // Do not expect relativeUri.Length > 2.
  68. // if (relativeUri.IndexOf ("://") >= 0)
  69. // return new Uri (relativeUri);
  70. if (relativeUri == null)
  71. return baseUri;
  72. return new Uri (baseUri, relativeUri);
  73. }
  74. }
  75. }