From 21f1e95fb8e935134a969bc3d729964d8d2aadfa Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Thu, 14 May 2020 23:06:10 -0400 Subject: rename Irc to IRC --- IRCTokens/StatefulDecoder.cs | 79 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 IRCTokens/StatefulDecoder.cs (limited to 'IRCTokens/StatefulDecoder.cs') diff --git a/IRCTokens/StatefulDecoder.cs b/IRCTokens/StatefulDecoder.cs new file mode 100644 index 0000000..82630f6 --- /dev/null +++ b/IRCTokens/StatefulDecoder.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace IRCTokens +{ + public class StatefulDecoder + { + private byte[] _buffer; + private Encoding _encoding; + private Encoding _fallback; + + public StatefulDecoder() + { + Clear(); + } + + public Encoding Encoding + { + get => _encoding ?? Encoding.GetEncoding(Encoding.UTF8.CodePage, EncoderFallback.ExceptionFallback, + DecoderFallback.ExceptionFallback); + set + { + if (value != null) + _encoding = Encoding.GetEncoding(value.CodePage, EncoderFallback.ExceptionFallback, + DecoderFallback.ReplacementFallback); + } + } + + public Encoding Fallback + { + get => _fallback ?? Encoding.GetEncoding(Encoding.GetEncoding("iso-8859-1").CodePage, + EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback); + set + { + if (value != null) + _fallback = Encoding.GetEncoding(value.CodePage, EncoderFallback.ReplacementFallback, + DecoderFallback.ReplacementFallback); + } + } + + public string Pending => Encoding.GetString(_buffer); + + public void Clear() + { + _buffer = Array.Empty(); + } + + public List Push(string data) + { + var bytes = Encoding.GetBytes(data); + return Push(bytes, bytes.Length); + } + + public List Push(byte[] data, int bytesReceived) + { + if (data == null) return null; + + _buffer = _buffer == null ? Array.Empty() : _buffer.Concat(data.Take(bytesReceived)).ToArray(); + + var listLines = _buffer.Split((byte) '\n').Select(l => l.Trim((byte) '\r')).ToList(); + _buffer = listLines.LastOrDefault() ?? Array.Empty(); + + var decodeLines = new List(); + foreach (var line in listLines.SkipLast(1).Select(l => l.ToArray())) + try + { + decodeLines.Add(new Line(Encoding.GetString(line))); + } + catch (DecoderFallbackException) + { + decodeLines.Add(new Line(Fallback.GetString(line))); + } + + return decodeLines; + } + } +} -- cgit 1.4.1