From 8abd7219a12afa25bdee55d7ee321abe9f4cef6b Mon Sep 17 00:00:00 2001 From: Tyrrrz Date: Fri, 9 Jul 2021 22:00:31 +0300 Subject: [PATCH] Better shimming in NoPreambleEncoding --- CliFx/Infrastructure/ConsoleWriter.cs | 4 +- CliFx/Utils/NoPreambleEncoding.cs | 99 +++++++++++++++++++++++++-- 2 files changed, 97 insertions(+), 6 deletions(-) diff --git a/CliFx/Infrastructure/ConsoleWriter.cs b/CliFx/Infrastructure/ConsoleWriter.cs index 9748919..4b5ef0f 100644 --- a/CliFx/Infrastructure/ConsoleWriter.cs +++ b/CliFx/Infrastructure/ConsoleWriter.cs @@ -18,7 +18,7 @@ namespace CliFx.Infrastructure /// Initializes an instance of . /// public ConsoleWriter(IConsole console, Stream stream, Encoding encoding) - : base(stream, encoding, 256) + : base(stream, encoding.WithoutPreamble(), 256) { Console = console; } @@ -27,7 +27,7 @@ namespace CliFx.Infrastructure /// Initializes an instance of . /// public ConsoleWriter(IConsole console, Stream stream) - : this(console, stream, System.Console.OutputEncoding.WithoutPreamble()) + : this(console, stream, System.Console.OutputEncoding) { } } diff --git a/CliFx/Utils/NoPreambleEncoding.cs b/CliFx/Utils/NoPreambleEncoding.cs index 5d4ac44..d69b161 100644 --- a/CliFx/Utils/NoPreambleEncoding.cs +++ b/CliFx/Utils/NoPreambleEncoding.cs @@ -6,32 +6,111 @@ namespace CliFx.Utils { // Adapted from: // https://github.com/dotnet/runtime/blob/01b7e73cd378145264a7cb7a09365b41ed42b240/src/libraries/Common/src/System/Text/ConsoleEncoding.cs + // Also see: + // https://source.dot.net/#System.Console/ConsoleEncoding.cs,5eedd083a4a4f4a2 internal class NoPreambleEncoding : Encoding { private readonly Encoding _underlyingEncoding; - public NoPreambleEncoding(Encoding underlyingEncoding) => - _underlyingEncoding = underlyingEncoding; + [ExcludeFromCodeCoverage] + public override string EncodingName => _underlyingEncoding.EncodingName; - public override byte[] GetPreamble() => - Array.Empty(); + [ExcludeFromCodeCoverage] + public override string BodyName => _underlyingEncoding.BodyName; + + [ExcludeFromCodeCoverage] + public override int CodePage => _underlyingEncoding.CodePage; + + [ExcludeFromCodeCoverage] + public override int WindowsCodePage => _underlyingEncoding.WindowsCodePage; + + [ExcludeFromCodeCoverage] + public override string HeaderName => _underlyingEncoding.HeaderName; + + [ExcludeFromCodeCoverage] + public override string WebName => _underlyingEncoding.WebName; + + [ExcludeFromCodeCoverage] + public override bool IsBrowserDisplay => _underlyingEncoding.IsBrowserDisplay; + + [ExcludeFromCodeCoverage] + public override bool IsBrowserSave => _underlyingEncoding.IsBrowserSave; + + [ExcludeFromCodeCoverage] + public override bool IsSingleByte => _underlyingEncoding.IsSingleByte; + + [ExcludeFromCodeCoverage] + public override bool IsMailNewsDisplay => _underlyingEncoding.IsMailNewsDisplay; + + [ExcludeFromCodeCoverage] + public override bool IsMailNewsSave => _underlyingEncoding.IsMailNewsSave; + + public NoPreambleEncoding(Encoding underlyingEncoding) + : base( + underlyingEncoding.CodePage, + underlyingEncoding.EncoderFallback, + underlyingEncoding.DecoderFallback + ) + { + _underlyingEncoding = underlyingEncoding; + } + + // This is the only part that changes + public override byte[] GetPreamble() => Array.Empty(); [ExcludeFromCodeCoverage] public override int GetByteCount(char[] chars, int index, int count) => _underlyingEncoding.GetByteCount(chars, index, count); + [ExcludeFromCodeCoverage] + public override int GetByteCount(char[] chars) => _underlyingEncoding.GetByteCount(chars); + + [ExcludeFromCodeCoverage] + public override int GetByteCount(string s) => _underlyingEncoding.GetByteCount(s); + [ExcludeFromCodeCoverage] public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) => _underlyingEncoding.GetBytes(chars, charIndex, charCount, bytes, byteIndex); + [ExcludeFromCodeCoverage] + public override byte[] GetBytes(char[] chars) => _underlyingEncoding.GetBytes(chars); + + [ExcludeFromCodeCoverage] + public override byte[] GetBytes(char[] chars, int index, int count) => + _underlyingEncoding.GetBytes(chars, index, count); + + [ExcludeFromCodeCoverage] + public override byte[] GetBytes(string s) => _underlyingEncoding.GetBytes(s); + + [ExcludeFromCodeCoverage] + public override int GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex) => + _underlyingEncoding.GetBytes(s, charIndex, charCount, bytes, byteIndex); + [ExcludeFromCodeCoverage] public override int GetCharCount(byte[] bytes, int index, int count) => _underlyingEncoding.GetCharCount(bytes, index, count); + [ExcludeFromCodeCoverage] + public override int GetCharCount(byte[] bytes) => _underlyingEncoding.GetCharCount(bytes); + [ExcludeFromCodeCoverage] public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) => _underlyingEncoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex); + [ExcludeFromCodeCoverage] + public override char[] GetChars(byte[] bytes) => _underlyingEncoding.GetChars(bytes); + + [ExcludeFromCodeCoverage] + public override char[] GetChars(byte[] bytes, int index, int count) => + _underlyingEncoding.GetChars(bytes, index, count); + + [ExcludeFromCodeCoverage] + public override string GetString(byte[] bytes) => _underlyingEncoding.GetString(bytes); + + [ExcludeFromCodeCoverage] + public override string GetString(byte[] bytes, int index, int count) => + _underlyingEncoding.GetString(bytes, index, count); + [ExcludeFromCodeCoverage] public override int GetMaxByteCount(int charCount) => _underlyingEncoding.GetMaxByteCount(charCount); @@ -39,6 +118,18 @@ namespace CliFx.Utils [ExcludeFromCodeCoverage] public override int GetMaxCharCount(int byteCount) => _underlyingEncoding.GetMaxCharCount(byteCount); + + [ExcludeFromCodeCoverage] + public override bool IsAlwaysNormalized(NormalizationForm form) => _underlyingEncoding.IsAlwaysNormalized(form); + + [ExcludeFromCodeCoverage] + public override Encoder GetEncoder() => _underlyingEncoding.GetEncoder(); + + [ExcludeFromCodeCoverage] + public override Decoder GetDecoder() => _underlyingEncoding.GetDecoder(); + + [ExcludeFromCodeCoverage] + public override object Clone() => new NoPreambleEncoding((Encoding) base.Clone()); } internal static class NoPreambleEncodingExtensions