diff options
-rw-r--r-- | hcid/dbus-sdp.c | 70 |
1 files changed, 51 insertions, 19 deletions
diff --git a/hcid/dbus-sdp.c b/hcid/dbus-sdp.c index 8e5758cc..37101fa9 100644 --- a/hcid/dbus-sdp.c +++ b/hcid/dbus-sdp.c @@ -65,19 +65,20 @@ #define DEFAULT_XML_BUF_SIZE 1024 typedef struct { - uint16_t dev_id; - char *dst; - void *search_data; + uint16_t dev_id; + char *dst; + void *search_data; get_record_cb_t *cb; - void *data; + void *data; } get_record_data_t; struct transaction_context { - DBusConnection *conn; - DBusMessage *rq; - sdp_session_t *session; - GIOChannel *io; - guint io_id; + DBusConnection *conn; + DBusMessage *rq; + sdp_session_t *session; + GIOChannel *io; + guint io_id; + uuid_t uuid; /* Used for internal async get remote service record implementation */ get_record_data_t *call; @@ -775,6 +776,42 @@ static void remote_svc_identifiers_completed_cb(uint8_t type, uint16_t err, goto failed; } + scanned = sdp_extract_seqtype(rsp, &dtd, &len); + + /* When the sequence is empty: check for L2CAP/DeviceID */ + if (!len && ctxt->uuid.type == SDP_UUID16) { + uint32_t range = 0x0000ffff; + sdp_list_t *attrids, *search; + + switch(ctxt->uuid.value.uuid16) { + case PUBLIC_BROWSE_GROUP: + sdp_uuid16_create(&ctxt->uuid, L2CAP_UUID); + break; + + /* FIXME: Try DeviceID(PNP_INFO_PROFILE_ID) */ + + default: /* Reply an empty array */ + goto done; + } + + search = sdp_list_append(0, &ctxt->uuid); + attrids = sdp_list_append(NULL, &range); + + if (sdp_service_search_attr_async(ctxt->session, search, + SDP_ATTR_REQ_RANGE, attrids) < 0) { + sdp_list_free(search, NULL); + sdp_list_free(attrids, NULL); + goto done; + } + + sdp_list_free(search, NULL); + sdp_list_free(attrids, NULL); + + /* Wait the L2CAP/DeviceID query */ + return; + } + +done: src = get_address_from_message(ctxt->conn, ctxt->rq); dbus_message_get_args(ctxt->rq, NULL, DBUS_TYPE_STRING, &dst, @@ -785,9 +822,6 @@ static void remote_svc_identifiers_completed_cb(uint8_t type, uint16_t err, dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, &array_iter); - /* Expected sequence of service class id list */ - scanned = sdp_extract_seqtype(rsp, &dtd, &len); - rsp += scanned; while (extracted < len) { sdp_record_t *rec; @@ -1025,7 +1059,6 @@ static int remote_svc_handles_conn_cb(struct transaction_context *ctxt) { sdp_list_t *search = NULL; const char *dst, *svc; - uuid_t uuid; if (sdp_set_notify(ctxt->session, remote_svc_handles_completed_cb, ctxt) < 0) return -EINVAL; @@ -1036,11 +1069,11 @@ static int remote_svc_handles_conn_cb(struct transaction_context *ctxt) DBUS_TYPE_INVALID); if (strlen(svc) > 0) - str2uuid(&uuid, svc); + str2uuid(&ctxt->uuid, svc); else - sdp_uuid16_create(&uuid, PUBLIC_BROWSE_GROUP); + sdp_uuid16_create(&ctxt->uuid, PUBLIC_BROWSE_GROUP); - search = sdp_list_append(0, &uuid); + search = sdp_list_append(0, &ctxt->uuid); /* Create/send the search request and set the callback to indicate the request completion */ if (sdp_service_search_async(ctxt->session, search, 64) < 0) { @@ -1057,15 +1090,14 @@ static int remote_svc_handles_conn_cb(struct transaction_context *ctxt) static int remote_svc_identifiers_conn_cb(struct transaction_context *ctxt) { sdp_list_t *attrids, *search; - uuid_t uuid; uint32_t range = 0x0000ffff; if (sdp_set_notify(ctxt->session, remote_svc_identifiers_completed_cb, ctxt) < 0) return -EINVAL; - sdp_uuid16_create(&uuid, PUBLIC_BROWSE_GROUP); - search = sdp_list_append(0, &uuid); + sdp_uuid16_create(&ctxt->uuid, PUBLIC_BROWSE_GROUP); + search = sdp_list_append(0, &ctxt->uuid); attrids = sdp_list_append(NULL, &range); |