summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2012-10-11 11:53:27 +0200
committerMarcel Holtmann <marcel@holtmann.org>2012-11-26 14:54:07 +0100
commit0fb1f64e3ec15669f5359a4cce2f6aebb2f2a41d (patch)
treeeb05b19cf4bf12e6a3b6327699919a35b056459a
parent93dad365426545c3917b4fffa009946b47b273ed (diff)
downloadpacrunner-0fb1f64e3ec15669f5359a4cce2f6aebb2f2a41d.tar.gz
gdbus: Add support for invalidated properties
If there's a pending property but its exists() callback returns false the property should be considered invalidated and included in the relevant list of the PropertiesChanged signal.
-rw-r--r--gdbus/object.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gdbus/object.c b/gdbus/object.c
index 03d2252..7acb563 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -1513,6 +1513,7 @@ static void process_properties_from_interface(struct generic_data *data,
GSList *l;
DBusMessage *signal;
DBusMessageIter iter, dict, array;
+ GSList *invalidated;
if (iface->pending_prop == NULL)
return;
@@ -1534,21 +1535,33 @@ static void process_properties_from_interface(struct generic_data *data,
DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
+ invalidated = NULL;
+
for (l = iface->pending_prop; l != NULL; l = l->next) {
GDBusPropertyTable *p = l->data;
if (p->get == NULL)
continue;
- if (p->exists != NULL && !p->exists(p, iface->user_data))
+ if (p->exists != NULL && !p->exists(p, iface->user_data)) {
+ invalidated = g_slist_prepend(invalidated, p);
continue;
+ }
append_property(iface, p, &dict);
}
dbus_message_iter_close_container(&iter, &dict);
+
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
DBUS_TYPE_STRING_AS_STRING, &array);
+ for (l = invalidated; l != NULL; l = g_slist_next(l)) {
+ GDBusPropertyTable *p = l->data;
+
+ dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING,
+ &p->name);
+ }
+ g_slist_free(invalidated);
dbus_message_iter_close_container(&iter, &array);
g_dbus_send_message(data->conn, signal);