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