private void on_download_progress(cef_urlrequest_client_t *self, cef_urlrequest_t *request, long current, long total)
        {
            CheckSelf(self);

            var m_request = CefUrlRequest.FromNative(request);

            OnDownloadProgress(m_request, current, total);
        }
        private void on_request_complete(cef_urlrequest_client_t *self, cef_urlrequest_t *request)
        {
            CheckSelf(self);

            var m_request = CefUrlRequest.FromNative(request);

            OnRequestComplete(m_request);
        }
        private void on_download_data(cef_urlrequest_client_t *self, cef_urlrequest_t *request, void *data, UIntPtr data_length)
        {
            CheckSelf(self);

            var m_request = CefUrlRequest.FromNative(request);

            using (var stream = new UnmanagedMemoryStream((byte *)data, (long)data_length))
            {
                OnDownloadData(m_request, stream);
            }
        }
        /// <summary>
        /// Create a new URL request. Only GET, POST, HEAD, DELETE and PUT request
        /// methods are supported. Multiple post data elements are not supported and
        /// elements of type PDE_TYPE_FILE are only supported for requests originating
        /// from the browser process. Requests originating from the render process will
        /// receive the same handling as requests originating from Web content -- if
        /// the response contains Content-Disposition or Mime-Type header values that
        /// would not normally be rendered then the response may receive special
        /// handling inside the browser (for example, via the file download code path
        /// instead of the URL request code path). The |request| object will be marked
        /// as read-only after calling this method. In the browser process if
        /// |request_context| is empty the global request context will be used. In the
        /// render process |request_context| must be empty and the context associated
        /// with the current renderer process' browser will be used.
        /// </summary>
        public static CefUrlRequest Create(CefRequest request, CefUrlRequestClient client, CefRequestContext requestContext)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            var n_request        = request.ToNative();
            var n_client         = client.ToNative();
            var n_requestContext = requestContext != null?requestContext.ToNative() : null;

            return(CefUrlRequest.FromNative(
                       cef_urlrequest_t.create(n_request, n_client, n_requestContext)
                       ));
        }
 /// <summary>
 /// Called when some part of the response is read. |data| contains the current
 /// bytes received since the last call. This method will not be called if the
 /// UR_FLAG_NO_DOWNLOAD_DATA flag is set on the request.
 /// </summary>
 protected abstract void OnDownloadData(CefUrlRequest request, Stream data);
 /// <summary>
 /// Notifies the client of download progress. |current| denotes the number of
 /// bytes received up to the call and |total| is the expected total size of the
 /// response (or -1 if not determined).
 /// </summary>
 protected abstract void OnDownloadProgress(CefUrlRequest request, long current, long total);
 /// <summary>
 /// Notifies the client that the request has completed. Use the
 /// CefURLRequest::GetRequestStatus method to determine if the request was
 /// successful or not.
 /// </summary>
 protected abstract void OnRequestComplete(CefUrlRequest request);