* [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
* [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
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).