void HandleReadComplete(TransportAsyncCallbackArgs args, bool fromCache, bool completedSynchronously)
{
ByteBuffer readBuffer = this.receiveEventArgs.UserToken as ByteBuffer;
try
{
if (this.receiveEventArgs.SocketError == SocketError.Success)
{
int bytesCopied = 0;
if (this.receiveEventArgs.IsSegment)
{
bytesCopied = this.receiveEventArgs.BytesTransferred;
Buffer.BlockCopy(this.receiveEventArgs.Buffer, this.receiveEventArgs.Offset,
args.Buffer, args.Offset, bytesCopied);
}
else
{
if (readBuffer != null)
{
int bytesTransferred;
if (fromCache)
{
bytesTransferred = readBuffer.Length;
}
else
{
bytesTransferred = this.receiveEventArgs.BytesTransferred;
readBuffer.Append(bytesTransferred);
if (this.monitor != null)
{
this.receiveEventArgs.ReportRead(this.monitor);
}
}
if (bytesTransferred > 0)
{
if (bytesTransferred <= args.Count)
{
bytesCopied = bytesTransferred;
Buffer.BlockCopy(readBuffer.Buffer, readBuffer.Offset, args.Buffer, args.Offset, bytesTransferred);
readBuffer.Reset();
}
else
{
bytesCopied = args.Count;
Buffer.BlockCopy(readBuffer.Buffer, readBuffer.Offset, args.Buffer, args.Offset, bytesCopied);
readBuffer.Complete(bytesCopied);
}
}
}
else
{
bytesCopied = this.receiveEventArgs.BytesTransferred;
}
}
args.BytesTransfered = bytesCopied;
args.Exception = null;
}
else
{
args.Exception = new SocketException((int)this.receiveEventArgs.SocketError);
}
}
catch (Exception exception)
{
if (Fx.IsFatal(exception))
{
throw;
}
args.Exception = exception;
}
finally
{
if (readBuffer != null)
{
// ref count was incremented when read starts
readBuffer.Dispose();
}
}
args.CompletedSynchronously = completedSynchronously;
try
{
this.receiveEventArgs.Reset();
}
catch (ObjectDisposedException exception)
{
args.Exception = exception;
}
if (!completedSynchronously)
{
args.CompletedCallback(args);
}
}