move towards pluggy

This commit is contained in:
holger krekel
2020-02-21 18:59:17 +01:00
parent 3da2e143b5
commit 932b8687de
2 changed files with 30 additions and 16 deletions

View File

@@ -6,10 +6,9 @@ import threading
import os import os
import time import time
from array import array from array import array
try: from queue import Queue, Empty
from queue import Queue, Empty
except ImportError: from pluggy import PluginManager
from Queue import Queue, Empty
import deltachat import deltachat
from . import const from . import const
@@ -19,6 +18,7 @@ from .chat import Chat
from .message import Message from .message import Message
from .contact import Contact from .contact import Contact
from .eventlogger import EventLogger from .eventlogger import EventLogger
from .hookspec import get_plugin_manager, hookimpl
class Account(object): class Account(object):
@@ -42,8 +42,20 @@ class Account(object):
) )
self._evlogger = EventLogger(self._dc_context, logid, debug) self._evlogger = EventLogger(self._dc_context, logid, debug)
self._threads = IOThreads(self._dc_context, self._evlogger._log_event) self._threads = IOThreads(self._dc_context, self._evlogger._log_event)
deltachat.set_context_callback(self._dc_context, self._process_ll_event)
# register event call back and initialize plugin system
def _ll_event(ctx, evt_name, data1, data2):
assert ctx == self._dc_context
self.pluggy.hook.process_low_level_event(
account=self, event_name=evt_name, data1=data1, data2=data2
)
self.pluggy = get_plugin_manager()
self.pluggy.register(self._evlogger)
self.pluggy.register(self)
deltachat.set_context_callback(self._dc_context, _ll_event)
# open database
if hasattr(db_path, "encode"): if hasattr(db_path, "encode"):
db_path = db_path.encode("utf8") db_path = db_path.encode("utf8")
if not lib.dc_open(self._dc_context, db_path, ffi.NULL): if not lib.dc_open(self._dc_context, db_path, ffi.NULL):
@@ -55,6 +67,14 @@ class Account(object):
# def __del__(self): # def __del__(self):
# self.shutdown() # self.shutdown()
@hookimpl
def process_low_level_event(self, account, event_name, data1, data2):
# there could be multiple accounts instantiated
if account != self:
method = getattr(self, "on_" + event_name.lower(), None)
if method is not None:
method(data1, data2)
def _check_config_key(self, name): def _check_config_key(self, name):
if name not in self._configkeys: if name not in self._configkeys:
raise KeyError("{!r} not a valid config key, existing keys: {!r}".format( raise KeyError("{!r} not a valid config key, existing keys: {!r}".format(
@@ -520,14 +540,6 @@ class Account(object):
del self._dc_context del self._dc_context
atexit.unregister(self.shutdown) atexit.unregister(self.shutdown)
def _process_ll_event(self, ctx, evt_name, data1, data2):
assert ctx == self._dc_context
self._evlogger(evt_name, data1, data2)
method = getattr(self, "on_" + evt_name.lower(), None)
if method is not None:
method(data1, data2)
return 0
def on_dc_event_imex_progress(self, data1, data2): def on_dc_event_imex_progress(self, data1, data2):
if data1 == 1000: if data1 == 1000:
self._imex_events.put(True) self._imex_events.put(True)

View File

@@ -2,6 +2,7 @@ import threading
import re import re
import time import time
from queue import Queue, Empty from queue import Queue, Empty
from .hookspec import hookimpl
class EventLogger: class EventLogger:
@@ -17,9 +18,10 @@ class EventLogger:
self._timeout = None self._timeout = None
self.init_time = time.time() self.init_time = time.time()
def __call__(self, evt_name, data1, data2): @hookimpl
self._log_event(evt_name, data1, data2) def process_low_level_event(self, event_name, data1, data2):
self._event_queue.put((evt_name, data1, data2)) self._log_event(event_name, data1, data2)
self._event_queue.put((event_name, data1, data2))
def set_timeout(self, timeout): def set_timeout(self, timeout):
self._timeout = timeout self._timeout = timeout