linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/2] Report local services(UUIDs) through DBus
@ 2010-03-26 22:54 Francisco Alecrim
  0 siblings, 0 replies; 5+ messages in thread
From: Francisco Alecrim @ 2010-03-26 22:54 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Francisco Alecrim

Include UUIDs field to method GetProperties(org.bluez.Adapter).
Applications can get local services(UUIDs) available through DBus.
---
 doc/adapter-api.txt |    5 +++++
 src/adapter.c       |   20 +++++++++++++++++++-
 src/sdpd-database.c |   20 ++++++++++++++++++++
 src/sdpd.h          |    1 +
 test/list-devices   |    3 +++
 5 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/doc/adapter-api.txt b/doc/adapter-api.txt
index 48cab40..6098c76 100644
--- a/doc/adapter-api.txt
+++ b/doc/adapter-api.txt
@@ -270,3 +270,8 @@ Properties	string Address [readonly]
 		array{object} Devices [readonly]
 
 			List of device object paths.
+
+		array{string} UUIDs [readonly]
+
+			List of 128-bit UUIDs that represents the available
+			local services.
diff --git a/src/adapter.c b/src/adapter.c
index 5fd0736..2027484 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -37,6 +37,7 @@
 #include <bluetooth/hci.h>
 #include <bluetooth/hci_lib.h>
 #include <bluetooth/sdp.h>
+#include <bluetooth/sdp_lib.h>
 
 #include <glib.h>
 #include <dbus/dbus.h>
@@ -1196,7 +1197,8 @@ static DBusMessage *get_properties(DBusConnection *conn,
 	DBusMessageIter dict;
 	char str[MAX_NAME_LENGTH + 1], srcaddr[18];
 	gboolean value;
-	char **devices;
+	char **devices, **uuids;
+	sdp_list_t *list, *lfree;
 	int i;
 	GSList *l;
 
@@ -1270,6 +1272,22 @@ static DBusMessage *get_properties(DBusConnection *conn,
 								&devices, i);
 	g_free(devices);
 
+	/* UUIDs */
+	list = sdp_get_record_list_by_device(&adapter->bdaddr);
+	lfree = list; /* keep head to prevent leak */
+	uuids = g_new0(char *, sdp_list_len(list) + 1);
+
+	for (i = 0; list; list = list->next, i++) {
+		sdp_record_t *rec = list->data;
+		uuids[i] = bt_uuid2string(&rec->svclass);
+	}
+	dict_append_array(&dict, "UUIDs", DBUS_TYPE_STRING, &uuids, i);
+
+	sdp_list_free(lfree, NULL);
+	for (i = 0; uuids[i]; i++)
+		g_free(uuids[i]);
+	g_free(uuids);
+
 	dbus_message_iter_close_container(&iter, &dict);
 
 	return reply;
diff --git a/src/sdpd-database.c b/src/sdpd-database.c
index 07a0bc3..8f99758 100644
--- a/src/sdpd-database.c
+++ b/src/sdpd-database.c
@@ -273,6 +273,26 @@ sdp_list_t *sdp_get_access_list(void)
 	return access_db;
 }
 
