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