read() public method

public read ( byte buffer, int pos, int length ) : int
buffer byte
pos int
length int
return int
Beispiel #1
0
 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;
     }
 }
Beispiel #2
0
        private void readTransport()
        {
            lock (reading)
            {
                //EDB.WriteLine("READ - "+transport.poll_set);
                if (dropped)
                {
                    return;
                }
                ScopedTimer.Ping();
                ReadFinishedFunc callback;
                lock (read_callback_mutex)
                    callback = read_callback;
                int size;
                while (!dropped && callback != null)
                {
                    ScopedTimer.Ping();
                    int to_read = read_size - read_filled;
                    if (to_read > 0 && read_buffer == null)
                    {
                        throw new Exception("Trying to read " + to_read + " bytes with a null read_buffer!");
                    }
                    if (callback == null)
                    {
                        lock (read_callback_mutex)
                            callback = read_callback;
                    }
                    if (callback == null)
                    {
                        throw new Exception("Cannot determine which read_callback to invoke?!");
                    }
                    if (to_read > 0)
                    {
                        ScopedTimer.Ping();
                        int bytes_read = transport.read(read_buffer, read_filled, to_read);
                        if (dropped)
                        {
                            if (read_callback == null)
                            {
                                transport.disableRead();
                            }
                            break;
                        }
                        if (bytes_read < 0)
                        {
                            ScopedTimer.Ping();
                            read_callback = null;
                            byte[] buffer = read_buffer;
                            read_buffer = null;
                            size        = read_size;
                            read_size   = 0;
                            read_filled = 0;
#if BEGIN_INVOKE
                            callback.BeginInvoke(this, buffer, size, false, readTransportComplete, callback);
#else
                            if (!callback(this, buffer, size, false))
                            {
                                Console.WriteLine("Callbacks invoked by connection errored");
                            }
                            callback = null;
                            lock (read_callback_mutex)
                                if (read_callback == null)
                                {
                                    transport.disableRead();
                                }
#endif
                            break;
                        }
                        lock (read_callback_mutex)
                            callback = read_callback;
                        read_filled += bytes_read;
                    }
                    else
                    {
                        lock (read_callback_mutex)
                            if (read_callback == null)
                            {
                                transport.disableRead();
                            }
                        break;
                    }
                    if (read_filled == read_size && !dropped)
                    {
                        size = read_size;
                        byte[] buffer = read_buffer;
                        read_buffer = null;
                        lock (read_callback_mutex)
                            read_callback = null;
                        read_size = 0;
#if BEGIN_INVOKE
                        callback.BeginInvoke(this, buffer, size, true, readTransportComplete, callback);
#else
                        if (!callback(this, buffer, size, true))
                        {
                            Console.WriteLine("Callbacks invoked by connection errored");
                        }
                        lock (read_callback_mutex)
                            if (read_callback == null)
                            {
                                transport.disableRead();
                            }
#endif
                        callback = null;
                    }
                    else
                    {
                        lock (read_callback_mutex)
                            if (read_callback == null)
                            {
                                transport.disableRead();
                            }
                        break;
                    }
                }
            }
        }