protected void Execute()
{
bool final, res1, res2, res3;
int code, closeCode;
byte[] closeReasonB;
string closeReason;
bool readRes;
int lastCode = -1;
int lastCode2 = -1;
int errorCode = -1;
MemoryStream messageMemoryStream = new MemoryStream();
MemoryStream fullMessageMemoryStream = new MemoryStream();
if (ConnectionOpen != null) ConnectionOpen(this);
//fFullDataProcess
while (true)
{
readRes = ReadData(out final, out res1, out res2, out res3, out code, messageMemoryStream);
if (readRes)
{
messageMemoryStream.Position = 0;
ProcessData(ref final, ref res1, ref res2, ref res3, ref code, messageMemoryStream);
messageMemoryStream.Position = 0;
errorCode = -1;
// reset the full memory stream if its a new frame
if ((code == WebSocketFrame.Text) || (code == WebSocketFrame.Binary))
{
fullMessageMemoryStream.Position = 0;
fullMessageMemoryStream.SetLength(0);
}
if ((code == WebSocketFrame.Continuation) || (code == WebSocketFrame.Text) || (code == WebSocketFrame.Binary))
{
messageMemoryStream.Position = 0;
fullMessageMemoryStream.Write(messageMemoryStream.GetBuffer(), 0, (int)messageMemoryStream.Length);
messageMemoryStream.Position = 0;
}
switch (code)
{
case WebSocketFrame.Continuation:
if (lastCode == WebSocketFrame.Text)
{
ProcessTextContinuation(final, res1, res2, res3, Encoding.UTF8.GetString(messageMemoryStream.ToArray()));
}
else if (lastCode == WebSocketFrame.Binary)
{
ProcessStreamContinuation(final, res1, res2, res3, messageMemoryStream);
}
else
{
errorCode = WebSocketCloseCode.ProtocolError;
}
if (final) lastCode = -1;
break;
case WebSocketFrame.Text:
ProcessText(final, res1, res2, res3, Encoding.UTF8.GetString(messageMemoryStream.ToArray()));
if (!final) lastCode = code;
else lastCode = -1;
lastCode2 = code;
break;
case WebSocketFrame.Binary:
ProcessStream(final, res1, res2, res3, messageMemoryStream);
if (!final) lastCode = code;
else lastCode = -1;
lastCode2 = code;
break;
case WebSocketFrame.Ping:
ProcessPing(Encoding.UTF8.GetString(messageMemoryStream.ToArray()));
break;
case WebSocketFrame.Pong:
ProcessPong(Encoding.UTF8.GetString(messageMemoryStream.ToArray()));
break;
case WebSocketFrame.Close:
closeCode = WebSocketCloseCode.NoStatus;
closeReason = String.Empty;
if (messageMemoryStream.Length > 1)
{
closeCode = messageMemoryStream.ReadByte() * 256 + messageMemoryStream.ReadByte();
if (messageMemoryStream.Length > 2)
{
closeReasonB = new byte[messageMemoryStream.Length - 2];
messageMemoryStream.Read(closeReasonB, 0, closeReasonB.Length);
closeReason = Encoding.UTF8.GetString(closeReasonB);
}
}
fClosedByPeer = true;
ProcessClose(closeCode, closeReason, true);
if (ConnectionClose != null) ConnectionClose(this, closeCode, closeReason, true);
if ((closeCode == WebSocketCloseCode.Normal) && (!fClosedByMe))
{
Close(WebSocketCloseCode.Normal);
}
else
{
Close();
}
break;
default:
errorCode = WebSocketCloseCode.DataError;
break;
}
if (errorCode == -1)
{
messageMemoryStream.Position = 0;
if (ConnectionRead != null) ConnectionRead(this, final, res1, res2, res3, code, messageMemoryStream);
}
else
{
break;
}
if (((code == WebSocketFrame.Continuation) || (code == WebSocketFrame.Text) || (code == WebSocketFrame.Binary)) && fFullDataProcess && final)
{
fullMessageMemoryStream.Position = 0;
if (lastCode2 == WebSocketFrame.Text)
ProcessTextFull(Encoding.UTF8.GetString(fullMessageMemoryStream.ToArray()));
else if (lastCode2 == WebSocketFrame.Binary)
ProcessStreamFull(fullMessageMemoryStream);
if (ConnectionReadFull != null) ConnectionReadFull(this, lastCode2, fullMessageMemoryStream);
}
}
else
{
errorCode = WebSocketCloseCode.DataError;
break;
}
}
if (errorCode != -1)
{
Close(errorCode, String.Empty);
}
fullMessageMemoryStream.Dispose();
messageMemoryStream.Dispose();
}