gdbus: Add callback support for handling property changes

This commit is contained in:
Marcel Holtmann 2012-12-14 19:48:06 +01:00
parent f40f27cd44
commit 90c719f29c
2 changed files with 31 additions and 10 deletions

View File

@ -46,7 +46,8 @@ struct GDBusClient {
void *signal_data; void *signal_data;
GDBusProxyFunction proxy_added; GDBusProxyFunction proxy_added;
GDBusProxyFunction proxy_removed; GDBusProxyFunction proxy_removed;
void *proxy_data; GDBusPropertyFunction property_changed;
void *user_data;
GList *proxy_list; GList *proxy_list;
}; };
@ -230,7 +231,7 @@ static void proxy_free(gpointer data)
GDBusClient *client = proxy->client; GDBusClient *client = proxy->client;
if (client->proxy_removed) if (client->proxy_removed)
client->proxy_removed(proxy, client->proxy_data); client->proxy_removed(proxy, client->user_data);
modify_match(client->dbus_conn, "RemoveMatch", modify_match(client->dbus_conn, "RemoveMatch",
proxy->match_rule); 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); prop = g_hash_table_lookup(proxy->prop_list, name);
if (prop != NULL) { if (prop != NULL) {
GDBusClient *client = proxy->client;
prop_entry_update(prop, &value); prop_entry_update(prop, &value);
if (client == NULL)
return;
if (client->property_changed)
client->property_changed(proxy, name, &value,
client->user_data);
return; return;
} }
@ -518,6 +528,10 @@ static void properties_changed(GDBusClient *client, const char *path,
g_hash_table_remove(proxy->prop_list, name); 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); dbus_message_iter_next(&entry);
} }
} }
@ -540,7 +554,7 @@ static void parse_properties(GDBusClient *client, const char *path,
update_properties(proxy, iter); update_properties(proxy, iter);
if (client->proxy_added) 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); 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, gboolean g_dbus_client_set_proxy_handlers(GDBusClient *client,
GDBusProxyFunction added, GDBusProxyFunction proxy_added,
GDBusProxyFunction removed, void *user_data) GDBusProxyFunction proxy_removed,
GDBusPropertyFunction property_changed,
void *user_data)
{ {
if (client == NULL) if (client == NULL)
return FALSE; return FALSE;
client->proxy_added = added; client->proxy_added = proxy_added;
client->proxy_removed = removed; client->proxy_removed = proxy_removed;
client->proxy_data = user_data; client->property_changed = property_changed;
client->user_data = user_data;
return TRUE; return TRUE;
} }

View File

@ -302,10 +302,14 @@ gboolean g_dbus_client_set_signal_watch(GDBusClient *client,
GDBusMessageFunction function, void *user_data); GDBusMessageFunction function, void *user_data);
typedef void (* GDBusProxyFunction) (GDBusProxy *proxy, 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, gboolean g_dbus_client_set_proxy_handlers(GDBusClient *client,
GDBusProxyFunction added, GDBusProxyFunction proxy_added,
GDBusProxyFunction removed, void *user_data); GDBusProxyFunction proxy_removed,
GDBusPropertyFunction property_changed,
void *user_data);
#ifdef __cplusplus #ifdef __cplusplus
} }