EncoderExceptionFallback.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. // See the LICENSE file in the project root for more information.
  4. using System;
  5. using System.Runtime.Serialization;
  6. namespace System.Text
  7. {
  8. public sealed class EncoderExceptionFallback : EncoderFallback
  9. {
  10. // Construction
  11. public EncoderExceptionFallback()
  12. {
  13. }
  14. public override EncoderFallbackBuffer CreateFallbackBuffer()
  15. {
  16. return new EncoderExceptionFallbackBuffer();
  17. }
  18. // Maximum number of characters that this instance of this fallback could return
  19. public override int MaxCharCount
  20. {
  21. get
  22. {
  23. return 0;
  24. }
  25. }
  26. public override bool Equals(object value)
  27. {
  28. EncoderExceptionFallback that = value as EncoderExceptionFallback;
  29. if (that != null)
  30. {
  31. return (true);
  32. }
  33. return (false);
  34. }
  35. public override int GetHashCode()
  36. {
  37. return 654;
  38. }
  39. }
  40. public sealed class EncoderExceptionFallbackBuffer : EncoderFallbackBuffer
  41. {
  42. public EncoderExceptionFallbackBuffer() { }
  43. public override bool Fallback(char charUnknown, int index)
  44. {
  45. // Fall back our char
  46. throw new EncoderFallbackException(
  47. SR.Format(SR.Argument_InvalidCodePageConversionIndex, (int)charUnknown, index), charUnknown, index);
  48. }
  49. public override bool Fallback(char charUnknownHigh, char charUnknownLow, int index)
  50. {
  51. if (!char.IsHighSurrogate(charUnknownHigh))
  52. {
  53. throw new ArgumentOutOfRangeException(nameof(charUnknownHigh),
  54. SR.Format(SR.ArgumentOutOfRange_Range, 0xD800, 0xDBFF));
  55. }
  56. if (!char.IsLowSurrogate(charUnknownLow))
  57. {
  58. throw new ArgumentOutOfRangeException(nameof(charUnknownLow),
  59. SR.Format(SR.ArgumentOutOfRange_Range, 0xDC00, 0xDFFF));
  60. }
  61. int iTemp = char.ConvertToUtf32(charUnknownHigh, charUnknownLow);
  62. // Fall back our char
  63. throw new EncoderFallbackException(
  64. SR.Format(SR.Argument_InvalidCodePageConversionIndex, iTemp, index), charUnknownHigh, charUnknownLow, index);
  65. }
  66. public override char GetNextChar()
  67. {
  68. return (char)0;
  69. }
  70. public override bool MovePrevious()
  71. {
  72. // Exception fallback doesn't have anywhere to back up to.
  73. return false;
  74. }
  75. // Exceptions are always empty
  76. public override int Remaining
  77. {
  78. get
  79. {
  80. return 0;
  81. }
  82. }
  83. }
  84. [Serializable]
  85. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  86. public sealed class EncoderFallbackException : ArgumentException
  87. {
  88. private char _charUnknown;
  89. private char _charUnknownHigh;
  90. private char _charUnknownLow;
  91. private int _index;
  92. public EncoderFallbackException()
  93. : base(SR.Arg_ArgumentException)
  94. {
  95. HResult = HResults.COR_E_ARGUMENT;
  96. }
  97. public EncoderFallbackException(string message)
  98. : base(message)
  99. {
  100. HResult = HResults.COR_E_ARGUMENT;
  101. }
  102. public EncoderFallbackException(string message, Exception innerException)
  103. : base(message, innerException)
  104. {
  105. HResult = HResults.COR_E_ARGUMENT;
  106. }
  107. internal EncoderFallbackException(
  108. string message, char charUnknown, int index) : base(message)
  109. {
  110. _charUnknown = charUnknown;
  111. _index = index;
  112. }
  113. internal EncoderFallbackException(
  114. string message, char charUnknownHigh, char charUnknownLow, int index) : base(message)
  115. {
  116. if (!char.IsHighSurrogate(charUnknownHigh))
  117. {
  118. throw new ArgumentOutOfRangeException(nameof(charUnknownHigh),
  119. SR.Format(SR.ArgumentOutOfRange_Range, 0xD800, 0xDBFF));
  120. }
  121. if (!char.IsLowSurrogate(charUnknownLow))
  122. {
  123. throw new ArgumentOutOfRangeException(nameof(CharUnknownLow),
  124. SR.Format(SR.ArgumentOutOfRange_Range, 0xDC00, 0xDFFF));
  125. }
  126. _charUnknownHigh = charUnknownHigh;
  127. _charUnknownLow = charUnknownLow;
  128. _index = index;
  129. }
  130. private EncoderFallbackException(SerializationInfo serializationInfo, StreamingContext streamingContext)
  131. : base(serializationInfo, streamingContext)
  132. {
  133. }
  134. public char CharUnknown
  135. {
  136. get
  137. {
  138. return (_charUnknown);
  139. }
  140. }
  141. public char CharUnknownHigh
  142. {
  143. get
  144. {
  145. return (_charUnknownHigh);
  146. }
  147. }
  148. public char CharUnknownLow
  149. {
  150. get
  151. {
  152. return (_charUnknownLow);
  153. }
  154. }
  155. public int Index
  156. {
  157. get
  158. {
  159. return _index;
  160. }
  161. }
  162. // Return true if the unknown character is a surrogate pair.
  163. public bool IsUnknownSurrogate()
  164. {
  165. return (_charUnknownHigh != '\0');
  166. }
  167. }
  168. }