diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2012-10-11 11:53:27 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-11-26 14:44:48 +0100 |
commit | 6321f8627ccbb74eb7c4d0a45f56a4b5a2ac77fc (patch) | |
tree | 824f4a1bf55f1c3eb81cf55d62fb2e74de02c16a /gdbus/object.c | |
parent | 9e82f640c3d6eafad840fdd800c302bfa3a4bc25 (diff) | |
download | connman-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.c | 15 |
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); |