EncoderExceptionFallback.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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.Runtime.Serialization;
  5. namespace System.Text
  6. {
  7. public sealed class EncoderExceptionFallback : EncoderFallback
  8. {
  9. // Construction
  10. public EncoderExceptionFallback()
  11. {
  12. }
  13. public override EncoderFallbackBuffer CreateFallbackBuffer() =>
  14. new EncoderExceptionFallbackBuffer();
  15. // Maximum number of characters that this instance of this fallback could return
  16. public override int MaxCharCount => 0;
  17. public override bool Equals(object? value) =>
  18. value is EncoderExceptionFallback;
  19. public override int GetHashCode() => 654;
  20. }
  21. public sealed class EncoderExceptionFallbackBuffer : EncoderFallbackBuffer
  22. {
  23. public EncoderExceptionFallbackBuffer() { }
  24. public override bool Fallback(char charUnknown, int index)
  25. {
  26. // Fall back our char
  27. throw new EncoderFallbackException(
  28. SR.Format(SR.Argument_InvalidCodePageConversionIndex, (int)charUnknown, index), charUnknown, index);
  29. }
  30. public override bool Fallback(char charUnknownHigh, char charUnknownLow, int index)
  31. {
  32. if (!char.IsHighSurrogate(charUnknownHigh))
  33. {
  34. throw new ArgumentOutOfRangeException(nameof(charUnknownHigh),
  35. SR.Format(SR.ArgumentOutOfRange_Range, 0xD800, 0xDBFF));
  36. }
  37. if (!char.IsLowSurrogate(charUnknownLow))
  38. {
  39. throw new ArgumentOutOfRangeException(nameof(charUnknownLow),
  40. SR.Format(SR.ArgumentOutOfRange_Range, 0xDC00, 0xDFFF));
  41. }
  42. int iTemp = char.ConvertToUtf32(charUnknownHigh, charUnknownLow);
  43. // Fall back our char
  44. throw new EncoderFallbackException(
  45. SR.Format(SR.Argument_InvalidCodePageConversionIndex, iTemp, index), charUnknownHigh, charUnknownLow, index);
  46. }
  47. public override char GetNextChar() => (char)0;
  48. // Exception fallback doesn't have anywhere to back up to.
  49. public override bool MovePrevious() => false;
  50. // Exceptions are always empty
  51. public override int Remaining => 0;
  52. }
  53. [Serializable]
  54. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  55. public sealed class EncoderFallbackException : ArgumentException
  56. {
  57. private readonly char _charUnknown;
  58. private readonly char _charUnknownHigh;
  59. private readonly char _charUnknownLow;
  60. private readonly int _index;
  61. public EncoderFallbackException()
  62. : base(SR.Arg_ArgumentException)
  63. {
  64. HResult = HResults.COR_E_ARGUMENT;
  65. }
  66. public EncoderFallbackException(string? message)
  67. : base(message)
  68. {
  69. HResult = HResults.COR_E_ARGUMENT;
  70. }
  71. public EncoderFallbackException(string? message, Exception? innerException)
  72. : base(message, innerException)
  73. {
  74. HResult = HResults.COR_E_ARGUMENT;
  75. }
  76. internal EncoderFallbackException(
  77. string? message, char charUnknown, int index) : base(message)
  78. {
  79. _charUnknown = charUnknown;
  80. _index = index;
  81. }
  82. internal EncoderFallbackException(
  83. string message, char charUnknownHigh, char charUnknownLow, int index) : base(message)
  84. {
  85. if (!char.IsHighSurrogate(charUnknownHigh))
  86. {
  87. throw new ArgumentOutOfRangeException(nameof(charUnknownHigh),
  88. SR.Format(SR.ArgumentOutOfRange_Range, 0xD800, 0xDBFF));
  89. }
  90. if (!char.IsLowSurrogate(charUnknownLow))
  91. {
  92. throw new ArgumentOutOfRangeException(nameof(CharUnknownLow),
  93. SR.Format(SR.ArgumentOutOfRange_Range, 0xDC00, 0xDFFF));
  94. }
  95. _charUnknownHigh = charUnknownHigh;
  96. _charUnknownLow = charUnknownLow;
  97. _index = index;
  98. }
  99. private EncoderFallbackException(SerializationInfo serializationInfo, StreamingContext streamingContext)
  100. : base(serializationInfo, streamingContext)
  101. {
  102. }
  103. public char CharUnknown => _charUnknown;
  104. public char CharUnknownHigh => _charUnknownHigh;
  105. public char CharUnknownLow => _charUnknownLow;
  106. public int Index => _index;
  107. // Return true if the unknown character is a surrogate pair.
  108. public bool IsUnknownSurrogate() => _charUnknownHigh != '\0';
  109. }
  110. }