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.
6 using System.Runtime.Serialization;
7 using System.Diagnostics.Contracts;
11 public sealed class EncoderExceptionFallback : EncoderFallback
14 public EncoderExceptionFallback()
18 public override EncoderFallbackBuffer CreateFallbackBuffer()
20 return new EncoderExceptionFallbackBuffer();
23 // Maximum number of characters that this instance of this fallback could return
24 public override int MaxCharCount
32 public override bool Equals(Object value)
34 EncoderExceptionFallback that = value as EncoderExceptionFallback;
42 public override int GetHashCode()
49 public sealed class EncoderExceptionFallbackBuffer : EncoderFallbackBuffer
51 public EncoderExceptionFallbackBuffer() { }
52 public override bool Fallback(char charUnknown, int index)
55 throw new EncoderFallbackException(
56 SR.Format(SR.Argument_InvalidCodePageConversionIndex, (int)charUnknown, index), charUnknown, index);
59 public override bool Fallback(char charUnknownHigh, char charUnknownLow, int index)
61 if (!Char.IsHighSurrogate(charUnknownHigh))
63 throw new ArgumentOutOfRangeException(nameof(charUnknownHigh),
64 SR.Format(SR.ArgumentOutOfRange_Range, 0xD800, 0xDBFF));
66 if (!Char.IsLowSurrogate(charUnknownLow))
68 throw new ArgumentOutOfRangeException(nameof(charUnknownLow),
69 SR.Format(SR.ArgumentOutOfRange_Range, 0xDC00, 0xDFFF));
71 Contract.EndContractBlock();
73 int iTemp = Char.ConvertToUtf32(charUnknownHigh, charUnknownLow);
76 throw new EncoderFallbackException(
77 SR.Format(SR.Argument_InvalidCodePageConversionIndex, iTemp, index), charUnknownHigh, charUnknownLow, index);
80 public override char GetNextChar()
85 public override bool MovePrevious()
87 // Exception fallback doesn't have anywhere to back up to.
91 // Exceptions are always empty
92 public override int Remaining
101 public sealed class EncoderFallbackException : ArgumentException
103 private char _charUnknown;
104 private char _charUnknownHigh;
105 private char _charUnknownLow;
108 public EncoderFallbackException()
109 : base(SR.Arg_ArgumentException)
111 HResult = __HResults.COR_E_ARGUMENT;
114 public EncoderFallbackException(String message)
117 HResult = __HResults.COR_E_ARGUMENT;
120 public EncoderFallbackException(String message, Exception innerException)
121 : base(message, innerException)
123 HResult = __HResults.COR_E_ARGUMENT;
126 internal EncoderFallbackException(
127 String message, char charUnknown, int index) : base(message)
129 _charUnknown = charUnknown;
133 internal EncoderFallbackException(
134 String message, char charUnknownHigh, char charUnknownLow, int index) : base(message)
136 if (!Char.IsHighSurrogate(charUnknownHigh))
138 throw new ArgumentOutOfRangeException(nameof(charUnknownHigh),
139 SR.Format(SR.ArgumentOutOfRange_Range, 0xD800, 0xDBFF));
141 if (!Char.IsLowSurrogate(charUnknownLow))
143 throw new ArgumentOutOfRangeException(nameof(CharUnknownLow),
144 SR.Format(SR.ArgumentOutOfRange_Range, 0xDC00, 0xDFFF));
146 Contract.EndContractBlock();
148 _charUnknownHigh = charUnknownHigh;
149 _charUnknownLow = charUnknownLow;
153 public char CharUnknown
157 return (_charUnknown);
161 public char CharUnknownHigh
165 return (_charUnknownHigh);
169 public char CharUnknownLow
173 return (_charUnknownLow);
185 // Return true if the unknown character is a surrogate pair.
186 public bool IsUnknownSurrogate()
188 return (_charUnknownHigh != '\0');