static void bta_mce_search_cback(UINT16 result, void * user_data) { tSDP_DISC_REC *p_rec = NULL; tBTA_MCE_MAS_DISCOVERY_COMP evt_data; int found = 0; APPL_TRACE_DEBUG1("bta_mce_start_discovery_cback res: 0x%x", result); bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_NONE; if (bta_mce_cb.p_dm_cback == NULL) return; evt_data.status = BTA_MCE_FAILURE; bdcpy(evt_data.remote_addr, bta_mce_cb.remote_addr); evt_data.num_mas = 0; if (result == SDP_SUCCESS || result == SDP_DB_FULL) { do { tSDP_DISC_ATTR *p_attr; tSDP_PROTOCOL_ELEM pe; p_rec = SDP_FindServiceUUIDInDb(p_bta_mce_cfg->p_sdp_db, (tBT_UUID*) &bta_mce_mas_uuid, p_rec); APPL_TRACE_DEBUG1("p_rec:%p", p_rec); if (p_rec == NULL) break; if (!SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_RFCOMM, &pe)) continue; evt_data.mas[found].scn = pe.params[0]; if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) == NULL) continue; evt_data.mas[found].p_srv_name = (char *) p_attr->attr_value.v.array; evt_data.mas[found].srv_name_len= SDP_DISC_ATTR_LEN(p_attr->attr_len_type); if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_MAS_INSTANCE_ID)) == NULL) break; evt_data.mas[found].instance_id = p_attr->attr_value.v.u8; if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_MSG_TYPE)) == NULL) break; evt_data.mas[found].msg_type = p_attr->attr_value.v.u8; found++; } while (p_rec != NULL && found < BTA_MCE_MAX_MAS_INSTANCES); evt_data.num_mas = found; evt_data.status = BTA_MCE_SUCCESS; } bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE*) &evt_data, user_data); }
/******************************************************************************* ** ** Function sdp_disconnect ** ** Description This function disconnects a connection. ** ** Returns void ** *******************************************************************************/ void sdp_disconnect (tCONN_CB*p_ccb, UINT16 reason) { #if (defined(SDP_BROWSE_PLUS) && SDP_BROWSE_PLUS == TRUE) /* If we are browsing for multiple UUIDs ... */ if ((p_ccb->con_state == SDP_STATE_CONNECTED) && (p_ccb->con_flags & SDP_FLAGS_IS_ORIG) && ((reason == SDP_SUCCESS) || (reason == SDP_NO_RECS_MATCH))) { /* If the browse found something, do no more searching */ if ((p_ccb->cur_uuid_idx == 0) && (p_ccb->p_db->p_first_rec)) p_ccb->cur_uuid_idx = p_ccb->p_db->num_uuid_filters; while (++p_ccb->cur_uuid_idx < p_ccb->p_db->num_uuid_filters) { /* Check we have not already found the UUID (maybe through browse) */ if ((p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].len == 2) && (SDP_FindServiceInDb (p_ccb->p_db, p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].uu.uuid16, NULL))) continue; if ((p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx].len > 2) && (SDP_FindServiceUUIDInDb (p_ccb->p_db, &p_ccb->p_db->uuid_filters[p_ccb->cur_uuid_idx], NULL))) continue; p_ccb->cur_handle = 0; SDP_TRACE_EVENT1 ("SDP - looking for for more, CID: 0x%x", p_ccb->connection_id); sdp_disc_connected (p_ccb); return; } } if ((reason == SDP_NO_RECS_MATCH) && (p_ccb->p_db->p_first_rec)) reason = SDP_SUCCESS; #endif SDP_TRACE_EVENT1 ("SDP - disconnect CID: 0x%x", p_ccb->connection_id); /* Check if we have a connection ID */ if (p_ccb->connection_id != 0) { L2CA_DisconnectReq (p_ccb->connection_id); p_ccb->disconnect_reason = reason; } /* If at setup state, we may not get callback ind from L2CAP */ /* Call user callback immediately */ if (p_ccb->con_state == SDP_STATE_CONN_SETUP) { /* Tell the user if he has a callback */ if (p_ccb->p_cb) (*p_ccb->p_cb) (reason); else if (p_ccb->p_cb2) (*p_ccb->p_cb2) (reason, p_ccb->user_data); sdpu_release_ccb (p_ccb); } }
static void hidh_search_callback (UINT16 sdp_result) { tSDP_DISCOVERY_DB *p_db = hh_cb.p_sdp_db; tSDP_DISC_REC *p_rec; tSDP_DISC_ATTR *p_attr, *p_subattr1, *p_subattr2, *p_repdesc; tBT_UUID hid_uuid; tHID_DEV_SDP_INFO *p_nvi = &hh_cb.sdp_rec; UINT16 attr_mask = 0; hid_uuid.len = LEN_UUID_16; hid_uuid.uu.uuid16 = UUID_SERVCLASS_HUMAN_INTERFACE; hh_cb.sdp_busy = FALSE; if (sdp_result != SDP_SUCCESS) { hh_cb.sdp_cback(sdp_result, 0, NULL); return; } if ((p_rec = SDP_FindServiceUUIDInDb (p_db, &hid_uuid, NULL)) == NULL) { hh_cb.sdp_cback(HID_SDP_NO_SERV_UUID, 0, NULL); return; } memset (&hh_cb.sdp_rec, 0, sizeof( tHID_DEV_SDP_INFO )); /* First, verify the mandatory fields we care about */ if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_DESCRIPTOR_LIST)) == NULL) || (SDP_DISC_ATTR_TYPE(p_attr->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE) || ((p_subattr1 = p_attr->attr_value.v.p_sub_attr) == NULL) || (SDP_DISC_ATTR_TYPE(p_subattr1->attr_len_type) != DATA_ELE_SEQ_DESC_TYPE) || ((p_subattr2 = p_subattr1->attr_value.v.p_sub_attr) == NULL) || ((p_repdesc = p_subattr2->p_next_attr) == NULL) || (SDP_DISC_ATTR_TYPE(p_repdesc->attr_len_type) != TEXT_STR_DESC_TYPE)) { hh_cb.sdp_cback(HID_SDP_MANDATORY_MISSING, 0, NULL); return; } if ((p_nvi->dscp_info.dl_len = SDP_DISC_ATTR_LEN(p_repdesc->attr_len_type)) != 0) p_nvi->dscp_info.dsc_list = (UINT8 *) &p_repdesc->attr_value; if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_VIRTUAL_CABLE)) != NULL) && (p_attr->attr_value.v.u8) ) { attr_mask |= HID_VIRTUAL_CABLE; } if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_RECONNECT_INITIATE)) != NULL) && (p_attr->attr_value.v.u8) ) { attr_mask |= HID_RECONN_INIT; } if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_NORMALLY_CONNECTABLE)) != NULL) && (p_attr->attr_value.v.u8) ) { attr_mask |= HID_NORMALLY_CONNECTABLE; } if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_SDP_DISABLE)) != NULL)&& (p_attr->attr_value.v.u8) ) { attr_mask |= HID_SDP_DISABLE; } if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_BATTERY_POWER)) != NULL)&& (p_attr->attr_value.v.u8) ) { attr_mask |= HID_BATTERY_POWER; } if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_REMOTE_WAKE)) != NULL)&& (p_attr->attr_value.v.u8) ) { attr_mask |= HID_REMOTE_WAKE; } hidh_get_str_attr( p_rec, ATTR_ID_SERVICE_NAME, HID_MAX_SVC_NAME_LEN, p_nvi->svc_name ); hidh_get_str_attr( p_rec, ATTR_ID_SERVICE_DESCRIPTION, HID_MAX_SVC_DESCR_LEN, p_nvi->svc_descr ); hidh_get_str_attr( p_rec, ATTR_ID_PROVIDER_NAME, HID_MAX_PROV_NAME_LEN, p_nvi->prov_name ); if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_DEVICE_RELNUM)) != NULL)) { p_nvi->rel_num = p_attr->attr_value.v.u16; } if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_COUNTRY_CODE)) != NULL)) { p_nvi->ctry_code = p_attr->attr_value.v.u8; } if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_DEVICE_SUBCLASS)) != NULL)) { p_nvi->sub_class = p_attr->attr_value.v.u8; } if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_PARSER_VERSION)) != NULL)) { p_nvi->hpars_ver = p_attr->attr_value.v.u16; } if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_LINK_SUPERVISION_TO)) != NULL)) { attr_mask |= HID_SUP_TOUT_AVLBL; p_nvi->sup_timeout = p_attr->attr_value.v.u16; } if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_SSR_HOST_MAX_LAT)) != NULL)) { attr_mask |= HID_SSR_MAX_LATENCY; p_nvi->ssr_max_latency = p_attr->attr_value.v.u16; } else p_nvi->ssr_max_latency = HID_SSR_PARAM_INVALID; if (((p_attr = SDP_FindAttributeInRec (p_rec, ATTR_ID_HID_SSR_HOST_MIN_TOUT)) != NULL)) { attr_mask |= HID_SSR_MIN_TOUT; p_nvi->ssr_min_tout = p_attr->attr_value.v.u16; } else p_nvi->ssr_max_latency = HID_SSR_PARAM_INVALID; hh_cb.sdp_rec.p_sdp_layer_rec = p_rec; hh_cb.sdp_cback(SDP_SUCCESS, attr_mask, &hh_cb.sdp_rec); }