PrefixHandle.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.Xml
  5. {
  6. using System.Runtime;
  7. enum PrefixHandleType
  8. {
  9. Empty,
  10. A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
  11. Buffer,
  12. Max,
  13. }
  14. class PrefixHandle
  15. {
  16. XmlBufferReader bufferReader;
  17. PrefixHandleType type;
  18. int offset;
  19. int length;
  20. static string[] prefixStrings = { "", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
  21. static byte[] prefixBuffer = { (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z' };
  22. public PrefixHandle(XmlBufferReader bufferReader)
  23. {
  24. this.bufferReader = bufferReader;
  25. }
  26. public void SetValue(PrefixHandleType type)
  27. {
  28. Fx.Assert(type != PrefixHandleType.Buffer, "");
  29. this.type = type;
  30. }
  31. public void SetValue(PrefixHandle prefix)
  32. {
  33. this.type = prefix.type;
  34. this.offset = prefix.offset;
  35. this.length = prefix.length;
  36. }
  37. public void SetValue(int offset, int length)
  38. {
  39. if (length == 0)
  40. {
  41. SetValue(PrefixHandleType.Empty);
  42. return;
  43. }
  44. if (length == 1)
  45. {
  46. byte ch = bufferReader.GetByte(offset);
  47. if (ch >= 'a' && ch <= 'z')
  48. {
  49. SetValue(GetAlphaPrefix(ch - 'a'));
  50. return;
  51. }
  52. }
  53. this.type = PrefixHandleType.Buffer;
  54. this.offset = offset;
  55. this.length = length;
  56. }
  57. public bool IsEmpty
  58. {
  59. get
  60. {
  61. return type == PrefixHandleType.Empty;
  62. }
  63. }
  64. public bool IsXmlns
  65. {
  66. get
  67. {
  68. if (type != PrefixHandleType.Buffer)
  69. return false;
  70. if (this.length != 5)
  71. return false;
  72. byte[] buffer = bufferReader.Buffer;
  73. int offset = this.offset;
  74. return buffer[offset + 0] == 'x' &&
  75. buffer[offset + 1] == 'm' &&
  76. buffer[offset + 2] == 'l' &&
  77. buffer[offset + 3] == 'n' &&
  78. buffer[offset + 4] == 's';
  79. }
  80. }
  81. public bool IsXml
  82. {
  83. get
  84. {
  85. if (type != PrefixHandleType.Buffer)
  86. return false;
  87. if (this.length != 3)
  88. return false;
  89. byte[] buffer = bufferReader.Buffer;
  90. int offset = this.offset;
  91. return buffer[offset + 0] == 'x' &&
  92. buffer[offset + 1] == 'm' &&
  93. buffer[offset + 2] == 'l';
  94. }
  95. }
  96. public bool TryGetShortPrefix(out PrefixHandleType type)
  97. {
  98. type = this.type;
  99. return (type != PrefixHandleType.Buffer);
  100. }
  101. public static string GetString(PrefixHandleType type)
  102. {
  103. Fx.Assert(type != PrefixHandleType.Buffer, "");
  104. return prefixStrings[(int)type];
  105. }
  106. public static PrefixHandleType GetAlphaPrefix(int index)
  107. {
  108. Fx.Assert(index >= 0 && index < 26, "");
  109. return (PrefixHandleType)(PrefixHandleType.A + index);
  110. }
  111. public static byte[] GetString(PrefixHandleType type, out int offset, out int length)
  112. {
  113. Fx.Assert(type != PrefixHandleType.Buffer, "");
  114. if (type == PrefixHandleType.Empty)
  115. {
  116. offset = 0;
  117. length = 0;
  118. }
  119. else
  120. {
  121. length = 1;
  122. offset = (int)(type - PrefixHandleType.A);
  123. }
  124. return prefixBuffer;
  125. }
  126. public string GetString(XmlNameTable nameTable)
  127. {
  128. PrefixHandleType type = this.type;
  129. if (type != PrefixHandleType.Buffer)
  130. return GetString(type);
  131. else
  132. return bufferReader.GetString(offset, length, nameTable);
  133. }
  134. public string GetString()
  135. {
  136. PrefixHandleType type = this.type;
  137. if (type != PrefixHandleType.Buffer)
  138. return GetString(type);
  139. else
  140. return bufferReader.GetString(offset, length);
  141. }
  142. public byte[] GetString(out int offset, out int length)
  143. {
  144. PrefixHandleType type = this.type;
  145. if (type != PrefixHandleType.Buffer)
  146. return GetString(type, out offset, out length);
  147. else
  148. {
  149. offset = this.offset;
  150. length = this.length;
  151. return bufferReader.Buffer;
  152. }
  153. }
  154. public int CompareTo(PrefixHandle that)
  155. {
  156. return GetString().CompareTo(that.GetString());
  157. }
  158. bool Equals2(PrefixHandle prefix2)
  159. {
  160. PrefixHandleType type1 = this.type;
  161. PrefixHandleType type2 = prefix2.type;
  162. if (type1 != type2)
  163. return false;
  164. if (type1 != PrefixHandleType.Buffer)
  165. return true;
  166. if (this.bufferReader == prefix2.bufferReader)
  167. return bufferReader.Equals2(this.offset, this.length, prefix2.offset, prefix2.length);
  168. else
  169. return bufferReader.Equals2(this.offset, this.length, prefix2.bufferReader, prefix2.offset, prefix2.length);
  170. }
  171. bool Equals2(string prefix2)
  172. {
  173. PrefixHandleType type = this.type;
  174. if (type != PrefixHandleType.Buffer)
  175. return GetString(type) == prefix2;
  176. return bufferReader.Equals2(this.offset, this.length, prefix2);
  177. }
  178. bool Equals2(XmlDictionaryString prefix2)
  179. {
  180. return Equals2(prefix2.Value);
  181. }
  182. static public bool operator ==(PrefixHandle prefix1, string prefix2)
  183. {
  184. return prefix1.Equals2(prefix2);
  185. }
  186. static public bool operator !=(PrefixHandle prefix1, string prefix2)
  187. {
  188. return !prefix1.Equals2(prefix2);
  189. }
  190. static public bool operator ==(PrefixHandle prefix1, XmlDictionaryString prefix2)
  191. {
  192. return prefix1.Equals2(prefix2);
  193. }
  194. static public bool operator !=(PrefixHandle prefix1, XmlDictionaryString prefix2)
  195. {
  196. return !prefix1.Equals2(prefix2);
  197. }
  198. static public bool operator ==(PrefixHandle prefix1, PrefixHandle prefix2)
  199. {
  200. return prefix1.Equals2(prefix2);
  201. }
  202. static public bool operator !=(PrefixHandle prefix1, PrefixHandle prefix2)
  203. {
  204. return !prefix1.Equals2(prefix2);
  205. }
  206. public override bool Equals(object obj)
  207. {
  208. PrefixHandle that = obj as PrefixHandle;
  209. if (object.ReferenceEquals(that, null))
  210. return false;
  211. return this == that;
  212. }
  213. public override string ToString()
  214. {
  215. return GetString();
  216. }
  217. public override int GetHashCode()
  218. {
  219. return GetString().GetHashCode();
  220. }
  221. }
  222. }