[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/pythonthings/cefpython/v31.2/cefpython/download_handler.pyx [Back]  [Original]

# Copyright (c) 2012-2014 The CEF Python authors. All rights reserved.
# License: New BSD License.
# Website: http://code.google.com/p/cefpython/

# ------------------------------------------------------------------------------
# Globals
# ------------------------------------------------------------------------------

cdef object g_userDownloadHandlers = weakref.WeakValueDictionary()
cdef int g_userDownloadHandlerMaxId = 0

# ------------------------------------------------------------------------------
# PyDownloadHandler
# ------------------------------------------------------------------------------

cdef CefRefPtr[CefDownloadHandler] StoreUserDownloadHandler(
        object userDownloadHandler) except *:
    ValidateUserDownloadHandler(userDownloadHandler)
    global g_userDownloadHandlerMaxId
    global g_userDownloadHandlers
    g_userDownloadHandlerMaxId += 1
    g_userDownloadHandlers[g_userDownloadHandlerMaxId] = userDownloadHandler
    cdef CefRefPtr[CefDownloadHandler] downloadHandler = (
            new DownloadHandler(
                    g_userDownloadHandlerMaxId))
    return downloadHandler

cdef object GetPyDownloadHandler(int downloadHandlerId):
    global g_userDownloadHandlers
    cdef object userDownloadHandler
    cdef PyDownloadHandler pyDownloadHandler
    if downloadHandlerId in g_userDownloadHandlers:
        userDownloadHandler = g_userDownloadHandlers[downloadHandlerId]
        pyDownloadHandler = PyDownloadHandler(userDownloadHandler)
        return pyDownloadHandler

cdef void ValidateUserDownloadHandler(object handler) except *:
    assert handler, "DownloadHandler is empty"
    has_OnData = hasattr(handler, "OnData") and (
            callable(getattr(handler, "OnData")))
    has_OnComplete = hasattr(handler, "OnComplete") and (
            callable(getattr(handler, "OnComplete")))
    assert has_OnData, "DownloadHandler is missing OnData() method"
    assert has_OnComplete, "DownloadHandler is missing OnComplete() method"

cdef class PyDownloadHandler:
    cdef object userDownloadHandler

    def __init__(self, object userDownloadHandler):
        assert not isinstance(userDownloadHandler, int), (
                "DownloadHandler is not a valid object")
        self.userDownloadHandler = userDownloadHandler

    cdef object GetCallback(self, str funcName):
        if self.userDownloadHandler and (
                hasattr(self.userDownloadHandler, funcName) and (
                callable(getattr(self.userDownloadHandler, funcName)))):
            return getattr(self.userDownloadHandler, funcName)

# ------------------------------------------------------------------------------
# C++ DownloadHandler
# ------------------------------------------------------------------------------

cdef public cpp_bool DownloadHandler_ReceivedData(
        int downloadHandlerId,
        void* data,
        int data_size
        ) except * with gil:
    cdef PyDownloadHandler pyDownloadHandler
    cdef object callback
    cdef py_bool ret
    try:
        assert IsThread(TID_UI), "Must be called on the UI thread"
        pyDownloadHandler = GetPyDownloadHandler(downloadHandlerId)
        if pyDownloadHandler:
            callback = pyDownloadHandler.GetCallback("OnData")
            if callback:
                ret = callback(VoidPtrToString(data, data_size))
                return bool(ret)
        return False
    except:
        (exc_type, exc_value, exc_trace) = sys.exc_info()
        sys.excepthook(exc_type, exc_value, exc_trace)

cdef public void DownloadHandler_Complete(
        int downloadHandlerId
        ) except * with gil:
    cdef PyDownloadHandler pyDownloadHandler
    cdef object callback
    try:
        assert IsThread(TID_UI), "Must be called on the UI thread"
        pyDownloadHandler = GetPyDownloadHandler(downloadHandlerId)
        if pyDownloadHandler:
            callback = pyDownloadHandler.GetCallback("OnComplete")
            if callback:
                callback()
    except:
        (exc_type, exc_value, exc_trace) = sys.exc_info()
        sys.excepthook(exc_type, exc_value, exc_trace)

Web Proxy Viewer  |  New URL  |  Original Page