def py_dc_callback(ctx, evt, data1, data2): """The global event handler. CFFI only allows us to set one global event handler, so this one looks up the correct event handler for the given context. """ try: callback = _DC_CALLBACK_MAP.get(ctx, lambda *a: 0) except AttributeError: # we are in a deep in GC-free/interpreter shutdown land # nothing much better to do here than: return 0 # the following code relates to the deltachat/_build.py's helper # function which provides us signature info of an event call evt_name = get_dc_event_name(evt) event_sig_types = capi.lib.dc_get_event_signature_types(evt) if data1 and event_sig_types & 1: data1 = ffi.string(ffi.cast('char*', data1)).decode("utf8") if data2 and event_sig_types & 2: data2 = ffi.string(ffi.cast('char*', data2)).decode("utf8") try: if isinstance(data2, bytes): data2 = data2.decode("utf8") except UnicodeDecodeError: # XXX ignoring the decode error is not quite correct but for now # i don't want to hunt down encoding problems in the c lib pass try: ret = callback(ctx, evt_name, data1, data2) if ret is None: ret = 0 assert isinstance(ret, int), repr(ret) if event_sig_types & 4: return ffi.cast('uintptr_t', ret) elif event_sig_types & 8: return ffi.cast('int', ret) except: # noqa raise ret = 0 return ret
def py_dc_callback(ctx, evt, data1, data2): """The global event handler. CFFI only allows us to set one global event handler, so this one looks up the correct event handler for the given context. """ try: callback = _DC_CALLBACK_MAP.get(ctx, lambda *a: 0) except AttributeError: # we are in a deep in GC-free/interpreter shutdown land # nothing much better to do here than: return 0 # the following code relates to the deltachat/_build.py's helper # function which provides us signature info of an event call evt_name = get_dc_event_name(evt) event_sig_types = capi.lib.dc_get_event_signature_types(evt) if data1 and event_sig_types & 1: data1 = ffi.string(ffi.cast('char*', data1)).decode("utf8") if data2 and event_sig_types & 2: try: data2 = ffi.string(ffi.cast('char*', data2)).decode("utf8") except UnicodeDecodeError: # XXX ignoring this error is not quite correct but for now # i don't want to hunt down encoding problems in the c lib data2 = ffi.string(ffi.cast('char*', data2)) try: ret = callback(ctx, evt_name, data1, data2) if event_sig_types & 4: return ffi.cast('uintptr_t', ret) elif event_sig_types & 8: return ffi.cast('int', ret) except: # noqa raise ret = 0 return ret