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;
}