/// <summary>
/// Reads data from the network stream.
/// </summary>
/// <param name="buffer">The buffer to store data to.</param>
/// <param name="offset">The location in the <i>buffer</i> where to start storing the received data.</param>
/// <param name="size">The number of bytes to read.</param>
/// <returns>The number of bytes read from the network stream.</returns>
///
/// <exception cref="System.ObjectDisposedException">
/// The <see cref="BytesRoad.Net.Sockets.NetworkStreamEx"/> object was disposed.
/// </exception>
///
/// <exception cref="System.ArgumentNullException">
/// <i>buffer</i> is a null reference (<b>Nothing</b> in Visual Basic).
/// </exception>
///
/// <exception cref="System.ArgumentOutOfRangeException">
/// <i>offset</i> is less than 0.
/// <para>-or-</para>
/// <i>offset</i> is greater than the length of <i>buffer</i>.
/// <para>-or-</para>
/// <i>size</i> is less than 0.
/// <para>-or-</para>
/// <i>size</i> is greater than the length of <i>buffer</i> minus
/// the value of the <i>offset</i> parameter.
/// </exception>
///
/// <exception cref="System.Net.Sockets.SocketException">
/// An error occurred when attempting to access
/// the socket which is used to complete the requested operation.
/// </exception>
/// <remarks>
/// If no data is available for reading, the <b>Read</b> method will block
/// until data is available. You can use the
/// <see cref="BytesRoad.Net.Sockets.NetworkStreamEx.DataAvailable"/>
/// property to determine if data is available for reading. When
/// <see cref="BytesRoad.Net.Sockets.NetworkStreamEx.DataAvailable"/>
/// is non-zero, retry the receive operation.
/// <para>
/// The <b>Read</b> method will
/// read as much data as specified by <i>size</i> parameter. If
/// the remote host shuts down the
/// <see cref="BytesRoad.Net.Sockets.SocketEx"/>
/// connection with the
/// <see cref="BytesRoad.Net.Sockets.SocketEx.Shutdown"/>
/// method, and all available data has been received, the <b>Read</b> method
/// will complete and return number of bytes was read.
/// </para>
/// <note>
/// The <b>NetworkStreamEx</b> should have access right to read data from the network stream.
/// You may use <see cref="BytesRoad.Net.Sockets.NetworkStreamEx.CanRead"/> property to check this.
/// </note>
/// </remarks>
public override int Read(byte[] buffer, int offset, int size)
{
CheckDisposed();
_asyncCtx.SetProgress(true);
try
{
int read = 0;
int num = 1;
while ((num > 0) && (read < size))
{
num = _socket.Receive(buffer, offset + read, size - read);
read += num;
}
return(read);
}
catch
{
CheckDisposed();
throw;
}
finally
{
_asyncCtx.SetProgress(false);
}
}