diff options
Diffstat (limited to 'src/mm-base-manager.c')
-rw-r--r-- | src/mm-base-manager.c | 53 |
1 files changed, 52 insertions, 1 deletions
diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c index 03a387c3..61b30146 100644 --- a/src/mm-base-manager.c +++ b/src/mm-base-manager.c @@ -27,8 +27,9 @@ #if defined WITH_QMI # include <libqmi-glib.h> #endif -#if defined WITH_QMI && QMI_QRTR_SUPPORTED +#if defined WITH_QRTR # include "mm-kernel-device-qrtr.h" +# include "mm-qrtr-bus-watcher.h" #endif #if defined WITH_UDEV # include "mm-kernel-device-udev.h" @@ -104,6 +105,10 @@ struct _MMBaseManagerPrivate { /* The UDev client */ GUdevClient *udev; #endif +#if defined WITH_QRTR + /* The Qrtr Bus Watcher */ + MMQrtrBusWatcher *qrtr_bus_watcher; +#endif }; /*****************************************************************************/ @@ -365,6 +370,34 @@ device_added (MMBaseManager *self, mm_device_grab_port (device, port); } +#if defined WITH_QRTR + +static void +handle_qrtr_device_added (MMBaseManager *self, + guint node_id, + MMQrtrBusWatcher *bus_watcher) +{ + g_autoptr(MMKernelDevice) kernel_device = NULL; + QrtrNode *node; + + node = mm_qrtr_bus_watcher_peek_node (bus_watcher, node_id); + + kernel_device = mm_kernel_device_qrtr_new (node); + + device_added (self, kernel_device, TRUE, FALSE); +} + +static void +handle_qrtr_device_removed (MMBaseManager *self, + guint node_id) +{ + g_autofree gchar *qrtr_device_name = NULL; + + qrtr_device_name = mm_kernel_device_qrtr_helper_build_name (node_id); + device_removed (self, MM_KERNEL_DEVICE_QRTR_SUBSYSTEM, qrtr_device_name); +} +#endif + static gboolean handle_kernel_event (MMBaseManager *self, MMKernelEventProperties *properties, @@ -1422,6 +1455,19 @@ initable_init (GInitable *initable, { MMBaseManager *self = MM_BASE_MANAGER (initable); +#if defined WITH_QRTR + /* Create and setup the QrtrBusWatcher */ + self->priv->qrtr_bus_watcher = mm_qrtr_bus_watcher_new (); + mm_qrtr_bus_watcher_start (self->priv->qrtr_bus_watcher, NULL, NULL); + + /* If autoscan enabled, list for QrtrBusWatcher events */ + if (self->priv->auto_scan) { + g_object_connect (self->priv->qrtr_bus_watcher, + "swapped-signal::" MM_QRTR_BUS_WATCHER_DEVICE_ADDED, G_CALLBACK (handle_qrtr_device_added), self, + "swapped-signal::" MM_QRTR_BUS_WATCHER_DEVICE_REMOVED, G_CALLBACK (handle_qrtr_device_removed), self, + NULL); + } +#endif /* Create filter */ self->priv->filter = mm_filter_new (self->priv->filter_policy, error); if (!self->priv->filter) @@ -1486,6 +1532,11 @@ finalize (GObject *object) g_object_unref (self->priv->udev); #endif +#if defined WITH_QRTR + if (self->priv->qrtr_bus_watcher) + g_object_unref (self->priv->qrtr_bus_watcher); +#endif + if (self->priv->filter) g_object_unref (self->priv->filter); |