From 869050d699d34657ae81c7873fa6dd4285640cb7 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Sat, 12 Oct 2013 15:03:31 +0200 Subject: [PATCH] lib: Make it possible to create local UpDevices gnome-settings-daemon creates a composite UpDevice that's not backed by any real D-Bus object in UPower, so we shouldn't try and poke the inexistant proxy in this case. We'll cache the properties that the caller sets in this case, but will not support sending back default/unset values. --- libupower-glib/up-device.c | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/libupower-glib/up-device.c b/libupower-glib/up-device.c index 05a2d03..2085ff2 100644 --- a/libupower-glib/up-device.c +++ b/libupower-glib/up-device.c @@ -55,6 +55,10 @@ static void up_device_finalize (GObject *object); struct _UpDevicePrivate { UpDeviceGlue *proxy_device; + + /* For use when a UpDevice isn't backed by a D-Bus object + * by the UPower daemon */ + GHashTable *offline_props; }; enum { @@ -132,6 +136,8 @@ up_device_set_object_path_sync (UpDevice *device, const gchar *object_path, GCan if (device->priv->proxy_device != NULL) return FALSE; + g_clear_pointer (&device->priv->offline_props, g_hash_table_unref); + /* connect to the correct path for all the other methods */ proxy_device = up_device_glue_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, @@ -548,6 +554,16 @@ up_device_set_property (GObject *object, guint prop_id, const GValue *value, GPa { UpDevice *device = UP_DEVICE (object); + if (device->priv->proxy_device == NULL) { + GValue *v; + + v = g_memdup (value, sizeof(GValue)); + g_value_copy (value, v); + g_hash_table_insert (device->priv->offline_props, GUINT_TO_POINTER (prop_id), v); + + return; + } + switch (prop_id) { case PROP_NATIVE_PATH: up_device_glue_set_native_path (device->priv->proxy_device, g_value_get_string (value)); @@ -644,6 +660,18 @@ up_device_get_property (GObject *object, guint prop_id, GValue *value, GParamSpe { UpDevice *device = UP_DEVICE (object); + if (device->priv->proxy_device == NULL) { + GValue *v; + + v = g_hash_table_lookup (device->priv->offline_props, GUINT_TO_POINTER(prop_id)); + if (v) + g_value_copy (v, value); + else + g_warning ("Property ID %d was never set", prop_id); + + return; + } + switch (prop_id) { case PROP_UPDATE_TIME: g_value_set_uint64 (value, up_device_glue_get_update_time (device->priv->proxy_device)); @@ -1114,6 +1142,13 @@ up_device_class_init (UpDeviceClass *klass) g_type_class_add_private (klass, sizeof (UpDevicePrivate)); } +static void +value_free (GValue *value) +{ + g_value_unset (value); + g_free (value); +} + /* * up_device_init: */ @@ -1121,6 +1156,10 @@ static void up_device_init (UpDevice *device) { device->priv = UP_DEVICE_GET_PRIVATE (device); + device->priv->offline_props = g_hash_table_new_full (g_direct_hash, + g_direct_equal, + NULL, + (GDestroyNotify) value_free); } /* @@ -1138,6 +1177,8 @@ up_device_finalize (GObject *object) if (device->priv->proxy_device != NULL) g_object_unref (device->priv->proxy_device); + g_clear_pointer (&device->priv->offline_props, g_hash_table_unref); + G_OBJECT_CLASS (up_device_parent_class)->finalize (object); }