Diff between dc6894500a8aadd0ab6c59dd43c585c469122e72 and f8238b4b26a4885c3ae4125a09c81b613b404862

Changed Files

File Additions Deletions Status
gdbus/client.c +23 -0 modified
gdbus/gdbus.h +7 -4 modified

Full Patch

diff --git a/gdbus/client.c b/gdbus/client.c
index b46d5e4..4c3bad6 100644
--- a/gdbus/client.c
+++ b/gdbus/client.c
@@ -60,6 +60,8 @@ struct GDBusProxy {
 	char *interface;
 	GHashTable *prop_list;
 	char *match_rule;
+	GDBusPropertyFunction prop_func;
+	void *prop_data;
 };
 
 struct prop_entry {
@@ -215,6 +217,9 @@ static void add_property(GDBusProxy *proxy, const char *name,
 
 		prop_entry_update(prop, &value);
 
+		if (proxy->prop_func)
+			proxy->prop_func(proxy, name, &value, proxy->prop_data);
+
 		if (client == NULL)
 			return;
 
@@ -229,6 +234,9 @@ static void add_property(GDBusProxy *proxy, const char *name,
 		return;
 
 	g_hash_table_replace(proxy->prop_list, prop->name, prop);
+
+	if (proxy->prop_func)
+		proxy->prop_func(proxy, name, &value, proxy->prop_data);
 }
 
 static void update_properties(GDBusProxy *proxy, DBusMessageIter *iter)
@@ -655,6 +663,18 @@ gboolean g_dbus_proxy_method_call(GDBusProxy *proxy, const char *method,
 	return TRUE;
 }
 
+gboolean g_dbus_proxy_set_property_watch(GDBusProxy *proxy,
+			GDBusPropertyFunction function, void *user_data)
+{
+	if (proxy == NULL)
+		return FALSE;
+
+	proxy->prop_func = function;
+	proxy->prop_data = user_data;
+
+	return TRUE;
+}
+
 static void properties_changed(GDBusClient *client, const char *path,
 							DBusMessage *msg)
 {
@@ -702,6 +722,9 @@ static void properties_changed(GDBusClient *client, const char *path,
 
 		g_hash_table_remove(proxy->prop_list, name);
 
+		if (proxy->prop_func)
+			proxy->prop_func(proxy, name, NULL, proxy->prop_data);
+
 		if (client->property_changed)
 			client->property_changed(proxy, name, NULL,
 							client->user_data);
diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h
index 4caa31d..b0de6d5 100644
--- a/gdbus/gdbus.h
+++ b/gdbus/gdbus.h
@@ -304,6 +304,13 @@ gboolean g_dbus_proxy_method_call(GDBusProxy *proxy, const char *method,
 				GDBusReturnFunction function, void *user_data,
 				GDBusDestroyFunction destroy);
 
+typedef void (* GDBusProxyFunction) (GDBusProxy *proxy, void *user_data);
+typedef void (* GDBusPropertyFunction) (GDBusProxy *proxy, const char *name,
+					DBusMessageIter *iter, void *user_data);
+
+gboolean g_dbus_proxy_set_property_watch(GDBusProxy *proxy,
+			GDBusPropertyFunction function, void *user_data);
+
 GDBusClient *g_dbus_client_new(DBusConnection *connection,
 					const char *service, const char *path);
 
@@ -317,10 +324,6 @@ gboolean g_dbus_client_set_disconnect_watch(GDBusClient *client,
 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 proxy_added,
 					GDBusProxyFunction proxy_removed,