diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2012-12-14 19:48:06 +0100 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-12-14 19:48:06 +0100 |
commit | a0229390824d58ef0b49a4b67ca5be1bc642b088 (patch) | |
tree | 11d692591ad1c3de23228cf7698b6bcb4831d547 | |
parent | bc1d384a97f7789f769424dfeef2a55c420985b8 (diff) |
gdbus: Add callback support for handling property changes
-rw-r--r-- | gdbus/client.c | 33 | ||||
-rw-r--r-- | gdbus/gdbus.h | 8 |
2 files changed, 31 insertions, 10 deletions
diff --git a/gdbus/client.c b/gdbus/client.c index c0e9ecbca..e32cefed0 100644 --- a/gdbus/client.c +++ b/gdbus/client.c @@ -46,7 +46,8 @@ struct GDBusClient { void *signal_data; GDBusProxyFunction proxy_added; GDBusProxyFunction proxy_removed; - void *proxy_data; + GDBusPropertyFunction property_changed; + void *user_data; GList *proxy_list; }; @@ -230,7 +231,7 @@ static void proxy_free(gpointer data) GDBusClient *client = proxy->client; if (client->proxy_removed) - client->proxy_removed(proxy, client->proxy_data); + client->proxy_removed(proxy, client->user_data); modify_match(client->dbus_conn, "RemoveMatch", proxy->match_rule); @@ -433,7 +434,16 @@ static void add_property(GDBusProxy *proxy, const char *name, prop = g_hash_table_lookup(proxy->prop_list, name); if (prop != NULL) { + GDBusClient *client = proxy->client; + prop_entry_update(prop, &value); + + if (client == NULL) + return; + + if (client->property_changed) + client->property_changed(proxy, name, &value, + client->user_data); return; } @@ -518,6 +528,10 @@ static void properties_changed(GDBusClient *client, const char *path, g_hash_table_remove(proxy->prop_list, name); + if (client->property_changed) + client->property_changed(proxy, name, NULL, + client->user_data); + dbus_message_iter_next(&entry); } } @@ -540,7 +554,7 @@ static void parse_properties(GDBusClient *client, const char *path, update_properties(proxy, iter); if (client->proxy_added) - client->proxy_added(proxy, client->proxy_data); + client->proxy_added(proxy, client->user_data); client->proxy_list = g_list_append(client->proxy_list, proxy); } @@ -994,15 +1008,18 @@ gboolean g_dbus_client_set_signal_watch(GDBusClient *client, } gboolean g_dbus_client_set_proxy_handlers(GDBusClient *client, - GDBusProxyFunction added, - GDBusProxyFunction removed, void *user_data) + GDBusProxyFunction proxy_added, + GDBusProxyFunction proxy_removed, + GDBusPropertyFunction property_changed, + void *user_data) { if (client == NULL) return FALSE; - client->proxy_added = added; - client->proxy_removed = removed; - client->proxy_data = user_data; + client->proxy_added = proxy_added; + client->proxy_removed = proxy_removed; + client->property_changed = property_changed; + client->user_data = user_data; return TRUE; } diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h index fa978db65..57c2685ac 100644 --- a/gdbus/gdbus.h +++ b/gdbus/gdbus.h @@ -302,10 +302,14 @@ gboolean g_dbus_client_set_signal_watch(GDBusClient *client, GDBusMessageFunction function, void *user_data); typedef void (* GDBusProxyFunction) (GDBusProxy *proxy, void *user_data); +typedef void (* GDBusPropertyFunction) (GDBusProxy *proxy, const char *name, + DBusMessageIter *iter, void *user_data); gboolean g_dbus_client_set_proxy_handlers(GDBusClient *client, - GDBusProxyFunction added, - GDBusProxyFunction removed, void *user_data); + GDBusProxyFunction proxy_added, + GDBusProxyFunction proxy_removed, + GDBusPropertyFunction property_changed, + void *user_data); #ifdef __cplusplus } |