protected override void ProcessAction_IndicateReceiveComplete(
Nullable<ArraySegment<byte>> buffer,
WebSocketProtocolComponent.BufferType bufferType,
WebSocketProtocolComponent.Action action,
Interop.WebSocket.Buffer[] dataBuffers,
uint dataBufferCount,
IntPtr actionContext)
{
Debug.Assert(buffer != null, "'buffer MUST NOT be NULL.");
int bytesTransferred = 0;
_pongReceived = false;
if (bufferType == WebSocketProtocolComponent.BufferType.PingPong)
{
// ignoring received pong frame
_pongReceived = true;
WebSocketProtocolComponent.WebSocketCompleteAction(_webSocket,
actionContext,
bytesTransferred);
return;
}
WebSocketReceiveResult receiveResult;
try
{
ArraySegment<byte> payload;
WebSocketMessageType messageType = GetMessageType(bufferType);
int newReceiveState = ReceiveState.Idle;
if (bufferType == WebSocketProtocolComponent.BufferType.Close)
{
payload = WebSocketValidate.EmptyPayload;
string reason;
WebSocketCloseStatus closeStatus;
_webSocket._internalBuffer.ConvertCloseBuffer(action, dataBuffers[0], out closeStatus, out reason);
receiveResult = new WebSocketReceiveResult(bytesTransferred,
messageType, true, closeStatus, reason);
}
else
{
payload = _webSocket._internalBuffer.ConvertNativeBuffer(action, dataBuffers[0], bufferType);
bool endOfMessage = bufferType ==
WebSocketProtocolComponent.BufferType.BinaryMessage ||
bufferType == WebSocketProtocolComponent.BufferType.UTF8Message ||
bufferType == WebSocketProtocolComponent.BufferType.Close;
if (payload.Count > buffer.Value.Count)
{
_webSocket._internalBuffer.BufferPayload(payload, buffer.Value.Count, messageType, endOfMessage);
newReceiveState = ReceiveState.PayloadAvailable;
endOfMessage = false;
}
bytesTransferred = Math.Min(payload.Count, (int)buffer.Value.Count);
if (bytesTransferred > 0)
{
Buffer.BlockCopy(payload.Array,
payload.Offset,
buffer.Value.Array,
buffer.Value.Offset,
bytesTransferred);
}
receiveResult = new WebSocketReceiveResult(bytesTransferred, messageType, endOfMessage);
}
_webSocket.UpdateReceiveState(newReceiveState, _receiveState);
}
finally
{
WebSocketProtocolComponent.WebSocketCompleteAction(_webSocket,
actionContext,
bytesTransferred);
}
ReceiveResult = receiveResult;
}
}