| /****************************************************************************** |
| * |
| * Copyright (C) 2014 The Android Open Source Project |
| * Copyright (C) 2003-2012 Broadcom Corporation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ******************************************************************************/ |
| |
| /****************************************************************************** |
| * |
| * This file contains action functions for MCE. |
| * |
| ******************************************************************************/ |
| |
| #include <hardware/bluetooth.h> |
| #include <arpa/inet.h> |
| |
| #include "bt_types.h" |
| #include "gki.h" |
| #include "bd.h" |
| #include "utl.h" |
| #include "bta_sys.h" |
| #include "bta_api.h" |
| #include "bta_mce_api.h" |
| #include "bta_mce_int.h" |
| #include "btm_api.h" |
| #include "btm_int.h" |
| #include "sdp_api.h" |
| #include <string.h> |
| |
| /***************************************************************************** |
| ** Constants |
| *****************************************************************************/ |
| |
| static const tBT_UUID bta_mce_mas_uuid = { |
| .len = 2, |
| .uu.uuid16 = UUID_SERVCLASS_MESSAGE_ACCESS |
| }; |
| |
| /******************************************************************************* |
| ** |
| ** Function bta_mce_search_cback |
| ** |
| ** Description Callback from btm after search is completed |
| ** |
| ** Returns void |
| ** |
| *******************************************************************************/ |
| |
| 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_DEBUG("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_DEBUG("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 bta_mce_enable |
| ** |
| ** Description Initializes the MCE I/F |
| ** |
| ** Returns void |
| ** |
| *******************************************************************************/ |
| void bta_mce_enable(tBTA_MCE_MSG *p_data) |
| { |
| tBTA_MCE_STATUS status = BTA_MCE_SUCCESS; |
| bta_mce_cb.p_dm_cback = p_data->enable.p_cback; |
| bta_mce_cb.p_dm_cback(BTA_MCE_ENABLE_EVT, (tBTA_MCE *)&status, NULL); |
| } |
| |
| /******************************************************************************* |
| ** |
| ** Function bta_mce_get_remote_mas_instances |
| ** |
| ** Description Discovers MAS instances on remote device |
| ** |
| ** Returns void |
| ** |
| *******************************************************************************/ |
| void bta_mce_get_remote_mas_instances(tBTA_MCE_MSG *p_data) |
| { |
| if(p_data == NULL) |
| { |
| APPL_TRACE_DEBUG("MCE control block handle is null"); |
| return; |
| } |
| tBTA_MCE_STATUS status = BTA_MCE_FAILURE; |
| |
| APPL_TRACE_DEBUG("%s in, sdp_active:%d", __FUNCTION__, bta_mce_cb.sdp_active); |
| |
| if (bta_mce_cb.sdp_active != BTA_MCE_SDP_ACT_NONE) |
| { |
| /* SDP is still in progress */ |
| status = BTA_MCE_BUSY; |
| if(bta_mce_cb.p_dm_cback) |
| bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE *)&status, NULL); |
| |
| return; |
| } |
| |
| bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_YES; |
| bdcpy(bta_mce_cb.remote_addr, p_data->get_rmt_mas.bd_addr); |
| |
| SDP_InitDiscoveryDb (p_bta_mce_cfg->p_sdp_db, p_bta_mce_cfg->sdp_db_size, 1, |
| (tBT_UUID*) &bta_mce_mas_uuid, 0, NULL); |
| |
| if (!SDP_ServiceSearchAttributeRequest2(p_data->get_rmt_mas.bd_addr, p_bta_mce_cfg->p_sdp_db, |
| bta_mce_search_cback, NULL)) |
| { |
| bta_mce_cb.sdp_active = BTA_MCE_SDP_ACT_NONE; |
| |
| /* failed to start SDP. report the failure right away */ |
| if (bta_mce_cb.p_dm_cback) |
| bta_mce_cb.p_dm_cback(BTA_MCE_MAS_DISCOVERY_COMP_EVT, (tBTA_MCE *)&status, NULL); |
| } |
| /* |
| else report the result when the cback is called |
| */ |
| } |