Skip to contentSkip to conversation

dbus-client: Introduce l_dbus_client_add_proxy

PATCH New Tim Kourt 1 participant 1 message Jun 14, 2019

lore
Share & tools
lore

Tim Kourt

author
#0 lore raw

PATCH 1/1 dbus-client: Introduce l_dbus_client_add_proxy

Not all DBus services expose their objects trough ObjectManager, therefore the usage of such objects through the current client proxy API is impossible. This patch allows to manually add a proxy object for the well-known DBus object.

---
 ell/dbus-client.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 ell/dbus-client.h |  3 +++
 2 files changed, 79 insertions(+), 2 deletions(-)
ell/dbus-client.c +76 -2
index d2eb70f..852cf3b 100644
@@ -37,6 +37,7 @@ struct l_dbus_client {
 	unsigned int removed_watch;
 	char *service;
 	uint32_t objects_call;
+	uint32_t add_proxy_call;
 
 	l_dbus_watch_func_t connect_cb;
 	void *connect_cb_data;
@@ -647,8 +648,11 @@ LIB_EXPORT void l_dbus_client_destroy(struct l_dbus_client *client)
 		client->proxy_cb_data_destroy(client->proxy_cb_data);
 
 	if (client->objects_call)
-		l_dbus_cancel(client->dbus, client->objects_call)
-;
+		l_dbus_cancel(client->dbus, client->objects_call);
+
+	if (client->add_proxy_call)
+		l_dbus_cancel(client->dbus, client->add_proxy_call);
+
 	l_queue_destroy(client->proxies,
 				(l_queue_destroy_func_t)dbus_proxy_destroy);
 
@@ -730,3 +734,73 @@ LIB_EXPORT bool l_dbus_client_set_proxy_handlers(struct l_dbus_client *client,
 
 	return true;
 }
+
+struct add_proxy_data {
+	struct l_dbus_client *client;
+	char *path;
+	char *interafce;
+};
+
+static void add_proxy_data_destroy(void *user_data)
+{
+	struct add_proxy_data *data = user_data;
+
+	l_free(data->path);
+	l_free(data->interafce);
+	l_free(data);
+}
+
+static void add_proxy_reply(struct l_dbus_message *message, void *user_data)
+{
+	struct add_proxy_data *data = user_data;
+	struct l_dbus_message_iter properties;
+
+	data->client->add_proxy_call = 0;
+
+	if (l_dbus_message_is_error(message))
+		return;
+
+	l_dbus_message_get_arguments(message, "a{sv}", &properties);
+
+	parse_interface(data->client, data->path, data->interafce, &properties);
+}
+
+static void add_proxy_setup(struct l_dbus_message *message, void *user_data)
+{
+	struct add_proxy_data *data = user_data;
+
+	l_dbus_message_set_arguments(message, "s", data->interafce);
+}
+
+LIB_EXPORT bool l_dbus_client_add_proxy(struct l_dbus_client *client,
+							const char *path,
+							const char *interface)
+{
+	struct add_proxy_data *data;
+
+	if (unlikely(!client || !path || !interface))
+		return false;
+
+	if (find_proxy(client, path, interface))
+		return false;
+
+	data = l_new(struct add_proxy_data, 1);
+	data->client = client;
+	data->path = l_strdup(path);
+	data->interafce = l_strdup(interface);
+
+	client->add_proxy_call =
+			l_dbus_method_call(client->dbus, client->service, path,
+						L_DBUS_INTERFACE_PROPERTIES,
+						"GetAll", add_proxy_setup,
+						add_proxy_reply, data,
+						add_proxy_data_destroy);
+
+	if (!client->add_proxy_call) {
+		add_proxy_data_destroy(data);
+
+		return false;
+	}
+
+	return true;
+}
ell/dbus-client.h +3 -0
index 699d824..939a6bf 100644
@@ -72,6 +72,9 @@ bool l_dbus_client_set_proxy_handlers(struct l_dbus_client *client,
 			l_dbus_client_property_function_t property_changed,
 			void *user_data, l_dbus_destroy_func_t destroy);
 
+bool l_dbus_client_add_proxy(struct l_dbus_client *client, const char *path,
+							const char *interface);
+
 const char *l_dbus_proxy_get_path(struct l_dbus_proxy *proxy);
 
 const char *l_dbus_proxy_get_interface(struct l_dbus_proxy *proxy);
Signature · 1 line
2.13.6