WebSocketDataFrameReceiveFilter.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using SuperSocket.Common;
  6. using SuperSocket.SocketBase;
  7. using SuperSocket.SocketBase.Protocol;
  8. using SuperWebSocket.Protocol.FramePartReader;
  9. namespace SuperWebSocket.Protocol
  10. {
  11. class WebSocketDataFrameReceiveFilter : IReceiveFilter<IWebSocketFragment>
  12. {
  13. private WebSocketDataFrame m_Frame;
  14. private IDataFramePartReader m_PartReader;
  15. private int m_LastPartLength = 0;
  16. public int LeftBufferSize
  17. {
  18. get
  19. {
  20. if (m_Frame == null)
  21. return 0;
  22. return m_Frame.InnerData.Count;
  23. }
  24. }
  25. public IReceiveFilter<IWebSocketFragment> NextReceiveFilter
  26. {
  27. get { return this; }
  28. }
  29. public WebSocketDataFrameReceiveFilter()
  30. {
  31. m_Frame = new WebSocketDataFrame(new ArraySegmentList());
  32. m_PartReader = DataFramePartReader.NewReader;
  33. }
  34. protected void AddArraySegment(ArraySegmentList segments, byte[] buffer, int offset, int length, bool toBeCopied)
  35. {
  36. segments.AddSegment(buffer, offset, length, toBeCopied);
  37. }
  38. public IWebSocketFragment Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int left)
  39. {
  40. if (m_Frame == null)
  41. m_Frame = new WebSocketDataFrame(new ArraySegmentList());
  42. this.AddArraySegment(m_Frame.InnerData, readBuffer, offset, length, toBeCopied);
  43. IDataFramePartReader nextPartReader;
  44. int thisLength = m_PartReader.Process(m_LastPartLength, m_Frame, out nextPartReader);
  45. if (thisLength < 0)
  46. {
  47. left = 0;
  48. return null;
  49. }
  50. else
  51. {
  52. left = thisLength;
  53. if (left > 0)
  54. m_Frame.InnerData.TrimEnd(left);
  55. //Means this part reader is the last one
  56. if (nextPartReader == null)
  57. {
  58. m_LastPartLength = 0;
  59. m_PartReader = DataFramePartReader.NewReader;
  60. var frame = m_Frame;
  61. m_Frame = null;
  62. return frame;
  63. }
  64. else
  65. {
  66. m_LastPartLength = m_Frame.InnerData.Count - thisLength;
  67. m_PartReader = nextPartReader;
  68. return null;
  69. }
  70. }
  71. }
  72. public void Reset()
  73. {
  74. m_Frame = null;
  75. }
  76. public FilterState State { get; private set; }
  77. }
  78. }