Diff between bc1d384a97f7789f769424dfeef2a55c420985b8 and a0229390824d58ef0b49a4b67ca5be1bc642b088

Changed Files

File Additions Deletions Status
gdbus/client.c +25 -8 modified
gdbus/gdbus.h +6 -2 modified

Full Patch

diff --git a/gdbus/client.c b/gdbus/client.c
index c0e9ecb..e32cefe 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 fa978db..57c2685 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
 }