diff options
-rw-r--r-- | src/device.c | 137 |
1 files changed, 30 insertions, 107 deletions
diff --git a/src/device.c b/src/device.c index 20e63d22..31cd9ca0 100644 --- a/src/device.c +++ b/src/device.c @@ -95,24 +95,17 @@ struct browse_req { DBusConnection *conn; DBusMessage *msg; struct btd_device *device; - GSList *uuids; - GSList *uuids_added; - GSList *uuids_removed; + GSList *match_uuids; + GSList *profiles_added; + GSList *profiles_removed; sdp_list_t *records; int search_uuid; }; static uint16_t uuid_list[] = { - PUBLIC_BROWSE_GROUP, + L2CAP_UUID, PNP_INFO_SVCLASS_ID, - HID_SVCLASS_ID, - GENERIC_AUDIO_SVCLASS_ID, - ADVANCED_AUDIO_SVCLASS_ID, - AV_REMOTE_SVCLASS_ID, - PANU_SVCLASS_ID, - GN_SVCLASS_ID, - NAP_SVCLASS_ID, - SERIAL_PORT_SVCLASS_ID, + PUBLIC_BROWSE_GROUP, 0 }; @@ -858,7 +851,7 @@ static void update_services(struct browse_req *req, sdp_list_t *recs) sdp_record_t *rec = (sdp_record_t *) seq->data; sdp_buf_t pdu; sdp_list_t *svcclass = NULL; - gchar *uuid_str; + gchar *profile_uuid; GSList *l; if (!rec) @@ -868,13 +861,13 @@ static void update_services(struct browse_req *req, sdp_list_t *recs) continue; /* Extract the first element and skip the remainning */ - uuid_str = bt_uuid2string(svcclass->data); - if (!uuid_str) { + profile_uuid = bt_uuid2string(svcclass->data); + if (!profile_uuid) { sdp_list_free(svcclass, free); continue; } - if (!strcasecmp(uuid_str, PNP_UUID)) { + if (!strcasecmp(profile_uuid, PNP_UUID)) { uint16_t source, vendor, product, version; sdp_data_t *pdlist; @@ -895,19 +888,9 @@ static void update_services(struct browse_req *req, sdp_list_t *recs) vendor, product, version); } - /* Driver UUID found */ - l = g_slist_find_custom(req->uuids, uuid_str, - (GCompareFunc) strcasecmp); - if (l) { - char *uuid = l->data; - - req->uuids = g_slist_remove(req->uuids, uuid); - g_free(uuid); - } - /* Check for duplicates */ if (sdp_list_find(req->records, rec, rec_cmp)) { - g_free(uuid_str); + g_free(profile_uuid); sdp_list_free(svcclass, free); continue; } @@ -925,15 +908,17 @@ static void update_services(struct browse_req *req, sdp_list_t *recs) req->records = sdp_list_append(req->records, record); } - l = g_slist_find_custom(device->uuids, uuid_str, + l = g_slist_find_custom(device->uuids, profile_uuid, (GCompareFunc) strcmp); if (!l) - req->uuids_added = g_slist_append(req->uuids_added, - uuid_str); + req->profiles_added = + g_slist_append(req->profiles_added, + profile_uuid); else { - req->uuids_removed = g_slist_remove(req->uuids_removed, - l->data); - g_free(uuid_str); + req->profiles_removed = + g_slist_remove(req->profiles_removed, + l->data); + g_free(profile_uuid); } sdp_list_free(svcclass, free); @@ -975,9 +960,9 @@ static void browse_req_free(struct browse_req *req) dbus_message_unref(req->msg); if (req->conn) dbus_connection_unref(req->conn); - g_slist_foreach(req->uuids_added, (GFunc) g_free, NULL); - g_slist_free(req->uuids_added); - g_slist_free(req->uuids_removed); + g_slist_foreach(req->profiles_added, (GFunc) g_free, NULL); + g_slist_free(req->profiles_added); + g_slist_free(req->profiles_removed); if (req->records) sdp_list_free(req->records, (sdp_free_func_t) sdp_record_free); g_free(req); @@ -997,7 +982,7 @@ static void search_cb(sdp_list_t *recs, int err, gpointer user_data) update_services(req, recs); - if (!req->uuids_added && !req->uuids_removed) { + if (!req->profiles_added && !req->profiles_removed) { debug("%s: No service update", device->path); goto proceed; } @@ -1009,12 +994,12 @@ static void search_cb(sdp_list_t *recs, int err, gpointer user_data) } /* Probe matching drivers for services added */ - if (req->uuids_added) - device_probe_drivers(device, req->uuids_added); + if (req->profiles_added) + device_probe_drivers(device, req->profiles_added); /* Remove drivers for services removed */ - if (req->uuids_removed) - device_remove_drivers(device, req->uuids_removed); + if (req->profiles_removed) + device_remove_drivers(device, req->profiles_removed); /* Propagate services changes */ services_changed(req->device); @@ -1064,9 +1049,9 @@ static void browse_cb(sdp_list_t *recs, int err, gpointer user_data) bdaddr_t src; uuid_t uuid; - /* If we have a valid response and req->search_uuid == 1, then - public browsing was successful -- we don't need any more */ - if (err < 0 || (req->search_uuid == 1 && recs)) + /* If we have a valid response and req->search_uuid == 2, then + L2CAP UUID & PNP searching was successful -- we are done */ + if (err < 0 || (req->search_uuid == 2 && req->records)) goto done; update_services(req, recs); @@ -1081,76 +1066,14 @@ static void browse_cb(sdp_list_t *recs, int err, gpointer user_data) return; } - /* Search for drivers uuids */ - if (req->uuids) { - char *uuid_str = req->uuids->data; - - bt_string2uuid(&uuid, uuid_str); - req->uuids = g_slist_remove(req->uuids, uuid_str); - g_free(uuid_str); - sdp_uuid128_to_uuid(&uuid); - bt_search_service(&src, &device->bdaddr, &uuid, - browse_cb, user_data, NULL); - return; - } - - /* Search for l2cap uuid */ - if (!req->records) { - sdp_uuid16_create(&uuid, L2CAP_UUID); - bt_search_service(&src, &device->bdaddr, &uuid, - search_cb, user_data, NULL); - return; - } - done: search_cb(recs, err, user_data); } -static gboolean is_in_uuid_list(const char *uuid) -{ - uint16_t uuid16; - int i; - - /* Check for Bluetooth UUID-16 */ - if (strlen(uuid) != 36 || strncmp(uuid, "0000", 4) || - strcasecmp(uuid + 8, "-0000-1000-8000-00805F9B34FB")) - return FALSE; - - uuid16 = strtol(uuid, NULL, 16); - - for (i = 0; uuid_list[i]; i++) { - if (uuid16 == uuid_list[i]) - return TRUE; - } - - return FALSE; -} - static void init_browse(struct browse_req *req, gboolean reverse) { GSList *l; - for (l = device_drivers; l; l = l->next) { - struct btd_device_driver *driver = l->data; - int i; - - for (i = 0; driver->uuids[i]; i++) { - char *uuid; - - /* Check for duplicates in our default UUID list */ - if (is_in_uuid_list(driver->uuids[i])) - continue; - - /* ... and of UUIDs another driver already asked for */ - if (g_slist_find_custom(req->uuids, driver->uuids[i], - (GCompareFunc) strcasecmp)) - continue; - - uuid = g_strdup(driver->uuids[i]); - req->uuids = g_slist_append(req->uuids, uuid); - } - } - /* If we are doing reverse-SDP don't try to detect removed profiles * since some devices hide their service records while they are * connected @@ -1159,7 +1082,7 @@ static void init_browse(struct browse_req *req, gboolean reverse) return; for (l = req->device->uuids; l; l = l->next) - req->uuids_removed = g_slist_append(req->uuids_removed, + req->profiles_removed = g_slist_append(req->profiles_removed, l->data); } |