BeginRead() private method

private BeginRead ( HttpWebRequest request, byte buffer, int offset, int size, AsyncCallback cb, object state ) : IAsyncResult
request HttpWebRequest
buffer byte
offset int
size int
cb AsyncCallback
state object
return IAsyncResult
Ejemplo n.º 1
0
        public override IAsyncResult BeginRead(byte [] buffer, int offset, int size,
                                               AsyncCallback cb, object state)
        {
            if (!isRead)
            {
                throw new NotSupportedException("this stream does not allow reading");
            }

            if (buffer == null)
            {
                throw new ArgumentNullException("buffer");
            }

            int length = buffer.Length;

            if (offset < 0 || length < offset)
            {
                throw new ArgumentOutOfRangeException("offset");
            }
            if (size < 0 || (length - offset) < size)
            {
                throw new ArgumentOutOfRangeException("size");
            }

            lock (locker) {
                pendingReads++;
                pending.Reset();
            }

            WebAsyncResult result = new WebAsyncResult(cb, state, buffer, offset, size);

            if (totalRead >= contentLength)
            {
                result.SetCompleted(true, -1);
                result.DoCallback();
                return(result);
            }

            int remaining = readBufferSize - readBufferOffset;

            if (remaining > 0)
            {
                int copy = (remaining > size) ? size : remaining;
                Buffer.BlockCopy(readBuffer, readBufferOffset, buffer, offset, copy);
                readBufferOffset += copy;
                offset           += copy;
                size             -= copy;
                totalRead        += copy;
                if (size == 0 || totalRead >= contentLength)
                {
                    result.SetCompleted(true, copy);
                    result.DoCallback();
                    return(result);
                }
                result.NBytes = copy;
            }

            if (cb != null)
            {
                cb = cb_wrapper;
            }

            if (contentLength != Int32.MaxValue && contentLength - totalRead < size)
            {
                size = contentLength - totalRead;
            }

            if (!read_eof)
            {
                result.InnerAsyncResult = cnc.BeginRead(request, buffer, offset, size, cb, result);
            }
            else
            {
                result.SetCompleted(true, result.NBytes);
                result.DoCallback();
            }
            return(result);
        }
Ejemplo n.º 2
0
        public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback cb, object state)
        {
            if (!isRead)
            {
                throw new NotSupportedException("this stream does not allow reading");
            }
            if (buffer == null)
            {
                throw new ArgumentNullException("buffer");
            }
            int num = buffer.Length;

            if (offset < 0 || num < offset)
            {
                throw new ArgumentOutOfRangeException("offset");
            }
            if (size < 0 || num - offset < size)
            {
                throw new ArgumentOutOfRangeException("size");
            }
            lock (locker)
            {
                pendingReads++;
                pending.Reset();
            }
            WebAsyncResult webAsyncResult = new WebAsyncResult(cb, state, buffer, offset, size);

            if (totalRead >= contentLength)
            {
                webAsyncResult.SetCompleted(synch: true, -1);
                webAsyncResult.DoCallback();
                return(webAsyncResult);
            }
            int num2 = readBufferSize - readBufferOffset;

            if (num2 > 0)
            {
                int num3 = (num2 <= size) ? num2 : size;
                Buffer.BlockCopy(readBuffer, readBufferOffset, buffer, offset, num3);
                readBufferOffset += num3;
                offset           += num3;
                size             -= num3;
                totalRead        += num3;
                if (size == 0 || totalRead >= contentLength)
                {
                    webAsyncResult.SetCompleted(synch: true, num3);
                    webAsyncResult.DoCallback();
                    return(webAsyncResult);
                }
                webAsyncResult.NBytes = num3;
            }
            if (cb != null)
            {
                cb = ReadCallbackWrapper;
            }
            if (contentLength != int.MaxValue && contentLength - totalRead < size)
            {
                size = contentLength - totalRead;
            }
            if (!read_eof)
            {
                webAsyncResult.InnerAsyncResult = cnc.BeginRead(request, buffer, offset, size, cb, webAsyncResult);
            }
            else
            {
                webAsyncResult.SetCompleted(synch: true, webAsyncResult.NBytes);
                webAsyncResult.DoCallback();
            }
            return(webAsyncResult);
        }