System.Net.WebClient.DownloadBitsState.RetrieveBytes C# (CSharp) Method

RetrieveBytes() private method

private RetrieveBytes ( int &bytesRetrieved ) : bool
bytesRetrieved int
return bool
            internal bool RetrieveBytes(ref int bytesRetrieved) {
                if (bytesRetrieved > 0) {
                    if (WriteStream != null) {
                        WriteStream.Write(InnerBuffer, 0, bytesRetrieved);
                    } else {
                        SgBuffers.Write(InnerBuffer, 0, bytesRetrieved);
                    }

                    if (Async)
                        Progress.BytesReceived += bytesRetrieved;

                    if (Offset != ContentLength) {
                        if (Async) {
                            WebClient.PostProgressChanged(AsyncOp, Progress);
                            ReadStream.BeginRead(InnerBuffer, Offset, (int)Length-Offset, new AsyncCallback(DownloadBitsReadCallback), this);
                        } else {
                            bytesRetrieved = ReadStream.Read(InnerBuffer, Offset, (int)Length-Offset);
                        }
                        return false;
                    }
                }

                // Final change notification
                if (Async)
                {
                    if (Progress.TotalBytesToReceive < 0)
                        Progress.TotalBytesToReceive = Progress.BytesReceived;
                    WebClient.PostProgressChanged(AsyncOp, Progress);
                }

                // completed here
                if (ReadStream != null)
                    ReadStream.Close();
                if (WriteStream != null) {
                    WriteStream.Close();
                } else {
                    if (WriteStream == null) { // We are using Scatter-Gather buffers
                        byte[] newbuf = new byte[SgBuffers.Length];
                        if (SgBuffers.Length > 0) {
                            BufferOffsetSize[] bufferArray = SgBuffers.GetBuffers();
                            int newBufOffset = 0;
                            for (int i=0; i<bufferArray.Length; i++)
                            {
                                BufferOffsetSize bufferOffsetSize = bufferArray[i];
                                Buffer.BlockCopy(bufferOffsetSize.Buffer, 0, newbuf, newBufOffset, bufferOffsetSize.Size);
                                newBufOffset += bufferOffsetSize.Size;
                            }
                        } 
                        InnerBuffer = newbuf;
                    }
                }
                // do callback now
                return true;
            }