+sdp_list_t *sdp_get_record_list_by_device(const bdaddr_t *device)
+{
+	sdp_list_t *list, *acc;
+
+	acc = access_db;
+	list = NULL;
+	for (; acc; acc = acc->next) {
+		sdp_access_t *a = acc->data;
+		sdp_record_t *rec = sdp_record_find(a->handle);
+		if (!rec)
+			continue;
+
+		if (bacmp(&a->device, device) == 0 ||
+				bacmp(&a->device, BDADDR_ANY) == 0)
+			list = sdp_list_append(list, rec);
+	}
+
+	return list;
+}
+
 int sdp_check_access(uint32_t handle, bdaddr_t *device)
 {
 	sdp_list_t *p = access_locate(handle);
diff --git a/src/sdpd.h b/src/sdpd.h
index 1352a83..15e163b 100644
--- a/src/sdpd.h
+++ b/src/sdpd.h
@@ -79,6 +79,7 @@ void sdp_record_add(const bdaddr_t *device, sdp_record_t *rec);
 int sdp_record_remove(uint32_t handle);
 sdp_list_t *sdp_get_record_list(void);
 sdp_list_t *sdp_get_access_list(void);
+sdp_list_t *sdp_get_record_list_by_device(const bdaddr_t *device);
 int sdp_check_access(uint32_t handle, bdaddr_t *device);
 uint32_t sdp_next_handle(void);
 
diff --git a/test/list-devices b/test/list-devices
index 511d0cf..9120714 100755
--- a/test/list-devices
+++ b/test/list-devices
@@ -40,6 +40,9 @@ for i in adapter_list:
 		if (key == "Devices"):
 			list = extract_objects(value)
 			print "    %s = %s" % (key, list)
+		elif (key == "UUIDs"):
+			list = extract_uuids(value)
+			print "    %s = %s" % (key, list)
 		else:
 			print "    %s = %s" % (key, value)
 
-- 
1.6.3.3


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

* [PATCH v2 0/2] Services through DBus and correct EIR
@ 2010-04-07 15:04 Francisco Alecrim
  2010-04-07 15:04 ` [PATCH v2 1/2] Report local services(UUIDs) through DBus Francisco Alecrim
  0 siblings, 1 reply; 5+ messages in thread
From: Francisco Alecrim @ 2010-04-07 15:04 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Francisco Alecrim

* Second version: 
** Remove unnecessary braces. Thanks Padovan!
** Correct some lines over 80 characters

* Claudio Takahasi suggested to use a list of uuid_t instead of sdp_list_t at
adapters->services. I consider sdp_list_t easy to use regarding functions
available at sdp_lib.h.

Francisco Alecrim (2):
  Report local services(UUIDs) through DBus
  Correct UUIDs list to EIR

 doc/adapter-api.txt |    5 +++
 src/adapter.c       |   92 +++++++++++++++++++++++++++++++++++++++++++++++++-
 src/adapter.h       |    2 +
 src/sdpd-database.c |    4 ++
 src/sdpd-service.c  |    5 ++-
 src/sdpd.h          |    3 +-
 test/list-devices   |    3 ++
 7 files changed, 109 insertions(+), 5 deletions(-)


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

* [PATCH v2 1/2] Report local services(UUIDs) through DBus
  2010-04-07 15:04 [PATCH v2 0/2] Services through DBus and correct EIR Francisco Alecrim
@ 2010-04-07 15:04 ` Francisco Alecrim
  2010-04-07 15:04   ` [PATCH v2 2/2] Correct UUIDs list to EIR Francisco Alecrim
  2010-04-07 15:30   ` [PATCH v2 1/2] Report local services(UUIDs) through DBus Johan Hedberg
  0 siblings, 2 replies; 5+ messages in thread
From: Francisco Alecrim @ 2010-04-07 15:04 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Francisco Alecrim

* Include UUIDs field to method GetProperties(org.bluez.Adapter).
Applications can get local services(UUIDs) available through DBus.
* UUIDs per-adapter stored at btd_adapter to prevent some searches not
necessary regarding it requires information from access_db and service_db.
* Emit Adapter.PropertyChanged signal when UUIDs change.
---
 doc/adapter-api.txt |    5 +++
 src/adapter.c       |   89 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/adapter.h       |    2 +
 src/sdpd-database.c |    4 ++
 test/list-devices   |    3 ++
 5 files changed, 102 insertions(+), 1 deletions(-)

diff --git a/doc/adapter-api.txt b/doc/adapter-api.txt
index 48cab40..6098c76 100644
--- a/doc/adapter-api.txt
+++ b/doc/adapter-api.txt
@@ -270,3 +270,8 @@ Properties	string Address [readonly]
 		array{object} Devices [readonly]
 
 			List of device object paths.
+
+		array{string} UUIDs [readonly]
+
+			List of 128-bit UUIDs that represents the available
+			local services.
diff --git a/src/adapter.c b/src/adapter.c
index 5fd0736..cdd5562 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -37,6 +37,7 @@
 #include <bluetooth/hci.h>
 #include <bluetooth/hci_lib.h>
 #include <bluetooth/sdp.h>
+#include <bluetooth/sdp_lib.h>
 
 #include <glib.h>
 #include <dbus/dbus.h>
@@ -115,6 +116,7 @@ struct btd_adapter {
 	GSList *mode_sessions;		/* Request Mode sessions */
 	GSList *disc_sessions;		/* Discovery sessions */
 	guint scheduler_id;		/* Scheduler handle */
+	sdp_list_t *services;		/* Services associated to adapter */
 
 	struct hci_dev dev;		/* hci info */
 	int8_t tx_power;		/* inq response tx power level */
@@ -1033,6 +1035,76 @@ static void adapter_update_devices(struct btd_adapter *adapter)
 	g_free(devices);
 }
 
+static void adapter_emit_uuids_updated(struct btd_adapter *adapter)
+{
+	char **uuids;
+	int i;
+	sdp_list_t *list;
+
+	uuids = g_new0(char *, sdp_list_len(adapter->services) + 1);
+
+	for (i = 0, list = adapter->services; list; list = list->next, i++) {
+		sdp_record_t *rec = list->data;
+		uuids[i] = bt_uuid2string(&rec->svclass);
+	}
+
+	emit_array_property_changed(connection, adapter->path,
+			ADAPTER_INTERFACE, "UUIDs",
+			DBUS_TYPE_STRING, &uuids);
+
+	for (i = 0; uuids[i]; i++)
+		g_free(uuids[i]);
+	g_free(uuids);
+}
+
+/*
+ * adapter_services_inc_rem - Insert or remove UUID from adapter
+ */
+static void adapter_service_ins_rem(const bdaddr_t *bdaddr, void *rec,
+		gboolean insert)
+{
+	struct btd_adapter *adapter;
+	GSList *adapters;
+
+	adapters = NULL;
+
+	if (bacmp(bdaddr, BDADDR_ANY) != 0) {
+		/* Only one adapter */
+		adapter = manager_find_adapter(bdaddr);
+		if (!adapter)
+			return;
+
+		adapters = g_slist_append(adapters, adapter);
+	} else
+		/* Emit D-Bus msg to all adapters */
+		adapters = manager_get_adapters();
+
+	for (; adapters; adapters = adapters->next) {
+		adapter = adapters->data;
+
+		if (insert == TRUE)
+			adapter->services = sdp_list_append(adapter->services,
+					rec);
+		else
+			adapter->services = sdp_list_remove(adapter->services,
+					rec);
+
+		adapter_emit_uuids_updated(adapter);
+	}
+}
+
+void adapter_service_insert(const bdaddr_t *bdaddr, void *rec)
+{
+	/* TRUE to include service*/
+	adapter_service_ins_rem(bdaddr, rec, TRUE);
+}
+
+void adapter_service_remove(const bdaddr_t *bdaddr, void *rec)
+{
+	/* FALSE to remove service*/
+	adapter_service_ins_rem(bdaddr, rec, FALSE);
+}
+
 struct btd_device *adapter_create_device(DBusConnection *conn,
 						struct btd_adapter *adapter,
 						const char *address)
@@ -1196,9 +1268,10 @@ static DBusMessage *get_properties(DBusConnection *conn,
 	DBusMessageIter dict;
 	char str[MAX_NAME_LENGTH + 1], srcaddr[18];
 	gboolean value;
-	char **devices;
+	char **devices, **uuids;
 	int i;
 	GSList *l;
+	sdp_list_t *list;
 
 	ba2str(&adapter->bdaddr, srcaddr);
 
@@ -1270,6 +1343,20 @@ static DBusMessage *get_properties(DBusConnection *conn,
 								&devices, i);
 	g_free(devices);
 
+	/* UUIDs */
+	uuids = g_new0(char *, sdp_list_len(adapter->services) + 1);
+
+	for (i = 0, list = adapter->services; list; list = list->next, i++) {
+		sdp_record_t *rec = list->data;
+		uuids[i] = bt_uuid2string(&rec->svclass);
+	}
+
+	dict_append_array(&dict, "UUIDs", DBUS_TYPE_STRING, &uuids, i);
+
+	for (i = 0; uuids[i]; i++)
+		g_free(uuids[i]);
+	g_free(uuids);
+
 	dbus_message_iter_close_container(&iter, &dict);
 
 	return reply;
diff --git a/src/adapter.h b/src/adapter.h
index 9b4ce10..e4307d8 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -121,6 +121,8 @@ void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode);
 void adapter_setname_complete(bdaddr_t *local, uint8_t status);
 void adapter_update_tx_power(bdaddr_t *bdaddr, uint8_t status, void *ptr);
 void adapter_update_local_name(bdaddr_t *bdaddr, uint8_t status, void *ptr);
+void adapter_service_insert(const bdaddr_t *bdaddr, void *rec);
+void adapter_service_remove(const bdaddr_t *bdaddr, void *rec);
 void adapter_set_class_complete(bdaddr_t *bdaddr, uint8_t status);
 
 struct agent *adapter_get_agent(struct btd_adapter *adapter);
diff --git a/src/sdpd-database.c b/src/sdpd-database.c
index 07a0bc3..224a4e7 100644
--- a/src/sdpd-database.c
+++ b/src/sdpd-database.c
@@ -40,6 +40,7 @@
 
 #include "sdpd.h"
 #include "logging.h"
+#include "adapter.h"
 
 static sdp_list_t *service_db;
 static sdp_list_t *access_db;
@@ -183,6 +184,8 @@ void sdp_record_add(const bdaddr_t *device, sdp_record_t *rec)
 	dev->handle = rec->handle;
 
 	access_db = sdp_list_insert_sorted(access_db, dev, access_sort);
+
+	adapter_service_insert(device, rec);
 }
 
 static sdp_list_t *record_locate(uint32_t handle)
