diff options
author | Bastien Nocera <hadess@hadess.net> | 2013-10-12 15:03:31 +0200 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2013-10-14 10:42:56 +0200 |
commit | 869050d699d34657ae81c7873fa6dd4285640cb7 (patch) | |
tree | 4eabf8c7269261910f1b969a218b34ca3085503c /libupower-glib/up-device.c | |
parent | 87709f709a724e139afad182b6bcbccc82ab66f4 (diff) |
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.
Diffstat (limited to 'libupower-glib/up-device.c')
-rw-r--r-- | libupower-glib/up-device.c | 41 |
1 files changed, 41 insertions, 0 deletions
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); } |