/// <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);
 }