Bauglir.Ex.WebSocketConnection.Execute C# (CSharp) Method

Execute() protected method

protected Execute ( ) : void
return void
        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();
        }