This patch adds a 'hotplugged' flag to MMBaseModem to indicate if a modem is newly plugged in. A plugin can use this information to determine if, for example, the modem needs to be soft reset using the ATZ command.
Dan Williams <d...@redhat.com> contributed the idea of implementation. --- src/mm-base-modem.c | 18 ++++++++++++++++++ src/mm-base-modem.h | 4 ++++ src/mm-device.c | 21 +++++++++++++++++---- src/mm-device.h | 4 +++- src/mm-manager.c | 15 ++++++++------- src/mm-plugin.c | 2 ++ 6 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index c66ec53..86ff812 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -67,6 +67,7 @@ struct _MMBaseModemPrivate { guint vendor_id; guint product_id; + gboolean hotplugged; gboolean valid; guint max_timeouts; @@ -411,6 +412,23 @@ mm_base_modem_initialize (MMBaseModem *self, } void +mm_base_modem_set_hotplugged (MMBaseModem *self, + gboolean hotplugged) +{ + g_return_if_fail (MM_IS_BASE_MODEM (self)); + + self->priv->hotplugged = hotplugged; +} + +gboolean +mm_base_modem_get_hotplugged (MMBaseModem *self) +{ + g_return_val_if_fail (MM_IS_BASE_MODEM (self), FALSE); + + return self->priv->hotplugged; +} + +void mm_base_modem_set_valid (MMBaseModem *self, gboolean new_valid) { diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h index bdacf86..9d4e3a1 100644 --- a/src/mm-base-modem.h +++ b/src/mm-base-modem.h @@ -143,6 +143,10 @@ MMAtSerialPort *mm_base_modem_get_best_at_port (MMBaseModem *self, GError MMPort *mm_base_modem_get_best_data_port (MMBaseModem *self); GList *mm_base_modem_get_data_ports (MMBaseModem *self); +void mm_base_modem_set_hotplugged (MMBaseModem *self, + gboolean hotplugged); +gboolean mm_base_modem_get_hotplugged (MMBaseModem *self); + void mm_base_modem_set_valid (MMBaseModem *self, gboolean valid); gboolean mm_base_modem_get_valid (MMBaseModem *self); diff --git a/src/mm-device.c b/src/mm-device.c index e8330d6..a37b26d 100644 --- a/src/mm-device.c +++ b/src/mm-device.c @@ -68,6 +68,9 @@ struct _MMDevicePrivate { /* When exported, a reference to the object manager */ GDBusObjectManagerServer *object_manager; + + /* Whether the device was hot-plugged. */ + gboolean hotplugged; }; /*****************************************************************************/ @@ -593,14 +596,24 @@ mm_device_get_port_probe_list (MMDevice *self) return copy; } +gboolean +mm_device_get_hotplugged (MMDevice *self) +{ + return self->priv->hotplugged; +} + /*****************************************************************************/ MMDevice * -mm_device_new (GUdevDevice *udev_device) +mm_device_new (GUdevDevice *udev_device, gboolean hotplugged) { - return MM_DEVICE (g_object_new (MM_TYPE_DEVICE, - MM_DEVICE_UDEV_DEVICE, udev_device, - NULL)); + MMDevice *device; + + device = MM_DEVICE (g_object_new (MM_TYPE_DEVICE, + MM_DEVICE_UDEV_DEVICE, udev_device, + NULL)); + device->priv->hotplugged = hotplugged; + return device; } static void diff --git a/src/mm-device.h b/src/mm-device.h index 4849905..e7065ed 100644 --- a/src/mm-device.h +++ b/src/mm-device.h @@ -58,7 +58,7 @@ struct _MMDeviceClass { GType mm_device_get_type (void); -MMDevice *mm_device_new (GUdevDevice *udev_device); +MMDevice *mm_device_new (GUdevDevice *udev_device, gboolean hotplugged); void mm_device_grab_port (MMDevice *self, GUdevDevice *udev_port); @@ -96,4 +96,6 @@ GList *mm_device_get_port_probe_list (MMDevice *self); const gchar *mm_device_utils_get_port_driver (GUdevDevice *udev_port); +gboolean mm_device_get_hotplugged (MMDevice *self); + #endif /* MM_DEVICE_H */ diff --git a/src/mm-manager.c b/src/mm-manager.c index c5185b3..688348f 100644 --- a/src/mm-manager.c +++ b/src/mm-manager.c @@ -216,7 +216,8 @@ find_physical_device (GUdevDevice *child) static void device_added (MMManager *manager, - GUdevDevice *port) + GUdevDevice *port, + gboolean hotplugged) { MMDevice *device; const char *subsys, *name, *physdev_path, *physdev_subsys; @@ -292,7 +293,7 @@ device_added (MMManager *manager, FindDeviceSupportContext *ctx; /* Keep the device listed in the Manager */ - device = mm_device_new (physdev); + device = mm_device_new (physdev, hotplugged); g_hash_table_insert (manager->priv->devices, g_strdup (physdev_path), device); @@ -394,7 +395,7 @@ handle_uevent (GUdevClient *client, name = g_udev_device_get_name (device); if ( (g_str_equal (action, "add") || g_str_equal (action, "move") || g_str_equal (action, "change")) && (!g_str_has_prefix (subsys, "usb") || (name && g_str_has_prefix (name, "cdc-wdm")))) - device_added (self, device); + device_added (self, device, TRUE); else if (g_str_equal (action, "remove")) device_removed (self, device); } @@ -411,14 +412,14 @@ mm_manager_start (MMManager *manager) devices = g_udev_client_query_by_subsystem (manager->priv->udev, "tty"); for (iter = devices; iter; iter = g_list_next (iter)) { - device_added (manager, G_UDEV_DEVICE (iter->data)); + device_added (manager, G_UDEV_DEVICE (iter->data), FALSE); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); devices = g_udev_client_query_by_subsystem (manager->priv->udev, "net"); for (iter = devices; iter; iter = g_list_next (iter)) { - device_added (manager, G_UDEV_DEVICE (iter->data)); + device_added (manager, G_UDEV_DEVICE (iter->data), FALSE); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); @@ -429,7 +430,7 @@ mm_manager_start (MMManager *manager) name = g_udev_device_get_name (G_UDEV_DEVICE (iter->data)); if (name && g_str_has_prefix (name, "cdc-wdm")) - device_added (manager, G_UDEV_DEVICE (iter->data)); + device_added (manager, G_UDEV_DEVICE (iter->data), FALSE); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); @@ -441,7 +442,7 @@ mm_manager_start (MMManager *manager) name = g_udev_device_get_name (G_UDEV_DEVICE (iter->data)); if (name && g_str_has_prefix (name, "cdc-wdm")) - device_added (manager, G_UDEV_DEVICE (iter->data)); + device_added (manager, G_UDEV_DEVICE (iter->data), FALSE); g_object_unref (G_OBJECT (iter->data)); } g_list_free (devices); diff --git a/src/mm-plugin.c b/src/mm-plugin.c index c7a58b7..b6889ef 100644 --- a/src/mm-plugin.c +++ b/src/mm-plugin.c @@ -802,6 +802,8 @@ mm_plugin_create_modem (MMPlugin *self, port_probes, error); if (modem) { + mm_base_modem_set_hotplugged (modem, mm_device_get_hotplugged (device)); + /* Grab each port */ for (l = port_probes; l; l = g_list_next (l)) { GError *inner_error = NULL; -- 1.7.7.3 _______________________________________________ networkmanager-list mailing list networkmanager-list@gnome.org https://mail.gnome.org/mailman/listinfo/networkmanager-list