1 /****************************************************************************** 2 * 3 * Copyright (C) 2014 Samsung System LSI 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /************************************************************************************ 20 * 21 * Filename: btif_sdp.c 22 * Description: SDP Bluetooth Interface. 23 * Implements the generic message handling and search functionality. 24 * References btif_sdp_server.c for SDP record creation. 25 * 26 ***********************************************************************************/ 27 28 #include <hardware/bluetooth.h> 29 #include <hardware/bt_sdp.h> 30 #include <stdlib.h> 31 #include <string.h> 32 33 #define LOG_TAG "BTIF_SDP" 34 #include "btif_common.h" 35 #include "btif_util.h" 36 #include "btif_profile_queue.h" 37 #include "bta_api.h" 38 #include "bta_sdp_api.h" 39 40 /***************************************************************************** 41 ** Functions implemented in sdp_server.c 42 ******************************************************************************/ 43 bt_status_t sdp_server_init(); 44 void sdp_server_cleanup(); 45 bt_status_t create_sdp_record(bluetooth_sdp_record *records, int* record_handles); 46 bt_status_t remove_sdp_record(int record_handle); 47 void on_create_record_event(int handle); 48 void on_remove_record_event(int handle); 49 50 // Utility functions: 51 int get_sdp_records_size(bluetooth_sdp_record* in_record, int count); 52 void copy_sdp_records(bluetooth_sdp_record* in_records, 53 bluetooth_sdp_record* out_records, int count); 54 55 56 /***************************************************************************** 57 ** Static variables 58 ******************************************************************************/ 59 60 static btsdp_callbacks_t *bt_sdp_callbacks = NULL; 61 62 static void btif_sdp_search_comp_evt(UINT16 event, char *p_param) 63 { 64 tBTA_SDP_SEARCH_COMP *evt_data = (tBTA_SDP_SEARCH_COMP*) p_param; 65 bt_bdaddr_t addr; 66 BTIF_TRACE_DEBUG("%s: event = %d", __FUNCTION__, event); 67 68 if (event != BTA_SDP_SEARCH_COMP_EVT) 69 return; 70 71 bdcpy(addr.address, evt_data->remote_addr); 72 73 HAL_CBACK(bt_sdp_callbacks, sdp_search_cb, evt_data->status, 74 &addr, (uint8_t*)(evt_data->uuid.uu.uuid128), 75 evt_data->record_count, evt_data->records); 76 } 77 78 static void sdp_search_comp_copy_cb(UINT16 event, char *p_dest, char *p_src) 79 { 80 tBTA_SDP_SEARCH_COMP *p_dest_data = (tBTA_SDP_SEARCH_COMP *) p_dest; 81 tBTA_SDP_SEARCH_COMP *p_src_data = (tBTA_SDP_SEARCH_COMP *) p_src; 82 83 if (!p_src) 84 return; 85 86 if (event != BTA_SDP_SEARCH_COMP_EVT) 87 return; 88 89 memcpy(p_dest_data, p_src_data, sizeof(tBTA_SDP_SEARCH_COMP)); 90 91 copy_sdp_records(p_src_data->records, p_dest_data->records, p_src_data->record_count); 92 } 93 94 static void sdp_dm_cback(tBTA_SDP_EVT event, tBTA_SDP *p_data, void *user_data) 95 { 96 switch (event) 97 { 98 case BTA_SDP_SEARCH_COMP_EVT: 99 { 100 int size = sizeof(tBTA_SDP); 101 size += get_sdp_records_size(p_data->sdp_search_comp.records, 102 p_data->sdp_search_comp.record_count); 103 104 /* need to deep copy the record content */ 105 btif_transfer_context(btif_sdp_search_comp_evt, event, 106 (char*)p_data, size, sdp_search_comp_copy_cb); 107 break; 108 } 109 case BTA_SDP_CREATE_RECORD_USER_EVT: 110 { 111 on_create_record_event((int)user_data); 112 break; 113 } 114 case BTA_SDP_REMOVE_RECORD_USER_EVT: 115 { 116 on_remove_record_event((int)user_data); 117 break; 118 } 119 default: 120 break; 121 } 122 } 123 124 static bt_status_t init(btsdp_callbacks_t* callbacks) 125 { 126 BTIF_TRACE_DEBUG("Sdp Search %s", __FUNCTION__); 127 128 bt_sdp_callbacks = callbacks; 129 sdp_server_init(); 130 131 btif_enable_service(BTA_SDP_SERVICE_ID); 132 133 return BT_STATUS_SUCCESS; 134 } 135 136 static bt_status_t deinit() 137 { 138 BTIF_TRACE_DEBUG("Sdp Search %s", __FUNCTION__); 139 140 bt_sdp_callbacks = NULL; 141 sdp_server_cleanup(); 142 btif_disable_service(BTA_SDP_SERVICE_ID); 143 144 return BT_STATUS_SUCCESS; 145 } 146 147 148 static bt_status_t search(bt_bdaddr_t *bd_addr, const uint8_t *uuid) 149 { 150 bdstr_t bdstr; 151 tSDP_UUID sdp_uuid; 152 sdp_uuid.len = 16; 153 memcpy(sdp_uuid.uu.uuid128, uuid, sizeof(sdp_uuid.uu.uuid128)); 154 155 BTA_SdpSearch(bd_addr->address, &sdp_uuid); 156 157 return BT_STATUS_SUCCESS; 158 } 159 160 static const btsdp_interface_t sdp_if = { 161 sizeof(btsdp_interface_t), 162 init, 163 deinit, 164 search, 165 create_sdp_record, 166 remove_sdp_record 167 }; 168 169 const btsdp_interface_t *btif_sdp_get_interface(void) 170 { 171 BTIF_TRACE_DEBUG("%s", __FUNCTION__); 172 return &sdp_if; 173 } 174 175 /******************************************************************************* 176 ** 177 ** Function btif_sdp_execute_service 178 ** 179 ** Description Initializes/Shuts down the service 180 ** 181 ** Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise 182 ** 183 *******************************************************************************/ 184 bt_status_t btif_sdp_execute_service(BOOLEAN b_enable) 185 { 186 BTIF_TRACE_DEBUG("%s enable:%d", __FUNCTION__, b_enable); 187 188 if (b_enable) 189 { 190 BTA_SdpEnable(sdp_dm_cback); 191 } 192 else 193 { 194 /* This is called on BT disable so no need to extra cleanup */ 195 } 196 return BT_STATUS_SUCCESS; 197 } 198 199