From 69d62d3dd1872a86aaaf44d1d88e988f9c6dbc5c Mon Sep 17 00:00:00 2001 From: Gilles Boccon-Gibod Date: Mon, 6 Jan 2025 08:42:09 -0500 Subject: [PATCH] support multiple event factories --- bumble/hci.py | 19 ++++++++++++++++--- bumble/vendor/android/hci.py | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/bumble/hci.py b/bumble/hci.py index cb4ee8c0..f9b39ae4 100644 --- a/bumble/hci.py +++ b/bumble/hci.py @@ -5070,7 +5070,7 @@ class HCI_Event(HCI_Packet): hci_packet_type = HCI_EVENT_PACKET event_names: Dict[int, str] = {} event_classes: Dict[int, Type[HCI_Event]] = {} - vendor_factory: Optional[Callable[[bytes], Optional[HCI_Event]]] = None + vendor_factories: list[Callable[[bytes], Optional[HCI_Event]]] = [] @staticmethod def event(fields=()): @@ -5128,6 +5128,19 @@ class HCI_Event(HCI_Packet): return event_class + @classmethod + def add_vendor_factory( + cls, factory: Callable[[bytes], Optional[HCI_Event]] + ) -> None: + cls.vendor_factories.append(factory) + + @classmethod + def remove_vendor_factory( + cls, factory: Callable[[bytes], Optional[HCI_Event]] + ) -> None: + if factory in cls.vendor_factories: + cls.vendor_factories.remove(factory) + @classmethod def from_bytes(cls, packet: bytes) -> HCI_Event: event_code = packet[1] @@ -5148,8 +5161,8 @@ class HCI_Event(HCI_Packet): elif event_code == HCI_VENDOR_EVENT: # Invoke all the registered factories to see if any of them can handle # the event - if cls.vendor_factory: - if event := cls.vendor_factory(parameters): + for vendor_factory in cls.vendor_factories: + if event := vendor_factory(parameters): return event # No factory, or the factory could not create an instance, diff --git a/bumble/vendor/android/hci.py b/bumble/vendor/android/hci.py index 0aaa23ae..e89dcdd2 100644 --- a/bumble/vendor/android/hci.py +++ b/bumble/vendor/android/hci.py @@ -299,7 +299,7 @@ class HCI_Android_Vendor_Event(HCI_Extended_Event): HCI_Android_Vendor_Event.register_subevents(globals()) -HCI_Event.vendor_factory = HCI_Android_Vendor_Event.subclass_from_parameters +HCI_Event.add_vendor_factory(HCI_Android_Vendor_Event.subclass_from_parameters) # -----------------------------------------------------------------------------