[PATCH BlueZ v4 15/15] Use DBus.Properties on Manager interface

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
 src/manager.c | 81 ++++++++++++++++++-----------------------------------------
 1 file changed, 25 insertions(+), 56 deletions(-)

diff --git a/src/manager.c b/src/manager.c
index f1f0f4d..2ceeed1 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -132,46 +132,30 @@ done:
 	return reply;
 }
 
-static DBusMessage *get_properties(DBusConnection *conn,
-					DBusMessage *msg, void *data)
+static gboolean manager_property_get_adapters(
+					const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
 {
-	DBusMessage *reply;
-	DBusMessageIter iter;
-	DBusMessageIter dict;
-	GSList *list;
-	char **array;
-	int i;
-
-	reply = dbus_message_new_method_return(msg);
-	if (!reply)
-		return NULL;
-
-	dbus_message_iter_init_append(reply, &iter);
+	DBusMessageIter entry;
+	GSList *l;
 
-	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
-			DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-			DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
-			DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
+	dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+				DBUS_TYPE_OBJECT_PATH_AS_STRING, &entry);
 
-	array = g_new0(char *, g_slist_length(adapters) + 1);
-	for (i = 0, list = adapters; list; list = list->next) {
-		struct btd_adapter *adapter = list->data;
+	for (l = adapters; l != NULL; l = l->next) {
+		struct btd_adapter *adapter = l->data;
+		const char *path = adapter_get_path(adapter);
 
-		array[i] = (char *) adapter_get_path(adapter);
-		i++;
+		dbus_message_iter_append_basic(&entry, DBUS_TYPE_OBJECT_PATH,
+								&path);
 	}
-	dict_append_array(&dict, "Adapters", DBUS_TYPE_OBJECT_PATH, &array, i);
-	g_free(array);
 
-	dbus_message_iter_close_container(&iter, &dict);
+	dbus_message_iter_close_container(iter, &entry);
 
-	return reply;
+	return TRUE;
 }
 
 static const GDBusMethodTable manager_methods[] = {
-	{ GDBUS_METHOD("GetProperties",
-			NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
-			get_properties) },
 	{ GDBUS_METHOD("DefaultAdapter",
 			NULL, GDBUS_ARGS({ "adapter", "o" }),
 			default_adapter) },
@@ -189,8 +173,6 @@ static const GDBusMethodTable manager_methods[] = {
 };
 
 static const GDBusSignalTable manager_signals[] = {
-	{ GDBUS_SIGNAL("PropertyChanged",
-			GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
 	{ GDBUS_SIGNAL("AdapterAdded",
 			GDBUS_ARGS({ "adapter", "o" })) },
 	{ GDBUS_SIGNAL("AdapterRemoved",
@@ -200,34 +182,19 @@ static const GDBusSignalTable manager_signals[] = {
 	{ }
 };
 
+static const GDBusPropertyTable manager_properties[] = {
+	{ "Adapters", "ao", manager_property_get_adapters },
+	{ }
+};
+
 dbus_bool_t manager_init(const char *path)
 {
 	snprintf(base_path, sizeof(base_path), "/org/bluez/%d", getpid());
 
 	return g_dbus_register_interface(btd_get_dbus_connection(),
 					"/", MANAGER_INTERFACE,
-					manager_methods, manager_signals, NULL,
-					NULL, NULL);
-}
-
-static void manager_update_adapters(void)
-{
-	GSList *list;
-	char **array;
-	int i;
-
-	array = g_new0(char *, g_slist_length(adapters) + 1);
-	for (i = 0, list = adapters; list; list = list->next) {
-		struct btd_adapter *adapter = list->data;
-
-		array[i] = (char *) adapter_get_path(adapter);
-		i++;
-	}
-
-	emit_array_property_changed("/", MANAGER_INTERFACE, "Adapters",
-					DBUS_TYPE_OBJECT_PATH, &array, i);
-
-	g_free(array);
+					manager_methods, manager_signals,
+					manager_properties, NULL, NULL);
 }
 
 static void manager_set_default_adapter(int id)
@@ -261,7 +228,8 @@ static void manager_remove_adapter(struct btd_adapter *adapter)
 
 	adapters = g_slist_remove(adapters, adapter);
 
-	manager_update_adapters();
+	g_dbus_emit_property_changed(btd_get_dbus_connection(), "/",
+					MANAGER_INTERFACE, "Adapters");
 
 	if (default_adapter_id == dev_id || default_adapter_id < 0) {
 		int new_default = hci_get_route(NULL);
@@ -381,7 +349,8 @@ struct btd_adapter *btd_manager_register_adapter(int id, gboolean up)
 				DBUS_TYPE_OBJECT_PATH, &path,
 				DBUS_TYPE_INVALID);
 
-	manager_update_adapters();
+	g_dbus_emit_property_changed(btd_get_dbus_connection(),  "/",
+					MANAGER_INTERFACE, "Adapters");
 
 	btd_stop_exit_timer();
 
-- 
1.7.12.2

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux