summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2012-12-14 19:48:06 +0100
committerMarcel Holtmann <marcel@holtmann.org>2012-12-14 19:48:06 +0100
commita0229390824d58ef0b49a4b67ca5be1bc642b088 (patch)
tree11d692591ad1c3de23228cf7698b6bcb4831d547
parentbc1d384a97f7789f769424dfeef2a55c420985b8 (diff)
gdbus: Add callback support for handling property changes
-rw-r--r--gdbus/client.c33
-rw-r--r--gdbus/gdbus.h8
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
}