private void readTransport()
{
//EDB.WriteLine("READ - "+transport.poll_set);
if (dropped || reading)
{
return;
}
lock (read_mutex)
{
reading = true;
ReadFinishedFunc callback;
uint size;
while (!dropped && read_callback != null)
{
if (read_buffer == null || read_callback == null)
{
throw new Exception("YOU SUCK!");
}
uint to_read = read_size - read_filled;
if (to_read > 0)
{
int bytes_read = transport.read(ref read_buffer, read_filled, to_read);
if (dropped)
{
return;
}
if (bytes_read < 0)
{
callback = read_callback;
read_callback = null;
byte[] buffer = read_buffer;
read_buffer = null;
size = read_size;
read_size = 0;
read_filled = 0;
callback(this, ref buffer, size, false);
break;
}
read_filled += (uint)bytes_read;
}
else
{
break;
}
if (read_filled == read_size && !dropped)
{
callback = read_callback;
size = read_size;
byte[] buffer = read_buffer;
read_buffer = null;
read_callback = null;
read_size = 0;
callback(this, ref buffer, size, true);
}
else
{
break;
}
}
if (read_callback == null)
{
transport.disableRead();
}
reading = false;
}
}