Exemplo n.º 1
0
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);
    }

}
Exemplo n.º 3
0
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);
}