summaryrefslogtreecommitdiff
path: root/src/up-device.c
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2013-10-15 17:47:20 +0200
committerBastien Nocera <hadess@hadess.net>2013-10-15 17:50:18 +0200
commit2dae17d87b4e11c2476d248285693fd65f3dde17 (patch)
tree38ac2cd58b1570e3fe3a5bf9139dc13503472e41 /src/up-device.c
parent5e5e7379482d5b6f09426dce6e6afd15606bea4b (diff)
downloadupower-2dae17d87b4e11c2476d248285693fd65f3dde17.tar.gz
daemon: Make UpDevice emit PropertiesChanged signals
That will make libupower-glib UpDevice work again, as the proxy was not receiving property changes, and we kept reading old cached values.
Diffstat (limited to 'src/up-device.c')
-rw-r--r--src/up-device.c65
1 files changed, 64 insertions, 1 deletions
diff --git a/src/up-device.c b/src/up-device.c
index 8f11371..8a97923 100644
--- a/src/up-device.c
+++ b/src/up-device.c
@@ -49,6 +49,10 @@ struct UpDevicePrivate
GObject *native;
gboolean has_ever_refresh;
+ /* PropertiesChanged to be emitted */
+ GHashTable *changed_props;
+ guint props_idle_id;
+
/* properties */
guint64 update_time;
gchar *vendor;
@@ -257,6 +261,59 @@ update_icon_name (UpDevice *device)
g_object_notify (G_OBJECT (device), "icon-name");
}
+static gboolean
+changed_props_idle_cb (gpointer user_data)
+{
+ UpDevice *device = user_data;
+
+ /* D-Bus */
+ up_daemon_emit_properties_changed (device->priv->system_bus_connection,
+ device->priv->object_path,
+ "org.freedesktop.UPower",
+ device->priv->changed_props);
+ g_clear_pointer (&device->priv->changed_props, g_hash_table_unref);
+ device->priv->props_idle_id = 0;
+
+ return G_SOURCE_REMOVE;
+}
+
+/**
+ * up_device_queue_changed_property:
+ **/
+static void
+up_device_queue_changed_property (UpDevice *device,
+ const gchar *property,
+ GVariant *value)
+{
+ gchar *dbus_prop;
+ gchar **items;
+ guint i;
+
+ g_return_if_fail (UP_IS_DEVICE (device));
+
+ if (device->priv->system_bus_connection == NULL)
+ return;
+
+ if (!device->priv->changed_props) {
+ device->priv->changed_props = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, (GDestroyNotify) g_variant_unref);
+ }
+
+ items = g_strsplit (property, "-", -1);
+ for (i = 0; items[i] != NULL; i++)
+ *items[i] = g_ascii_toupper (*items[i]);
+ dbus_prop = g_strjoinv (NULL, items);
+ g_strfreev (items);
+
+ g_message ("queueing prop %s", dbus_prop);
+
+ g_hash_table_insert (device->priv->changed_props,
+ dbus_prop, value);
+
+ if (device->priv->props_idle_id == 0)
+ device->priv->props_idle_id = g_idle_add (changed_props_idle_cb, device);
+}
+
/**
* up_device_get_property:
**/
@@ -456,8 +513,14 @@ up_device_set_property (GObject *object, guint prop_id, const GValue *value, GPa
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
+ return;
}
+
+ if (G_VALUE_TYPE (value) == G_TYPE_STRING &&
+ g_value_get_string (value) == NULL)
+ up_device_queue_changed_property (device, pspec->name, g_variant_new_string (""));
+ else
+ up_device_queue_changed_property (device, pspec->name, dbus_g_value_build_g_variant (value));
}
/**