namespace Cef3 { using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; using Cef3.Interop; using System.IO; /// /// Interface that should be implemented by the CefURLRequest client. The /// methods of this class will be called on the same thread that created the /// request unless otherwise documented. /// public abstract unsafe partial class CefUrlRequestClient { 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); } /// /// Notifies the client that the request has completed. Use the /// CefURLRequest::GetRequestStatus method to determine if the request was /// successful or not. /// protected abstract void OnRequestComplete(CefUrlRequest request); private void on_upload_progress(cef_urlrequest_client_t* self, cef_urlrequest_t* request, long current, long total) { CheckSelf(self); var m_request = CefUrlRequest.FromNative(request); OnUploadProgress(m_request, current, total); } /// /// Notifies the client of upload progress. |current| denotes the number of /// bytes sent so far and |total| is the total size of uploading data (or -1 if /// chunked upload is enabled). This method will only be called if the /// UR_FLAG_REPORT_UPLOAD_PROGRESS flag is set on the request. /// protected abstract void OnUploadProgress(CefUrlRequest request, long current, long total); 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); } /// /// 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). /// protected abstract void OnDownloadProgress(CefUrlRequest request, long current, long total); 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); } } /// /// 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. /// protected abstract void OnDownloadData(CefUrlRequest request, Stream data); private int get_auth_credentials(cef_urlrequest_client_t* self, int isProxy, cef_string_t* host, int port, cef_string_t* realm, cef_string_t* scheme, cef_auth_callback_t* callback) { CheckSelf(self); var m_isProxy = isProxy != 0; var m_host = cef_string_t.ToString(host); var m_realm = cef_string_t.ToString(realm); var m_scheme = cef_string_t.ToString(scheme); var m_callback = CefAuthCallback.FromNative(callback); var m_result = GetAuthCredentials(m_isProxy, m_host, port, m_realm, m_scheme, m_callback); return m_result ? 1 : 0; } /// /// Called on the IO thread when the browser needs credentials from the user. /// |isProxy| indicates whether the host is a proxy server. |host| contains the /// hostname and |port| contains the port number. Return true to continue the /// request and call CefAuthCallback::Continue() when the authentication /// information is available. Return false to cancel the request. This method /// will only be called for requests initiated from the browser process. /// protected virtual bool GetAuthCredentials(bool isProxy, string host, int port, string realm, string scheme, CefAuthCallback callback) { return false; } } }