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;
- }
- }
- }
|