All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH BlueZ 1/8] adapter: Add DBus.Properties getters
@ 2012-10-09  7:59 Lucas De Marchi
  2012-10-09  7:59 ` [PATCH BlueZ 2/8] adapter: Set Name through DBus.Properties Lucas De Marchi
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Lucas De Marchi @ 2012-10-09  7:59 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Lucas De Marchi

From: Lucas De Marchi <lucas.de.marchi@gmail.com>

---
 src/adapter.c | 221 +++++++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 149 insertions(+), 72 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 2f8c8a3..eb5fc83 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -1113,106 +1113,169 @@ static DBusMessage *adapter_stop_discovery(DBusConnection *conn,
 	return dbus_message_new_method_return(msg);
 }
 
-static DBusMessage *get_properties(DBusConnection *conn,
-					DBusMessage *msg, void *data)
+static gboolean adapter_property_get_address(
+					const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
 {
 	struct btd_adapter *adapter = data;
-	const char *property;
-	DBusMessage *reply;
-	DBusMessageIter iter;
-	DBusMessageIter dict;
 	char srcaddr[18];
-	gboolean value;
-	char **devices, **uuids;
-	int i;
-	GSList *l;
-	sdp_list_t *list;
+	const char *ptr;
 
 	ba2str(&adapter->bdaddr, srcaddr);
+	ptr = srcaddr;
 
-	if (check_address(srcaddr) < 0)
-		return btd_error_invalid_args(msg);
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &ptr);
 
-	reply = dbus_message_new_method_return(msg);
-	if (!reply)
-		return NULL;
+	return TRUE;
+}
 
-	dbus_message_iter_init_append(reply, &iter);
+static gboolean adapter_property_get_name(const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_adapter *adapter = data;
+	const char *ptr;
 
-	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);
+	ptr = adapter->name ?: "";
 
-	/* Address */
-	property = srcaddr;
-	dict_append_entry(&dict, "Address", DBUS_TYPE_STRING, &property);
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &ptr);
 
-	/* Name */
-	property = adapter->name ? : "";
+	return TRUE;
+}
 
-	dict_append_entry(&dict, "Name", DBUS_TYPE_STRING, &property);
+static gboolean adapter_property_get_class(const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_adapter *adapter = data;
 
-	/* Class */
-	dict_append_entry(&dict, "Class",
-				DBUS_TYPE_UINT32, &adapter->dev_class);
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32,
+							&adapter->dev_class);
+
+	return TRUE;
+}
+
+static gboolean adapter_property_get_powered(
+					const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_adapter *adapter = data;
+	dbus_bool_t value;
 
-	/* Powered */
 	value = (adapter->up && !adapter->off_requested) ? TRUE : FALSE;
-	dict_append_entry(&dict, "Powered", DBUS_TYPE_BOOLEAN, &value);
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &value);
+
+	return TRUE;
+}
+
+static gboolean adapter_property_get_discoverable(
+					const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_adapter *adapter = data;
+	dbus_bool_t value;
 
-	/* Discoverable */
 	value = adapter->scan_mode & SCAN_INQUIRY ? TRUE : FALSE;
-	dict_append_entry(&dict, "Discoverable", DBUS_TYPE_BOOLEAN, &value);
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &value);
 
-	/* Pairable */
-	dict_append_entry(&dict, "Pairable", DBUS_TYPE_BOOLEAN,
-				&adapter->pairable);
+	return TRUE;
+}
 
-	/* DiscoverableTimeout */
-	dict_append_entry(&dict, "DiscoverableTimeout",
-				DBUS_TYPE_UINT32, &adapter->discov_timeout);
+static gboolean adapter_property_get_pairable(
+					const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_adapter *adapter = data;
 
-	/* PairableTimeout */
-	dict_append_entry(&dict, "PairableTimeout",
-				DBUS_TYPE_UINT32, &adapter->pairable_timeout);
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN,
+							&adapter->pairable);
+	return TRUE;
+}
 
+static gboolean adapter_property_get_discoverable_timeout(
+					const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_adapter *adapter = data;
 
-	/* Discovering */
-	dict_append_entry(&dict, "Discovering", DBUS_TYPE_BOOLEAN,
-							&adapter->discovering);
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32,
+						&adapter->discov_timeout);
 
-	/* Devices */
-	devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
-	for (i = 0, l = adapter->devices; l; l = l->next, i++) {
-		struct btd_device *dev = l->data;
-		devices[i] = (char *) device_get_path(dev);
+	return TRUE;
+}
+
+static gboolean adapter_property_get_pairable_timeout(
+					const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_adapter *adapter = data;
+
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32,
+						&adapter->pairable_timeout);
+
+	return TRUE;
+}
+
+static gboolean adapter_property_get_discovering(
+					const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_adapter *adapter = data;
+
+	dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN,
+						&adapter->discovering);
+
+	return TRUE;
+}
+
+static gboolean adapter_property_get_devices(
+					const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_adapter *adapter = data;
+	DBusMessageIter entry;
+	GSList *l;
+
+	dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+				DBUS_TYPE_OBJECT_PATH_AS_STRING, &entry);
+
+	for (l = adapter->devices; l != NULL; l = l->next) {
+		const char *path = device_get_path(l->data);
+
+		dbus_message_iter_append_basic(&entry, DBUS_TYPE_OBJECT_PATH,
+								&path);
 	}
-	dict_append_array(&dict, "Devices", DBUS_TYPE_OBJECT_PATH,
-								&devices, i);
-	g_free(devices);
 
-	/* UUIDs */
-	uuids = g_new0(char *, sdp_list_len(adapter->services) + 1);
+	dbus_message_iter_close_container(iter, &entry);
 
-	for (i = 0, list = adapter->services; list; list = list->next) {
-		sdp_record_t *rec = list->data;
+	return TRUE;
+}
+
+static gboolean adapter_property_get_uuids(const GDBusPropertyTable *property,
+					DBusMessageIter *iter, void *data)
+{
+	struct btd_adapter *adapter = data;
+	DBusMessageIter entry;
+	sdp_list_t *l;
+
+	dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+					DBUS_TYPE_STRING_AS_STRING, &entry);
+
+	for (l = adapter->services; l != NULL; l = l->next) {
+		sdp_record_t *rec = l->data;
 		char *uuid;
 
 		uuid = bt_uuid2string(&rec->svclass);
-		if (uuid)
-			uuids[i++] = uuid;
-	}
-
-	dict_append_array(&dict, "UUIDs", DBUS_TYPE_STRING, &uuids, i);
+		if (uuid == NULL)
+			continue;
 
-	g_strfreev(uuids);
+		dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
+								&uuid);
+		g_free(uuid);
+	}
 
-	dbus_message_iter_close_container(&iter, &dict);
+	dbus_message_iter_close_container(iter, &entry);
 
-	return reply;
+	return TRUE;
 }
-
 static DBusMessage *set_property(DBusConnection *conn,
 					DBusMessage *msg, void *data)
 {
@@ -1656,9 +1719,6 @@ static DBusMessage *unregister_agent(DBusConnection *conn, DBusMessage *msg,
 }
 
 static const GDBusMethodTable adapter_methods[] = {
-	{ GDBUS_METHOD("GetProperties",
-			NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
-			get_properties) },
 	{ GDBUS_ASYNC_METHOD("SetProperty",
 			GDBUS_ARGS({ "name", "s" }, { "value", "v" }), NULL,
 			set_property) },
@@ -1714,6 +1774,22 @@ static const GDBusSignalTable adapter_signals[] = {
 	{ }
 };
 
+static const GDBusPropertyTable adapter_properties[] = {
+	{ "Address", "s", adapter_property_get_address },
+	{ "Name", "s", adapter_property_get_name },
+	{ "Class", "u", adapter_property_get_class },
+	{ "Powered", "b", adapter_property_get_powered },
+	{ "Discoverable", "b", adapter_property_get_discoverable },
+	{ "Pairable", "b", adapter_property_get_pairable },
+	{ "DiscoverableTimeout", "u",
+			adapter_property_get_discoverable_timeout },
+	{ "PairableTimeout", "u", adapter_property_get_pairable_timeout },
+	{ "Discovering", "b", adapter_property_get_discovering },
+	{ "Devices", "ao", adapter_property_get_devices },
+	{ "UUIDs", "as", adapter_property_get_uuids },
+	{ }
+};
+
 static void create_stored_device_from_profiles(char *key, char *value,
 						void *user_data)
 {
@@ -2624,8 +2700,9 @@ struct btd_adapter *adapter_create(int id)
 
 	if (!g_dbus_register_interface(btd_get_dbus_connection(),
 					path, ADAPTER_INTERFACE,
-					adapter_methods, adapter_signals, NULL,
-					adapter, adapter_free)) {
+					adapter_methods, adapter_signals,
+					adapter_properties, adapter,
+					adapter_free)) {
 		error("Adapter interface init failed on path %s", path);
 		adapter_free(adapter);
 		return NULL;
-- 
1.7.12.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-10-09 10:46 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-09  7:59 [PATCH BlueZ 1/8] adapter: Add DBus.Properties getters Lucas De Marchi
2012-10-09  7:59 ` [PATCH BlueZ 2/8] adapter: Set Name through DBus.Properties Lucas De Marchi
2012-10-09  7:59 ` [PATCH BlueZ 3/8] adapter: Set *Timeout " Lucas De Marchi
2012-10-09  7:59 ` [PATCH BlueZ 4/8] adapter: Refactor set_mode() in 2 functions Lucas De Marchi
2012-10-09  7:59 ` [PATCH BlueZ 5/8] adapter: Add session type to session_req Lucas De Marchi
2012-10-09  7:59 ` [PATCH BlueZ 6/8] adapter: Fix calling mgmt_set_pairable() with error set Lucas De Marchi
2012-10-09  7:59 ` [PATCH BlueZ 7/8] adapter: Port remaining properties to DBus.Properties Lucas De Marchi
2012-10-09  7:59 ` [PATCH BlueZ 8/8] adapter: Emit signals through DBus.Properties Lucas De Marchi
2012-10-09 10:46 ` [PATCH BlueZ 1/8] adapter: Add DBus.Properties getters Johan Hedberg

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.