diff options
| -rw-r--r-- | src/device.c | 36 | 
1 files changed, 28 insertions, 8 deletions
| diff --git a/src/device.c b/src/device.c index 2bc50711..1cf260ec 100644 --- a/src/device.c +++ b/src/device.c @@ -87,6 +87,7 @@ struct browse_req {  	struct btd_device *device;  	GSList *uuids_added;  	GSList *uuids_removed; +	sdp_list_t *records;  	int search_uuid;  	gboolean browse;  }; @@ -776,6 +777,7 @@ static void update_services(struct browse_req *req, sdp_list_t *recs)  	for (seq = recs; seq; seq = seq->next) {  		sdp_record_t *rec = (sdp_record_t *) seq->data; +		sdp_buf_t pdu;  		sdp_list_t *svcclass = NULL;  		gchar *uuid_str;  		GSList *l; @@ -792,6 +794,16 @@ static void update_services(struct browse_req *req, sdp_list_t *recs)  		if (!uuid_str)  			continue; +		/* Copy record */ +		if (sdp_gen_record_pdu(rec, &pdu) == 0) { +			sdp_record_t *record; +			int scanned; + +			record = sdp_extract_pdu(pdu.data, pdu.data_size, +						&scanned); +			req->records = sdp_list_append(req->records, record); +		} +  		l = g_slist_find_custom(device->uuids, uuid_str,  				(GCompareFunc) strcmp);  		if (!l) @@ -837,8 +849,11 @@ static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)  	DBusMessage *reply;  	const gchar *source = adapter_get_address(adapter); -	if (err < 0) +	if (err < 0) { +		error("%s: error updating services: %s (%d)", +				device->path, strerror(-err), -err);  		goto proceed; +	}  	update_services(req, recs); @@ -856,27 +871,30 @@ static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)  probe: -	if (!req->uuids_added && !req->uuids_removed) +	if (!req->uuids_added && !req->uuids_removed) { +		debug("%s: No service found", device->path);  		goto proceed; +	}  	/* Probe matching drivers for services added */  	if (req->uuids_added) -		device_probe_drivers(device, req->uuids_added, recs); +		device_probe_drivers(device, req->uuids_added, req->records);  	/* Remove drivers for services removed */  	if (req->uuids_removed) -		device_remove_drivers(device, req->uuids_removed, recs); - -	/* Store the device's profiles in the filesystem */ -	store(device); +		device_remove_drivers(device, req->uuids_removed, req->records);  	/* Propagate services changes */  	services_changed(req);  proceed: + +	/* Store the device's profiles in the filesystem */ +	store(device); +  	if (dbus_message_is_method_call(req->msg, DEVICE_INTERFACE,  			"DiscoverServices")) { -		discover_device_reply(req, recs); +		discover_device_reply(req, req->records);  		goto cleanup;  	} @@ -910,6 +928,8 @@ cleanup:  	dbus_connection_unref(req->conn);  	g_slist_free(req->uuids_added);  	g_slist_free(req->uuids_removed); +	if (req->records) +		sdp_list_free(req->records, (sdp_free_func_t) sdp_record_free);  	g_free(req);  } | 
