SegmentBufferDeflector.cs 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. namespace MECF.Framework.Common.Communications.Tcp.Buffer
  3. {
  4. public class SegmentBufferDeflector
  5. {
  6. public static void AppendBuffer(
  7. ISegmentBufferManager bufferManager,
  8. ref ArraySegment<byte> receiveBuffer,
  9. int receiveCount,
  10. ref ArraySegment<byte> sessionBuffer,
  11. ref int sessionBufferCount)
  12. {
  13. if (sessionBuffer.Count < (sessionBufferCount + receiveCount))
  14. {
  15. ArraySegment<byte> autoExpandedBuffer = bufferManager.BorrowBuffer();
  16. if (autoExpandedBuffer.Count < (sessionBufferCount + receiveCount) * 2)
  17. {
  18. bufferManager.ReturnBuffer(autoExpandedBuffer);
  19. autoExpandedBuffer = new ArraySegment<byte>(new byte[(sessionBufferCount + receiveCount) * 2]);
  20. }
  21. Array.Copy(sessionBuffer.Array, sessionBuffer.Offset, autoExpandedBuffer.Array, autoExpandedBuffer.Offset, sessionBufferCount);
  22. var discardBuffer = sessionBuffer;
  23. sessionBuffer = autoExpandedBuffer;
  24. bufferManager.ReturnBuffer(discardBuffer);
  25. }
  26. Array.Copy(receiveBuffer.Array, receiveBuffer.Offset, sessionBuffer.Array, sessionBuffer.Offset + sessionBufferCount, receiveCount);
  27. sessionBufferCount = sessionBufferCount + receiveCount;
  28. }
  29. public static void ShiftBuffer(
  30. ISegmentBufferManager bufferManager,
  31. int shiftStart,
  32. ref ArraySegment<byte> sessionBuffer,
  33. ref int sessionBufferCount)
  34. {
  35. if ((sessionBufferCount - shiftStart) < shiftStart)
  36. {
  37. Array.Copy(sessionBuffer.Array, sessionBuffer.Offset + shiftStart, sessionBuffer.Array, sessionBuffer.Offset, sessionBufferCount - shiftStart);
  38. sessionBufferCount = sessionBufferCount - shiftStart;
  39. }
  40. else
  41. {
  42. ArraySegment<byte> copyBuffer = bufferManager.BorrowBuffer();
  43. if (copyBuffer.Count < (sessionBufferCount - shiftStart))
  44. {
  45. bufferManager.ReturnBuffer(copyBuffer);
  46. copyBuffer = new ArraySegment<byte>(new byte[sessionBufferCount - shiftStart]);
  47. }
  48. Array.Copy(sessionBuffer.Array, sessionBuffer.Offset + shiftStart, copyBuffer.Array, copyBuffer.Offset, sessionBufferCount - shiftStart);
  49. Array.Copy(copyBuffer.Array, copyBuffer.Offset, sessionBuffer.Array, sessionBuffer.Offset, sessionBufferCount - shiftStart);
  50. sessionBufferCount = sessionBufferCount - shiftStart;
  51. bufferManager.ReturnBuffer(copyBuffer);
  52. }
  53. }
  54. public static void ReplaceBuffer(
  55. ISegmentBufferManager bufferManager,
  56. ref ArraySegment<byte> receiveBuffer,
  57. ref int receiveBufferOffset,
  58. int receiveCount)
  59. {
  60. if ((receiveBufferOffset + receiveCount) < receiveBuffer.Count)
  61. {
  62. receiveBufferOffset = receiveBufferOffset + receiveCount;
  63. }
  64. else
  65. {
  66. ArraySegment<byte> autoExpandedBuffer = bufferManager.BorrowBuffer();
  67. if (autoExpandedBuffer.Count < (receiveBufferOffset + receiveCount) * 2)
  68. {
  69. bufferManager.ReturnBuffer(autoExpandedBuffer);
  70. autoExpandedBuffer = new ArraySegment<byte>(new byte[(receiveBufferOffset + receiveCount) * 2]);
  71. }
  72. Array.Copy(receiveBuffer.Array, receiveBuffer.Offset, autoExpandedBuffer.Array, autoExpandedBuffer.Offset, receiveBufferOffset + receiveCount);
  73. receiveBufferOffset = receiveBufferOffset + receiveCount;
  74. var discardBuffer = receiveBuffer;
  75. receiveBuffer = autoExpandedBuffer;
  76. bufferManager.ReturnBuffer(discardBuffer);
  77. }
  78. }
  79. }
  80. }