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

ReadData() protected method

protected ReadData ( bool &aReadFinal, bool &aRes1, bool &aRes2, bool &aRes3, int &aReadCode, MemoryStream aStream ) : bool
aReadFinal bool
aRes1 bool
aRes2 bool
aRes3 bool
aReadCode int
aStream System.IO.MemoryStream
return bool
        protected bool ReadData(out bool aReadFinal, out bool aRes1, out bool aRes2, out bool aRes3, out int aReadCode, MemoryStream aStream)
        {
            bool result = true;
            bool mask = false;
            int bt, j, k;
            long len, i;
            int[] masks = new int[4];
            byte[] buffer;
            Stream ns;

            aReadFinal = false;
            aRes1 = false;
            aRes2 = false;
            aRes3 = false;
            aReadCode = -1;
            result = !Closed;
            if (result)
            {

                ns = getStream(fClient);

                ns.ReadTimeout = Timeout.Infinite;
                try
                {
                    result = ReadByte(ns, out bt);
                    ns.ReadTimeout = 10 * 1000;
                    if (result)
                    {
                        //basics
                        aReadFinal = (bt & 0x80) == 0x80;
                        aRes1 = (bt & 0x40) == 0x40;
                        aRes2 = (bt & 0x20) == 0x20;
                        aRes3 = (bt & 0x10) == 0x10;
                        aReadCode = (bt & 0x0f);

                        //mask & length
                        result = ReadByte(ns, out bt);
                        if (result)
                        {
                            mask = (bt & 0x80) == 0x80;
                            len = (bt & 0x7F);
                            if (len == 126)
                            {
                                result = ReadByte(ns, out bt);
                                if (result)
                                {
                                    len = bt * 0x100;
                                    result = ReadByte(ns, out bt);
                                    if (result)
                                    {
                                        len = len + bt;
                                    }
                                }
                            }
                            else if (len == 127)
                            {
                                result = ReadByte(ns, out bt);
                                if (result)
                                {
                                    len = bt * 0x100000000000000;
                                    result = ReadByte(ns, out bt);
                                    if (result)
                                    {
                                        len = len + bt * 0x1000000000000;
                                        result = ReadByte(ns, out bt);
                                    }
                                    if (result)
                                    {
                                        len = len + bt * 0x10000000000;
                                        result = ReadByte(ns, out bt);
                                    }
                                    if (result)
                                    {
                                        len = len + bt * 0x100000000;
                                        result = ReadByte(ns, out bt);
                                    }
                                    if (result)
                                    {
                                        len = len + bt * 0x1000000;
                                        result = ReadByte(ns, out bt);
                                    }
                                    if (result)
                                    {
                                        len = len + bt * 0x10000;
                                        result = ReadByte(ns, out bt);
                                    }
                                    if (result)
                                    {
                                        len = len + bt * 0x100;
                                        result = ReadByte(ns, out bt);
                                    }
                                    if (result)
                                    {
                                        len = len + bt;
                                    }
                                }
                            }

                            if ((result) && (fRequireMask) && (!mask))
                            {
                                Close(WebSocketCloseCode.ProtocolError);
                                result = false;
                            }

                            //read mask
                            if (result && mask)
                            {
                                result = ReadByte(ns, out masks[0]);
                                if (result) result = ReadByte(ns, out masks[1]);
                                if (result) result = ReadByte(ns, out masks[2]);
                                if (result) result = ReadByte(ns, out masks[3]);
                            }

                            if (result)
                            {
                                aStream.SetLength(0);
                                aStream.Position = 0;
                                ns.ReadTimeout = 1000 * 60 * 60 * 2;
                                buffer = new byte[len];
                                j = 0;
                                while (len > 0)
                                {
                                    k = ns.Read(buffer, j, (int)Math.Min(len, (long)System.Int32.MaxValue));
                                    j += k;
                                    len -= k;
                                }
                                if (mask)
                                {
                                    for (i = 0; i < buffer.Length; i++)
                                    {
                                        buffer[i] = (byte)(buffer[i] ^ masks[i % 4]);
                                    }
                                }
                                aStream.Write(buffer, 0, buffer.Length);
                                aStream.Position = 0;
                            }
                        }
                    }
                }
                catch
                {
                    result = false;
                }
            }

            return result;
        }