0DMRMaster version 0.4
Этот коммит содержится в:
Executable
+54
@@ -0,0 +1,54 @@
|
||||
import logging
|
||||
import time
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from .call import Call
|
||||
from .dmrproto import DMRPPacketData
|
||||
|
||||
|
||||
class AppException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class IAppDispatcher(ABC):
|
||||
"""
|
||||
Dispatcher interface for app
|
||||
"""
|
||||
@abstractmethod
|
||||
def inject_packet(self, p: DMRPPacketData) -> None:
|
||||
pass
|
||||
|
||||
|
||||
class IAppCallInterceptor(ABC):
|
||||
@abstractmethod
|
||||
def process_call_packet(self, call: Call, p: DMRPPacketData) -> None:
|
||||
pass
|
||||
|
||||
|
||||
class App(ABC):
|
||||
def __init__(self) -> None:
|
||||
self.dispatcher: IAppDispatcher|None = None
|
||||
|
||||
@abstractmethod
|
||||
def get_name(self) -> str:
|
||||
pass
|
||||
|
||||
|
||||
class AppKeeper:
|
||||
def __init__(self, dispatcher: IAppDispatcher):
|
||||
self.dispatcher: IAppDispatcher = dispatcher
|
||||
self.apps: list[App] = []
|
||||
|
||||
def register(self, app: App) -> bool:
|
||||
logging.info(f"Registered app '{app.get_name()}' ")
|
||||
app.dispatcher = self.dispatcher
|
||||
self.apps.append(app)
|
||||
return True
|
||||
|
||||
def process_call_packet(self, call: Call, p: DMRPPacketData) -> None:
|
||||
for app in self.apps:
|
||||
if isinstance(app, IAppCallInterceptor):
|
||||
app.process_call_packet(call, p)
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user