/// <summary> /// Shifts the current receiving buffer offset with transferred bytes, /// and reallocates buffer for receiving if necessary. /// </summary> internal void ShiftCurrentReceivingBuffer() { var shift = BytesTransferred; _receivedData.Add(new ArraySegment <byte>(CurrentReceivingBuffer, SocketContext.Offset, shift)); CurrentReceivingBufferOffset += shift; if (CurrentReceivingBufferOffset >= CurrentReceivingBuffer.Length) { // Replace with new buffer. CurrentReceivingBuffer = new byte[CurrentReceivingBuffer.Length]; CurrentReceivingBufferOffset = 0; } // Set new offset and length. SocketContext.SetBuffer(CurrentReceivingBuffer, CurrentReceivingBufferOffset, CurrentReceivingBuffer.Length - CurrentReceivingBufferOffset); }
/// <summary> /// Prepares this instance to send request or notification message. /// </summary> internal void Prepare() { if (messageType == MessageType.Response) { throw new InvalidOperationException("MessageType is not set."); } Contract.Assert(MethodName != null); using (var packer = Packer.Create(methodNameBuffer, false)) { packer.Pack(MethodName); } if (messageType == MessageType.Request) { Contract.Assert(MessageId != null); Contract.Assert(RequestCompletionCallback != null); sendingBuffer[0] = requestHeader; sendingBuffer[1] = GetPackedMessageId(); sendingBuffer[2] = new ArraySegment <byte>(methodNameBuffer.GetBuffer(), 0, unchecked ((int)methodNameBuffer.Length)); sendingBuffer[3] = new ArraySegment <byte>(argumentsBuffer.GetBuffer(), 0, unchecked ((int)argumentsBuffer.Length)); } else { Contract.Assert(NotificationCompletionCallback != null); sendingBuffer[0] = notificationHeader; sendingBuffer[1] = new ArraySegment <byte>(methodNameBuffer.GetBuffer(), 0, unchecked ((int)methodNameBuffer.Length)); sendingBuffer[2] = new ArraySegment <byte>(argumentsBuffer.GetBuffer(), 0, unchecked ((int)argumentsBuffer.Length)); sendingBuffer[3] = emptyBuffer; } SocketContext.SetBuffer(null, 0, 0); SocketContext.BufferList = sendingBuffer; }
/// <summary> /// Prepares socket context array buffer with <see cref="CurrentReceivingBuffer"/> /// </summary> internal void PrepareReceivingBuffer() { SocketContext.SetBuffer(CurrentReceivingBuffer, 0, CurrentReceivingBuffer.Length); }
/// <summary> /// Set internal receiving buffer for testing purposes. /// </summary> /// <param name="data">Data to be set.</param> internal void SetReceivingBuffer(byte[] data) { SocketContext.SetBuffer(data, 0, data.Length); }