12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- using System;
- namespace MECF.Framework.Common.Communications.Tcp.Buffer
- {
- public class SegmentBufferDeflector
- {
- public static void AppendBuffer(
- ISegmentBufferManager bufferManager,
- ref ArraySegment<byte> receiveBuffer,
- int receiveCount,
- ref ArraySegment<byte> sessionBuffer,
- ref int sessionBufferCount)
- {
- if (sessionBuffer.Count < (sessionBufferCount + receiveCount))
- {
- ArraySegment<byte> autoExpandedBuffer = bufferManager.BorrowBuffer();
- if (autoExpandedBuffer.Count < (sessionBufferCount + receiveCount) * 2)
- {
- bufferManager.ReturnBuffer(autoExpandedBuffer);
- autoExpandedBuffer = new ArraySegment<byte>(new byte[(sessionBufferCount + receiveCount) * 2]);
- }
- Array.Copy(sessionBuffer.Array, sessionBuffer.Offset, autoExpandedBuffer.Array, autoExpandedBuffer.Offset, sessionBufferCount);
- var discardBuffer = sessionBuffer;
- sessionBuffer = autoExpandedBuffer;
- bufferManager.ReturnBuffer(discardBuffer);
- }
- Array.Copy(receiveBuffer.Array, receiveBuffer.Offset, sessionBuffer.Array, sessionBuffer.Offset + sessionBufferCount, receiveCount);
- sessionBufferCount = sessionBufferCount + receiveCount;
- }
- public static void ShiftBuffer(
- ISegmentBufferManager bufferManager,
- int shiftStart,
- ref ArraySegment<byte> sessionBuffer,
- ref int sessionBufferCount)
- {
- if ((sessionBufferCount - shiftStart) < shiftStart)
- {
- Array.Copy(sessionBuffer.Array, sessionBuffer.Offset + shiftStart, sessionBuffer.Array, sessionBuffer.Offset, sessionBufferCount - shiftStart);
- sessionBufferCount = sessionBufferCount - shiftStart;
- }
- else
- {
- ArraySegment<byte> copyBuffer = bufferManager.BorrowBuffer();
- if (copyBuffer.Count < (sessionBufferCount - shiftStart))
- {
- bufferManager.ReturnBuffer(copyBuffer);
- copyBuffer = new ArraySegment<byte>(new byte[sessionBufferCount - shiftStart]);
- }
- Array.Copy(sessionBuffer.Array, sessionBuffer.Offset + shiftStart, copyBuffer.Array, copyBuffer.Offset, sessionBufferCount - shiftStart);
- Array.Copy(copyBuffer.Array, copyBuffer.Offset, sessionBuffer.Array, sessionBuffer.Offset, sessionBufferCount - shiftStart);
- sessionBufferCount = sessionBufferCount - shiftStart;
- bufferManager.ReturnBuffer(copyBuffer);
- }
- }
- public static void ReplaceBuffer(
- ISegmentBufferManager bufferManager,
- ref ArraySegment<byte> receiveBuffer,
- ref int receiveBufferOffset,
- int receiveCount)
- {
- if ((receiveBufferOffset + receiveCount) < receiveBuffer.Count)
- {
- receiveBufferOffset = receiveBufferOffset + receiveCount;
- }
- else
- {
- ArraySegment<byte> autoExpandedBuffer = bufferManager.BorrowBuffer();
- if (autoExpandedBuffer.Count < (receiveBufferOffset + receiveCount) * 2)
- {
- bufferManager.ReturnBuffer(autoExpandedBuffer);
- autoExpandedBuffer = new ArraySegment<byte>(new byte[(receiveBufferOffset + receiveCount) * 2]);
- }
- Array.Copy(receiveBuffer.Array, receiveBuffer.Offset, autoExpandedBuffer.Array, autoExpandedBuffer.Offset, receiveBufferOffset + receiveCount);
- receiveBufferOffset = receiveBufferOffset + receiveCount;
- var discardBuffer = receiveBuffer;
- receiveBuffer = autoExpandedBuffer;
- bufferManager.ReturnBuffer(discardBuffer);
- }
- }
- }
- }
|