123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using SuperSocket.Common;
- namespace SuperSocket.SocketBase.Protocol
- {
- /// <summary>
- /// Receive filter base class
- /// </summary>
- /// <typeparam name="TRequestInfo">The type of the request info.</typeparam>
- public abstract class ReceiveFilterBase<TRequestInfo> : IReceiveFilter<TRequestInfo>
- where TRequestInfo : IRequestInfo
- {
- private ArraySegmentList m_BufferSegments;
- /// <summary>
- /// Gets the buffer segments which can help you parse your request info conviniently.
- /// </summary>
- protected ArraySegmentList BufferSegments
- {
- get { return m_BufferSegments; }
- }
- /// <summary>
- /// Initializes a new instance of the <see cref="ReceiveFilterBase<TRequestInfo>"/> class.
- /// </summary>
- protected ReceiveFilterBase()
- {
- m_BufferSegments = new ArraySegmentList();
- }
- /// <summary>
- /// Initializes a new instance of the <see cref="ReceiveFilterBase<TRequestInfo>"/> class.
- /// </summary>
- /// <param name="previousRequestFilter">The previous Receive filter.</param>
- protected ReceiveFilterBase(ReceiveFilterBase<TRequestInfo> previousRequestFilter)
- {
- Initialize(previousRequestFilter);
- }
- /// <summary>
- /// Initializes the specified previous Receive filter.
- /// </summary>
- /// <param name="previousRequestFilter">The previous Receive filter.</param>
- public void Initialize(ReceiveFilterBase<TRequestInfo> previousRequestFilter)
- {
- m_BufferSegments = previousRequestFilter.BufferSegments;
- }
- #region IReceiveFilter<TRequestInfo> Members
- /// <summary>
- /// Filters received data of the specific session into request info.
- /// </summary>
- /// <param name="readBuffer">The read buffer.</param>
- /// <param name="offset">The offset of the current received data in this read buffer.</param>
- /// <param name="length">The length of the current received data.</param>
- /// <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
- /// <param name="rest">The rest, the length of the data which hasn't been parsed.</param>
- /// <returns></returns>
- public abstract TRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest);
- /// <summary>
- /// Gets the size of the rest buffer.
- /// </summary>
- /// <value>
- /// The size of the rest buffer.
- /// </value>
- public int LeftBufferSize
- {
- get { return m_BufferSegments.Count; }
- }
- /// <summary>
- /// Gets or sets the next Receive filter.
- /// </summary>
- /// <value>
- /// The next Receive filter.
- /// </value>
- public IReceiveFilter<TRequestInfo> NextReceiveFilter { get; protected set; }
- #endregion
- /// <summary>
- /// Adds the array segment.
- /// </summary>
- /// <param name="buffer">The buffer.</param>
- /// <param name="offset">The offset.</param>
- /// <param name="length">The length.</param>
- /// <param name="toBeCopied">if set to <c>true</c> [to be copied].</param>
- protected void AddArraySegment(byte[] buffer, int offset, int length, bool toBeCopied)
- {
- m_BufferSegments.AddSegment(buffer, offset, length, toBeCopied);
- }
- /// <summary>
- /// Clears the buffer segments.
- /// </summary>
- protected void ClearBufferSegments()
- {
- m_BufferSegments.ClearSegements();
- }
- /// <summary>
- /// Resets this instance to initial state.
- /// </summary>
- public virtual void Reset()
- {
- if(m_BufferSegments != null && m_BufferSegments.Count > 0)
- m_BufferSegments.ClearSegements();
- }
- /// <summary>
- /// Gets the filter state.
- /// </summary>
- /// <value>
- /// The state.
- /// </value>
- public FilterState State { get; protected set; }
- }
- }
|