//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ /* * IAsyncResult for asynchronous read. * * Copyright (c) 2010 Microsoft Corporation */ namespace System.Web.Hosting { using System; using System.Threading; using System.Web.Util; internal class ReadAsyncResult : AsyncResultBase { private int _bytesRead; private byte[] _buffer; private int _offset; private int _count; private bool _updatePerfCounter; internal ReadAsyncResult(AsyncCallback cb, Object state, byte[] buffer, int offset, int count, bool updatePerfCounter): base(cb, state) { _buffer = buffer; _offset = offset; _count = count; _updatePerfCounter = updatePerfCounter; } internal override void Complete(int bytesRead, int hresult, IntPtr pbAsyncReceiveBuffer, bool synchronous) { if (_updatePerfCounter && bytesRead > 0) { PerfCounters.IncrementCounterEx(AppPerfCounter.REQUEST_BYTES_IN, bytesRead); } if (bytesRead != 0) { CopyBytes(pbAsyncReceiveBuffer, bytesRead); } _bytesRead = bytesRead; Complete(hresult, synchronous); } private unsafe void CopyBytes(IntPtr pbAsyncReceiveBuffer, int bytesRead) { byte * src = ((byte *)pbAsyncReceiveBuffer); fixed (byte * dst = _buffer) { StringUtil.memcpyimpl(src, dst + _offset, bytesRead); } } internal int BytesRead { get { return _bytesRead; } set { _bytesRead = value; } } } }