diff options
-rw-r--r-- | src/mm-base-manager.c | 10 | ||||
-rw-r--r-- | src/mm-device.c | 67 | ||||
-rw-r--r-- | src/mm-device.h | 28 |
3 files changed, 55 insertions, 50 deletions
diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c index 55382e30..d5899466 100644 --- a/src/mm-base-manager.c +++ b/src/mm-base-manager.c @@ -192,7 +192,7 @@ device_support_check_ready (MMPluginManager *plugin_manager, mm_device_set_plugin (ctx->device, G_OBJECT (plugin)); g_object_unref (plugin); - if (!mm_device_create_modem (ctx->device, ctx->self->priv->object_manager, &error)) { + if (!mm_device_create_modem (ctx->device, &error)) { mm_warn ("Couldn't create modem for device '%s': %s", mm_device_get_uid (ctx->device), error->message); g_error_free (error); @@ -368,7 +368,7 @@ device_added (MMBaseManager *manager, subsys, name, physdev_uid); /* Keep the device listed in the Manager */ - device = mm_device_new (physdev_uid, hotplugged, FALSE); + device = mm_device_new (physdev_uid, hotplugged, FALSE, manager->priv->object_manager); g_hash_table_insert (manager->priv->devices, g_strdup (physdev_uid), device); @@ -1084,7 +1084,7 @@ remove_device_inhibition (MMBaseManager *self, GError *error = NULL; /* Uninhibit device, which will create and expose the modem object */ - if (!mm_device_uninhibit (device, self->priv->object_manager, &error)) { + if (!mm_device_uninhibit (device, &error)) { mm_warn ("Couldn't uninhibit device: %s", error->message); g_error_free (error); } @@ -1271,7 +1271,7 @@ handle_set_profile (MmGdbusTest *skeleton, /* Create device and keep it listed in the Manager */ physdev_uid = g_strdup_printf ("/virtual/%s", id); - device = mm_device_new (physdev_uid, TRUE, TRUE); + device = mm_device_new (physdev_uid, TRUE, TRUE, self->priv->object_manager); g_hash_table_insert (self->priv->devices, physdev_uid, device); /* Grab virtual ports */ @@ -1292,7 +1292,7 @@ handle_set_profile (MmGdbusTest *skeleton, mm_device_set_plugin (device, G_OBJECT (plugin)); /* Create modem */ - if (!mm_device_create_modem (device, self->priv->object_manager, &error)) { + if (!mm_device_create_modem (device, &error)) { mm_warn ("Couldn't create modem for virtual device '%s': %s", mm_device_get_uid (device), error->message); diff --git a/src/mm-device.c b/src/mm-device.c index 4b3d3066..55c51186 100644 --- a/src/mm-device.c +++ b/src/mm-device.c @@ -27,11 +27,12 @@ #include "mm-plugin.h" #include "mm-log.h" -G_DEFINE_TYPE (MMDevice, mm_device, G_TYPE_OBJECT); +G_DEFINE_TYPE (MMDevice, mm_device, G_TYPE_OBJECT) enum { PROP_0, PROP_UID, + PROP_OBJECT_MANAGER, PROP_PLUGIN, PROP_MODEM, PROP_HOTPLUGGED, @@ -56,6 +57,9 @@ struct _MMDevicePrivate { /* Unique id */ gchar *uid; + /* The object manager */ + GDBusObjectManagerServer *object_manager; + /* If USB, device vid/pid */ guint16 vendor; guint16 product; @@ -74,9 +78,6 @@ struct _MMDevicePrivate { MMBaseModem *modem; gulong modem_valid_id; - /* When exported, a reference to the object manager */ - GDBusObjectManagerServer *object_manager; - /* Whether the device was hot-plugged. */ gboolean hotplugged; @@ -322,7 +323,6 @@ mm_device_remove_modem (MMDevice *self) unexport_modem (self); clear_modem (self); - g_clear_object (&(self->priv->object_manager)); } /*****************************************************************************/ @@ -333,17 +333,13 @@ modem_valid (MMBaseModem *modem, MMDevice *self) { if (!mm_base_modem_get_valid (modem)) { - GDBusObjectManagerServer *object_manager; - - object_manager = g_object_ref (self->priv->object_manager); - /* Modem no longer valid */ mm_device_remove_modem (self); if (mm_base_modem_get_reprobe (modem)) { GError *error = NULL; - if (!mm_device_create_modem (self, object_manager, &error)) { + if (!mm_device_create_modem (self, &error)) { mm_warn ("Could not recreate modem for device '%s': %s", self->priv->uid, error ? error->message : "unknown"); @@ -352,8 +348,6 @@ modem_valid (MMBaseModem *modem, mm_dbg ("Modem recreated for device '%s'", self->priv->uid); } } - - g_object_unref (object_manager); } else { /* Modem now valid, export it, but only if we really have it around. * It may happen that the initialization sequence fails because the @@ -367,12 +361,10 @@ modem_valid (MMBaseModem *modem, } gboolean -mm_device_create_modem (MMDevice *self, - GDBusObjectManagerServer *object_manager, - GError **error) +mm_device_create_modem (MMDevice *self, + GError **error) { g_assert (self->priv->modem == NULL); - g_assert (self->priv->object_manager == NULL); if (self->priv->inhibited) { g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, @@ -409,16 +401,12 @@ mm_device_create_modem (MMDevice *self, } self->priv->modem = mm_plugin_create_modem (self->priv->plugin, self, error); - if (self->priv->modem) { - /* Keep the object manager */ - self->priv->object_manager = g_object_ref (object_manager); - + if (self->priv->modem) /* We want to get notified when the modem becomes valid/invalid */ self->priv->modem_valid_id = g_signal_connect (self->priv->modem, "notify::" MM_BASE_MODEM_VALID, G_CALLBACK (modem_valid), self); - } return !!self->priv->modem; } @@ -600,13 +588,12 @@ mm_device_inhibit (MMDevice *self, } gboolean -mm_device_uninhibit (MMDevice *self, - GDBusObjectManagerServer *object_manager, - GError **error) +mm_device_uninhibit (MMDevice *self, + GError **error) { g_assert (self->priv->inhibited); self->priv->inhibited = FALSE; - return mm_device_create_modem (self, object_manager, error); + return mm_device_create_modem (self, error); } /*****************************************************************************/ @@ -644,16 +631,18 @@ mm_device_is_virtual (MMDevice *self) /*****************************************************************************/ MMDevice * -mm_device_new (const gchar *uid, - gboolean hotplugged, - gboolean virtual) +mm_device_new (const gchar *uid, + gboolean hotplugged, + gboolean virtual, + GDBusObjectManagerServer *object_manager) { g_return_val_if_fail (uid != NULL, NULL); return MM_DEVICE (g_object_new (MM_TYPE_DEVICE, - MM_DEVICE_UID, uid, - MM_DEVICE_HOTPLUGGED, hotplugged, - MM_DEVICE_VIRTUAL, virtual, + MM_DEVICE_UID, uid, + MM_DEVICE_HOTPLUGGED, hotplugged, + MM_DEVICE_VIRTUAL, virtual, + MM_DEVICE_OBJECT_MANAGER, object_manager, NULL)); } @@ -677,6 +666,10 @@ set_property (GObject *object, /* construct only */ self->priv->uid = g_value_dup_string (value); break; + case PROP_OBJECT_MANAGER: + /* construct only */ + self->priv->object_manager = g_value_dup_object (value); + break; case PROP_PLUGIN: g_clear_object (&(self->priv->plugin)); self->priv->plugin = g_value_dup_object (value); @@ -712,6 +705,9 @@ get_property (GObject *object, case PROP_UID: g_value_set_string (value, self->priv->uid); break; + case PROP_OBJECT_MANAGER: + g_value_set_object (value, self->priv->object_manager); + break; case PROP_PLUGIN: g_value_set_object (value, self->priv->plugin); break; @@ -738,6 +734,7 @@ dispose (GObject *object) { MMDevice *self = MM_DEVICE (object); + g_clear_object (&(self->priv->object_manager)); g_clear_object (&(self->priv->plugin)); g_list_free_full (self->priv->port_probes, g_object_unref); self->priv->port_probes = NULL; @@ -782,6 +779,14 @@ mm_device_class_init (MMDeviceClass *klass) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_property (object_class, PROP_UID, properties[PROP_UID]); + properties[PROP_OBJECT_MANAGER] = + g_param_spec_object (MM_DEVICE_OBJECT_MANAGER, + "Object manager", + "GDBus object manager server", + G_TYPE_DBUS_OBJECT_MANAGER_SERVER, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (object_class, PROP_OBJECT_MANAGER, properties[PROP_OBJECT_MANAGER]); + properties[PROP_PLUGIN] = g_param_spec_object (MM_DEVICE_PLUGIN, "Plugin", diff --git a/src/mm-device.h b/src/mm-device.h index b00d1314..b7a3285c 100644 --- a/src/mm-device.h +++ b/src/mm-device.h @@ -33,12 +33,13 @@ typedef struct _MMDevice MMDevice; typedef struct _MMDeviceClass MMDeviceClass; typedef struct _MMDevicePrivate MMDevicePrivate; -#define MM_DEVICE_UID "uid" -#define MM_DEVICE_PLUGIN "plugin" -#define MM_DEVICE_MODEM "modem" -#define MM_DEVICE_HOTPLUGGED "hotplugged" -#define MM_DEVICE_VIRTUAL "virtual" -#define MM_DEVICE_INHIBITED "inhibited" +#define MM_DEVICE_UID "uid" +#define MM_DEVICE_PLUGIN "plugin" +#define MM_DEVICE_MODEM "modem" +#define MM_DEVICE_HOTPLUGGED "hotplugged" +#define MM_DEVICE_VIRTUAL "virtual" +#define MM_DEVICE_INHIBITED "inhibited" +#define MM_DEVICE_OBJECT_MANAGER "object-manager" #define MM_DEVICE_PORT_GRABBED "port-grabbed" #define MM_DEVICE_PORT_RELEASED "port-released" @@ -60,9 +61,10 @@ struct _MMDeviceClass { GType mm_device_get_type (void); -MMDevice *mm_device_new (const gchar *uid, - gboolean hotplugged, - gboolean virtual); +MMDevice *mm_device_new (const gchar *uid, + gboolean hotplugged, + gboolean virtual, + GDBusObjectManagerServer *object_manager); void mm_device_grab_port (MMDevice *self, MMKernelDevice *kernel_port); @@ -73,10 +75,9 @@ gboolean mm_device_owns_port (MMDevice *self, void mm_device_ignore_port (MMDevice *self, MMKernelDevice *kernel_port); -gboolean mm_device_create_modem (MMDevice *self, - GDBusObjectManagerServer *object_manager, - GError **error); -void mm_device_remove_modem (MMDevice *self); +gboolean mm_device_create_modem (MMDevice *self, + GError **error); +void mm_device_remove_modem (MMDevice *self); void mm_device_inhibit (MMDevice *self, GAsyncReadyCallback callback, @@ -85,7 +86,6 @@ gboolean mm_device_inhibit_finish (MMDevice *self, GAsyncResult *res, GError **error); gboolean mm_device_uninhibit (MMDevice *self, - GDBusObjectManagerServer *object_manager, GError **error); |