Microsoft.Azure.Amqp.Transport.TcpTransport.HandleReadComplete C# (CSharp) Method

HandleReadComplete() private method

private HandleReadComplete ( TransportAsyncCallbackArgs args, bool fromCache, bool completedSynchronously ) : void
args TransportAsyncCallbackArgs
fromCache bool
completedSynchronously bool
return void
        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);
            }
        }