summaryrefslogtreecommitdiff
path: root/gdbus/object.c
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:44:48 +0100
commit6321f8627ccbb74eb7c4d0a45f56a4b5a2ac77fc (patch)
tree824f4a1bf55f1c3eb81cf55d62fb2e74de02c16a /gdbus/object.c
parent9e82f640c3d6eafad840fdd800c302bfa3a4bc25 (diff)
downloadconnman-6321f8627ccbb74eb7c4d0a45f56a4b5a2ac77fc.tar.gz
connman-6321f8627ccbb74eb7c4d0a45f56a4b5a2ac77fc.tar.bz2
connman-6321f8627ccbb74eb7c4d0a45f56a4b5a2ac77fc.zip
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.
Diffstat (limited to 'gdbus/object.c')
-rw-r--r--gdbus/object.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gdbus/object.c b/gdbus/object.c
index 03d2252c..7acb5635 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);