EncoderExceptionFallback.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. if (value is EncoderExceptionFallback that)
  29. {
  30. return (true);
  31. }
  32. return (false);
  33. }
  34. public override int GetHashCode()
  35. {
  36. return 654;
  37. }
  38. }
  39. public sealed class EncoderExceptionFallbackBuffer : EncoderFallbackBuffer
  40. {
  41. public EncoderExceptionFallbackBuffer() { }
  42. public override bool Fallback(char charUnknown, int index)
  43. {
  44. // Fall back our char
  45. throw new EncoderFallbackException(
  46. SR.Format(SR.Argument_InvalidCodePageConversionIndex, (int)charUnknown, index), charUnknown, index);
  47. }
  48. public override bool Fallback(char charUnknownHigh, char charUnknownLow, int index)
  49. {
  50. if (!char.IsHighSurrogate(charUnknownHigh))
  51. {
  52. throw new ArgumentOutOfRangeException(nameof(charUnknownHigh),
  53. SR.Format(SR.ArgumentOutOfRange_Range, 0xD800, 0xDBFF));
  54. }
  55. if (!char.IsLowSurrogate(charUnknownLow))
  56. {
  57. throw new ArgumentOutOfRangeException(nameof(charUnknownLow),
  58. SR.Format(SR.ArgumentOutOfRange_Range, 0xDC00, 0xDFFF));
  59. }
  60. int iTemp = char.ConvertToUtf32(charUnknownHigh, charUnknownLow);
  61. // Fall back our char
  62. throw new EncoderFallbackException(
  63. SR.Format(SR.Argument_InvalidCodePageConversionIndex, iTemp, index), charUnknownHigh, charUnknownLow, index);
  64. }
  65. public override char GetNextChar()
  66. {
  67. return (char)0;
  68. }
  69. public override bool MovePrevious()
  70. {
  71. // Exception fallback doesn't have anywhere to back up to.
  72. return false;
  73. }
  74. // Exceptions are always empty
  75. public override int Remaining
  76. {
  77. get
  78. {
  79. return 0;
  80. }
  81. }
  82. }
  83. [Serializable]
  84. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  85. public sealed class EncoderFallbackException : ArgumentException
  86. {
  87. private char _charUnknown;
  88. private char _charUnknownHigh;
  89. private char _charUnknownLow;
  90. private int _index;
  91. public EncoderFallbackException()
  92. : base(SR.Arg_ArgumentException)
  93. {
  94. HResult = HResults.COR_E_ARGUMENT;
  95. }
  96. public EncoderFallbackException(string message)
  97. : base(message)
  98. {
  99. HResult = HResults.COR_E_ARGUMENT;
  100. }
  101. public EncoderFallbackException(string message, Exception innerException)
  102. : base(message, innerException)
  103. {
  104. HResult = HResults.COR_E_ARGUMENT;
  105. }
  106. internal EncoderFallbackException(
  107. string message, char charUnknown, int index) : base(message)
  108. {
  109. _charUnknown = charUnknown;
  110. _index = index;
  111. }
  112. internal EncoderFallbackException(
  113. string message, char charUnknownHigh, char charUnknownLow, int index) : base(message)
  114. {
  115. if (!char.IsHighSurrogate(charUnknownHigh))
  116. {
  117. throw new ArgumentOutOfRangeException(nameof(charUnknownHigh),
  118. SR.Format(SR.ArgumentOutOfRange_Range, 0xD800, 0xDBFF));
  119. }
  120. if (!char.IsLowSurrogate(charUnknownLow))
  121. {
  122. throw new ArgumentOutOfRangeException(nameof(CharUnknownLow),
  123. SR.Format(SR.ArgumentOutOfRange_Range, 0xDC00, 0xDFFF));
  124. }
  125. _charUnknownHigh = charUnknownHigh;
  126. _charUnknownLow = charUnknownLow;
  127. _index = index;
  128. }
  129. private EncoderFallbackException(SerializationInfo serializationInfo, StreamingContext streamingContext)
  130. : base(serializationInfo, streamingContext)
  131. {
  132. }
  133. public char CharUnknown
  134. {
  135. get
  136. {
  137. return (_charUnknown);
  138. }
  139. }
  140. public char CharUnknownHigh
  141. {
  142. get
  143. {
  144. return (_charUnknownHigh);
  145. }
  146. }
  147. public char CharUnknownLow
  148. {
  149. get
  150. {
  151. return (_charUnknownLow);
  152. }
  153. }
  154. public int Index
  155. {
  156. get
  157. {
  158. return _index;
  159. }
  160. }
  161. // Return true if the unknown character is a surrogate pair.
  162. public bool IsUnknownSurrogate()
  163. {
  164. return (_charUnknownHigh != '\0');
  165. }
  166. }
  167. }