# Copyright (c) 2012-2014 The CEF Python authors. All rights reserved.
# License: New BSD License.
# Website: http://code.google.com/p/cefpython/
cdef object g_pyWebRequests = weakref.WeakValueDictionary()
cdef int g_webRequestMaxId = 0
# -----------------------------------------------------------------------------
# WebRequest
# -----------------------------------------------------------------------------
# Static methods are not allowed in cdef classes,
# that's why we need a wrapper for PyWebRequest.
class WebRequest:
Status = {
"Unknown": cef_types.UR_UNKNOWN,
"Success": cef_types.UR_SUCCESS,
"Pending": cef_types.UR_IO_PENDING,
"Canceled": cef_types.UR_CANCELED,
"Failed": cef_types.UR_FAILED,
}
def __init__(self):
raise Exception("You cannot instantiate WebRequest directly, "
"use WebRequest.CreateWebRequest() static method")
@staticmethod
def ValidateClient(webRequestClient):
cdef list methods = ["OnRequestComplete", "OnUploadProgress",
"OnDownloadProgress", "OnDownloadData"]
for method in methods:
if webRequestClient and hasattr(webRequestClient, method) \
and callable(getattr(webRequestClient, method)):
# Okay.
continue
else:
raise Exception("WebRequestClient object is missing method: " \
"%s" % method)
@staticmethod
def Create(request, webRequestClient):
if not isinstance(request, PyRequest):
raise Exception("Invalid request object")
WebRequest.ValidateClient(webRequestClient)
return CreatePyWebRequest(request, webRequestClient)
# -----------------------------------------------------------------------------
# PyWebRequest
# -----------------------------------------------------------------------------
cdef PyWebRequest CreatePyWebRequest(PyRequest request,
object webRequestClient):
global g_pyWebRequests
cdef PyWebRequest webRequest = PyWebRequest(request, webRequestClient)
assert webRequest.webRequestId, "webRequest.webRequestId empty"
g_pyWebRequests[webRequest.webRequestId] = webRequest
return webRequest
cdef PyWebRequest GetPyWebRequest(int webRequestId):
global g_pyWebRequests
if webRequestId in g_pyWebRequests:
return g_pyWebRequests[webRequestId]
return None
cdef class PyWebRequest:
cdef object __weakref__ # see g_pyWebRequests
cdef int webRequestId
cdef CefRefPtr[CefURLRequest] cefWebRequest
cdef object pyWebRequestClient
def __init__(self, PyRequest pyRequest, object pyWebRequestClient):
global g_webRequestMaxId
g_webRequestMaxId += 1
self.webRequestId = g_webRequestMaxId
cdef CefRefPtr[WebRequestClient] cppWebRequestClient = (
new WebRequestClient(
self.webRequestId))
self.pyWebRequestClient = pyWebRequestClient
self.cefWebRequest = (CefURLRequest_Create(\
pyRequest.cefRequest, \
(cppWebRequestClient)))
cdef object GetCallback(self, str funcName):
if hasattr(self.pyWebRequestClient, funcName) and (
callable(getattr(self.pyWebRequestClient, funcName))):
return getattr(self.pyWebRequestClient, funcName)
cpdef PyRequest GetRequest(self):
cdef CefRefPtr[CefRequest] cefRequest = \
self.cefWebRequest.get().GetRequest()
cdef PyRequest pyRequest = CreatePyRequest(cefRequest)
return pyRequest
cpdef int GetRequestStatus(self) except *:
return self.cefWebRequest.get().GetRequestStatus()
cpdef int GetRequestError(self) except *:
return self.cefWebRequest.get().GetRequestError()
cpdef PyResponse GetResponse(self):
cdef CefRefPtr[CefResponse] cefResponse = \
self.cefWebRequest.get().GetResponse()
cdef PyResponse pyResponse
# CefResponse may be NULL.
if cefResponse.get():
pyResponse = CreatePyResponse(cefResponse)
return pyResponse
return None
cpdef py_void Cancel(self):
self.cefWebRequest.get().Cancel()
# -----------------------------------------------------------------------------
# WebRequestClient
# -----------------------------------------------------------------------------
cdef public void WebRequestClient_OnUploadProgress(
int webRequestId,
CefRefPtr[CefURLRequest] cefWebRequest,
cef_types.uint64 current,
cef_types.uint64 total
) except * with gil:
cdef PyWebRequest webRequest
cdef object userCallback
try:
webRequest = GetPyWebRequest(webRequestId)
if webRequest:
userCallback = webRequest.GetCallback("OnUploadProgress")
if userCallback:
userCallback(webRequest, current, total)
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public void WebRequestClient_OnDownloadProgress(
int webRequestId,
CefRefPtr[CefURLRequest] cefWebRequest,
cef_types.uint64 current,
cef_types.uint64 total
) except * with gil:
cdef PyWebRequest webRequest
cdef object userCallback
try:
webRequest = GetPyWebRequest(webRequestId)
if webRequest:
userCallback = webRequest.GetCallback("OnDownloadProgress")
if userCallback:
userCallback(webRequest, current, total)
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public void WebRequestClient_OnDownloadData(
int webRequestId,
CefRefPtr[CefURLRequest] cefWebRequest,
const void* data,
size_t dataLength
) except * with gil:
cdef PyWebRequest webRequest
cdef object userCallback
try:
webRequest = GetPyWebRequest(webRequestId)
if webRequest:
userCallback = webRequest.GetCallback("OnDownloadData")
if userCallback:
userCallback(webRequest, VoidPtrToString(data, dataLength))
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)
cdef public void WebRequestClient_OnRequestComplete(
int webRequestId,
CefRefPtr[CefURLRequest] cefWebRequest
) except * with gil:
cdef PyWebRequest webRequest
cdef object userCallback
try:
webRequest = GetPyWebRequest(webRequestId)
if webRequest:
userCallback = webRequest.GetCallback("OnRequestComplete")
if userCallback:
userCallback(webRequest)
except:
(exc_type, exc_value, exc_trace) = sys.exc_info()
sys.excepthook(exc_type, exc_value, exc_trace)