@@ -252,6 +255,7 @@ int sdp_record_remove(uint32_t handle)
 	if (p) {
 		a = (sdp_access_t *) p->data;
 		if (a) {
+			adapter_service_remove(&a->device, r);
 			access_db = sdp_list_remove(access_db, a);
 			access_free(a);
 		}
diff --git a/test/list-devices b/test/list-devices
index 511d0cf..9120714 100755
--- a/test/list-devices
+++ b/test/list-devices
@@ -40,6 +40,9 @@ for i in adapter_list:
 		if (key == "Devices"):
 			list = extract_objects(value)
 			print "    %s = %s" % (key, list)
+		elif (key == "UUIDs"):
+			list = extract_uuids(value)
+			print "    %s = %s" % (key, list)
 		else:
 			print "    %s = %s" % (key, value)
 
-- 
1.6.3.3


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

* [PATCH v2 2/2] Correct UUIDs list to EIR
  2010-04-07 15:04 ` [PATCH v2 1/2] Report local services(UUIDs) through DBus Francisco Alecrim
@ 2010-04-07 15:04   ` Francisco Alecrim
  2010-04-07 15:30   ` [PATCH v2 1/2] Report local services(UUIDs) through DBus Johan Hedberg
  1 sibling, 0 replies; 5+ messages in thread
From: Francisco Alecrim @ 2010-04-07 15:04 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Francisco Alecrim

Correct create_ext_inquiry_response to response only UUIDs per-adapter.
---
 src/adapter.c      |    3 ++-
 src/sdpd-service.c |    5 +++--
 src/sdpd.h         |    3 ++-
 3 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index cdd5562..7008410 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -816,7 +816,8 @@ static void update_ext_inquiry_response(struct btd_adapter *adapter)
 
 	if (dev->ssp_mode > 0)
 		create_ext_inquiry_response((char *) dev->name,
-						adapter->tx_power, data);
+						adapter->tx_power,
+						adapter->services, data);
 
 	if (hci_write_ext_inquiry_response(dd, fec, data,
 						HCI_REQ_TIMEOUT) < 0)
diff --git a/src/sdpd-service.c b/src/sdpd-service.c
index a8f7d47..4551577 100644
--- a/src/sdpd-service.c
+++ b/src/sdpd-service.c
@@ -167,9 +167,10 @@ uint8_t get_service_classes(const bdaddr_t *bdaddr)
 }
 
 void create_ext_inquiry_response(const char *name,
-					int8_t tx_power, uint8_t *data)
+					int8_t tx_power, sdp_list_t *services,
+					uint8_t *data)
 {
-	sdp_list_t *list = sdp_get_record_list();
+	sdp_list_t *list = services;
 	uint8_t *ptr = data;
 	uint16_t uuid[24];
 	int i, index = 0;
diff --git a/src/sdpd.h b/src/sdpd.h
index 1352a83..1f0a229 100644
--- a/src/sdpd.h
+++ b/src/sdpd.h
@@ -95,4 +95,5 @@ int remove_record_from_server(uint32_t handle);
 
 uint8_t get_service_classes(const bdaddr_t *bdaddr);
 void create_ext_inquiry_response(const char *name,
-					int8_t tx_power, uint8_t *data);
+					int8_t tx_power, sdp_list_t *services,
+					uint8_t *data);
-- 
1.6.3.3


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

* Re: [PATCH v2 1/2] Report local services(UUIDs) through DBus
  2010-04-07 15:04 ` [PATCH v2 1/2] Report local services(UUIDs) through DBus Francisco Alecrim
  2010-04-07 15:04   ` [PATCH v2 2/2] Correct UUIDs list to EIR Francisco Alecrim
@ 2010-04-07 15:30   ` Johan Hedberg
  1 sibling, 0 replies; 5+ messages in thread
From: Johan Hedberg @ 2010-04-07 15:30 UTC (permalink / raw)
  To: Francisco Alecrim; +Cc: linux-bluetooth

Hi Alecrim,

A few more minor correction suggestions:

On Wed, Apr 07, 2010, Francisco Alecrim wrote:
> +	emit_array_property_changed(connection, adapter->path,
> +			ADAPTER_INTERFACE, "UUIDs",
> +			DBUS_TYPE_STRING, &uuids);

The general rule for continuation line indenting is: indent as much as
possible as long as the total length doesn't go beyond 80. It looks like
these two lines could be indented a bit more. There are a few other
similar places too but I think you should be able to find them by
yourself.

> +	for (i = 0; uuids[i]; i++)
> +		g_free(uuids[i]);
> +	g_free(uuids);

These three lines could be replaced simply with g_strfreev(uuids);

> +	for (i = 0; uuids[i]; i++)
> +		g_free(uuids[i]);
> +	g_free(uuids);

And same here.

Johan

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

end of thread, other threads:[~2010-04-07 15:30 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-07 15:04 [PATCH v2 0/2] Services through DBus and correct EIR Francisco Alecrim
2010-04-07 15:04 ` [PATCH v2 1/2] Report local services(UUIDs) through DBus Francisco Alecrim
2010-04-07 15:04   ` [PATCH v2 2/2] Correct UUIDs list to EIR Francisco Alecrim
2010-04-07 15:30   ` [PATCH v2 1/2] Report local services(UUIDs) through DBus Johan Hedberg
  -- strict thread matches above, loose matches on Subject: below --
2010-03-26 22:54 Francisco Alecrim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).