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 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);
+gbooleanmm_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 (GUdevC