diff options
author | Aleksander Morgado <aleksandermj@chromium.org> | 2024-04-05 09:02:18 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2024-04-23 07:25:12 +0000 |
commit | 0d11ff85664ea6bc941adf62a36dd1ab4e326a59 (patch) | |
tree | 133a358afa7ba0dd82e24ea488f02892e7b22c68 | |
parent | 939be0fbf856f2bcef30b7b32f4f2c2852fe2f7b (diff) |
base-modem: allow subclassing tty/usbmisc/wwan port creation
So that plugins can provide their own implementations as needed.
-rw-r--r-- | src/mm-base-modem.c | 23 | ||||
-rw-r--r-- | src/mm-base-modem.h | 12 |
2 files changed, 27 insertions, 8 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index 7cda12b8..ac9c261e 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -198,10 +198,10 @@ base_modem_create_net_port (MMBaseModem *self, } static MMPort * -base_modem_create_tty_port (MMBaseModem *self, - const gchar *name, - MMKernelDevice *kernel_device, - MMPortType ptype) +base_modem_create_tty_port (MMBaseModem *self, + const gchar *name, + MMKernelDevice *kernel_device, + MMPortType ptype) { MMPort *port = NULL; const gchar *flow_control_tag; @@ -356,6 +356,10 @@ base_modem_internal_grab_port (MMBaseModem *self, return NULL; } + g_assert (MM_BASE_MODEM_GET_CLASS (self)->create_tty_port); + g_assert (MM_BASE_MODEM_GET_CLASS (self)->create_usbmisc_port); + g_assert (MM_BASE_MODEM_GET_CLASS (self)->create_wwan_port); + /* Explicitly ignored ports, grab them but explicitly flag them as ignored * right away, all the same way (i.e. regardless of subsystem). */ if (ptype == MM_PORT_TYPE_IGNORED) @@ -363,9 +367,9 @@ base_modem_internal_grab_port (MMBaseModem *self, else if (g_str_equal (subsys, "net")) port = base_modem_create_net_port (self, name); else if (g_str_equal (subsys, "tty")) - port = base_modem_create_tty_port (self, name, kernel_device, ptype); + port = MM_BASE_MODEM_GET_CLASS (self)->create_tty_port (self, name, kernel_device, ptype); else if (g_str_equal (subsys, "usbmisc")) - port = base_modem_create_usbmisc_port (self, name, ptype); + port = MM_BASE_MODEM_GET_CLASS (self)->create_usbmisc_port (self, name, ptype); else if (g_str_equal (subsys, "rpmsg")) port = base_modem_create_rpmsg_port (self, name, ptype); #if defined WITH_QRTR @@ -375,7 +379,7 @@ base_modem_internal_grab_port (MMBaseModem *self, else if (g_str_equal (subsys, "virtual")) port = base_modem_create_virtual_port (self, name); else if (g_str_equal (subsys, "wwan")) - port = base_modem_create_wwan_port (self, name, ptype); + port = MM_BASE_MODEM_GET_CLASS (self)->create_wwan_port (self, name, ptype); if (!port) { g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, @@ -2063,7 +2067,10 @@ mm_base_modem_class_init (MMBaseModemClass *klass) g_type_class_add_private (object_class, sizeof (MMBaseModemPrivate)); - /* Virtual methods */ + klass->create_tty_port = base_modem_create_tty_port; + klass->create_usbmisc_port = base_modem_create_usbmisc_port; + klass->create_wwan_port = base_modem_create_wwan_port; + object_class->get_property = get_property; object_class->set_property = set_property; object_class->finalize = finalize; diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h index fd06328c..39e203f9 100644 --- a/src/mm-base-modem.h +++ b/src/mm-base-modem.h @@ -123,6 +123,18 @@ struct _MMBaseModemClass { GError **error); #endif + /* Allow plugins to subclass port object creation as needed */ + MMPort * (* create_tty_port) (MMBaseModem *self, + const gchar *name, + MMKernelDevice *kernel_device, + MMPortType ptype); + MMPort * (* create_usbmisc_port) (MMBaseModem *self, + const gchar *name, + MMPortType ptype); + MMPort * (* create_wwan_port) (MMBaseModem *self, + const gchar *name, + MMPortType ptype); + /* signals */ void (* link_port_grabbed) (MMBaseModem *self, MMPort *link_port); |