refine low level event handling

slight refactor on printing
This commit is contained in:
holger krekel
2020-02-23 00:38:40 +01:00
parent 6baef49f9d
commit 84012e760e
9 changed files with 117 additions and 118 deletions

View File

@@ -77,5 +77,5 @@ def get_dc_event_name(integer, _DC_EVENTNAME_MAP={}):
def register_global_plugin(plugin):
gm = hookspect.Global._get_plugin_manager()
gm = hookspec.Global._get_plugin_manager()
gm.register(plugin)

View File

@@ -47,8 +47,9 @@ class Account(object):
# send all FFI events for this account to a plugin hook
def _ll_event(ctx, evt_name, data1, data2):
assert ctx == self._dc_context
ffi_event = FFIEvent(name=evt_name, data1=data1, data2=data2)
self._pm.hook.process_ffi_event(
account=self, event_name=evt_name, data1=data1, data2=data2
account=self, ffi_event=ffi_event
)
deltachat.set_context_callback(self._dc_context, _ll_event)
@@ -61,8 +62,9 @@ class Account(object):
atexit.register(self.shutdown)
@hookspec.account_hookimpl
def process_ffi_event(self, event_name, data1, data2):
if event_name == "DC_EVENT_CONFIGURE_PROGRESS":
def process_ffi_event(self, ffi_event):
if ffi_event.name == "DC_EVENT_CONFIGURE_PROGRESS":
data1 = ffi_event.data1
if data1 == 0 or data1 == 1000:
success = data1 == 1000
self._pm.hook.configure_completed(success=success)
@@ -639,6 +641,16 @@ def _destroy_dc_context(dc_context, dc_context_unref=lib.dc_context_unref):
pass
class FFIEvent:
def __init__(self, name, data1, data2):
self.name = name
self.data1 = data1
self.data2 = data2
def __str__(self):
return "{name} data1={data1} data2={data2}".format(**self.__dict__)
class ScannedQRCode:
def __init__(self, dc_lot):
self._dc_lot = dc_lot

View File

@@ -1,6 +1,6 @@
import threading
import time
from .hookspec import account_hookimpl, global_hookimpl
from .hookspec import account_hookimpl
class FFIEventLogger:
@@ -20,15 +20,14 @@ class FFIEventLogger:
self.init_time = time.time()
@account_hookimpl
def process_ffi_event(self, event_name, data1, data2):
self._log_event(event_name, data1, data2)
def process_ffi_event(self, ffi_event):
self._log_event(ffi_event)
def _log_event(self, evt_name, data1, data2):
def _log_event(self, ffi_event):
# don't show events that are anyway empty impls now
if evt_name == "DC_EVENT_GET_STRING":
if ffi_event.name == "DC_EVENT_GET_STRING":
return
evpart = "{}({!r},{!r})".format(evt_name, data1, data2)
self.account.log_line(evpart)
self.account.log_line(str(ffi_event))
@account_hookimpl
def log_line(self, message):
@@ -36,9 +35,10 @@ class FFIEventLogger:
tname = getattr(t, "name", t)
if tname == "MainThread":
tname = "MAIN"
elapsed = time.time() - self.init_time
locname = tname
if self.logid:
locname += "-" + self.logid
s = "{:2.2f} [{}] {}".format(elapsed, locname, message)
with self._loglock:
print("{:2.2f} [{}-{}] {}".format(
time.time() - self.init_time,
tname,
self.logid,
message))
print(s)

View File

@@ -24,21 +24,24 @@ class PerAccount:
return pm
@account_hookspec
def process_ffi_event(self, event_name, data1, data2):
""" process a CFFI low level events for a given account. """
def process_ffi_event(self, ffi_event):
""" process a CFFI low level events for a given account.
ffi_event has "name", "data1", "data2" attributes according
to https://c.delta.chat/group__DC__EVENT.html
"""
@account_hookspec
def log_line(self, message):
""" log a message related to the account. """
@account_hookspec
def after_shutdown(self):
""" Called when the account has been shutdown. """
@account_hookspec
def configure_completed(self, success):
""" Called when a configure process completed. """
@account_hookspec
def after_shutdown(self):
""" Called after the account has been shutdown. """
class Global:

View File

@@ -14,11 +14,11 @@ class ImexTracker:
self._imex_events = Queue()
@account_hookimpl
def process_ffi_event(self, event_name, data1, data2):
if event_name == "DC_EVENT_IMEX_PROGRESS":
self._imex_events.put(data1)
elif event_name == "DC_EVENT_IMEX_FILE_WRITTEN":
self._imex_events.put(data1)
def process_ffi_event(self, ffi_event):
if ffi_event.name == "DC_EVENT_IMEX_PROGRESS":
self._imex_events.put(ffi_event.data1)
elif ffi_event.name == "DC_EVENT_IMEX_FILE_WRITTEN":
self._imex_events.put(ffi_event.data1)
def wait_finish(self, progress_timeout=60):
""" Return list of written files, raise ValueError if ExportFailed. """
@@ -47,11 +47,11 @@ class ConfigureTracker:
self._ffi_events = []
@account_hookimpl
def process_ffi_event(self, event_name, data1, data2):
self._ffi_events.append((event_name, data1, data2))
if event_name == "DC_EVENT_SMTP_CONNECTED":
def process_ffi_event(self, ffi_event):
self._ffi_events.append(ffi_event)
if ffi_event.name == "DC_EVENT_SMTP_CONNECTED":
self._smtp_finished.set()
elif event_name == "DC_EVENT_IMAP_CONNECTED":
elif ffi_event.name == "DC_EVENT_IMAP_CONNECTED":
self._imap_finished.set()
@account_hookimpl
@@ -72,5 +72,5 @@ class ConfigureTracker:
Raise Exception if Configure failed
"""
if not self._configure_events.get():
content = "\n".join("{}: {} {}".format(*args) for args in self._ffi_events)
content = "\n".join(map(str, self._ffi_events))
raise ConfigureFailed(content)