| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | using System;using System.Text;using MECF.Framework.Common.Communications.Tcp.Socket.Framing.Base;namespace MECF.Framework.Common.Communications.Tcp.Socket.Framing{    public class LineDelimiter : IEquatable<LineDelimiter>    {        public static readonly LineDelimiter CRLF = new LineDelimiter("\r\n");        public static readonly LineDelimiter UNIX = new LineDelimiter("\n");        public static readonly LineDelimiter MAC = new LineDelimiter("\r");        public static readonly LineDelimiter WINDOWS = CRLF;        public LineDelimiter(string delimiter)        {            this.DelimiterString = delimiter;            this.DelimiterChars = this.DelimiterString.ToCharArray();            this.DelimiterBytes = Encoding.UTF8.GetBytes(this.DelimiterChars);        }        public string DelimiterString { get; private set; }        public char[] DelimiterChars { get; private set; }        public byte[] DelimiterBytes { get; private set; }        public bool Equals(LineDelimiter other)        {            if (Object.ReferenceEquals(other, null)) return false;            if (Object.ReferenceEquals(this, other)) return true;            return (StringComparer.OrdinalIgnoreCase.Compare(this.DelimiterString, other.DelimiterString) == 0);        }        public override bool Equals(object obj)        {            return this.Equals(obj as LineDelimiter);        }        public override int GetHashCode()        {            return this.DelimiterString.GetHashCode();        }        public override string ToString()        {            return this.DelimiterString;        }    }    public sealed class LineBasedFrameBuilder : FrameBuilder    {        public LineBasedFrameBuilder()            : this(new LineBasedFrameEncoder(), new LineBasedFrameDecoder())        {        }        public LineBasedFrameBuilder(LineDelimiter delimiter)            : this(new LineBasedFrameEncoder(delimiter), new LineBasedFrameDecoder(delimiter))        {        }        public LineBasedFrameBuilder(LineBasedFrameEncoder encoder, LineBasedFrameDecoder decoder)            : base(encoder, decoder)        {        }    }    public sealed class LineBasedFrameEncoder : IFrameEncoder    {        private readonly LineDelimiter _delimiter;        public LineBasedFrameEncoder()            : this(LineDelimiter.CRLF)        {        }        public LineBasedFrameEncoder(LineDelimiter delimiter)        {            if (delimiter == null)                throw new ArgumentNullException("delimiter");            _delimiter = delimiter;        }        public LineDelimiter LineDelimiter { get { return _delimiter; } }        public void EncodeFrame(byte[] payload, int offset, int count, out byte[] frameBuffer, out int frameBufferOffset, out int frameBufferLength)        {            var buffer = new byte[count + _delimiter.DelimiterBytes.Length];            Array.Copy(payload, offset, buffer, 0, count);            Array.Copy(_delimiter.DelimiterBytes, 0, buffer, count, _delimiter.DelimiterBytes.Length);            frameBuffer = buffer;            frameBufferOffset = 0;            frameBufferLength = buffer.Length;        }    }    public sealed class LineBasedFrameDecoder : IFrameDecoder    {        private readonly LineDelimiter _delimiter;        public LineBasedFrameDecoder()            : this(LineDelimiter.CRLF)        {        }        public LineBasedFrameDecoder(LineDelimiter delimiter)        {            if (delimiter == null)                throw new ArgumentNullException("delimiter");            _delimiter = delimiter;        }        public LineDelimiter LineDelimiter { get { return _delimiter; } }        public bool TryDecodeFrame(byte[] buffer, int offset, int count, out int frameLength, out byte[] payload, out int payloadOffset, out int payloadCount)        {            frameLength = 0;            payload = null;            payloadOffset = 0;            payloadCount = 0;            if (count < _delimiter.DelimiterBytes.Length)                return false;            var delimiter = _delimiter.DelimiterBytes;            bool matched = false;            for (int i = 0; i < count; i++)            {                for (int j = 0; j < delimiter.Length; j++)                {                    if (i + j < count && buffer[offset + i + j] == delimiter[j])                    {                        matched = true;                    }                    else                    {                        matched = false;                        break;                    }                }                if (matched)                {                    frameLength = i + delimiter.Length;                    payload = buffer;                    payloadOffset = offset;                    payloadCount = i;                    return true;                }            }            return false;        }    }}
 |