1 /******************************************************************************
2  *
3  *  Copyright 2014 The Android Open Source Project
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  *  This is the implementation of the API for SDP search subsystem
22  *
23  ******************************************************************************/
24 
25 #include <string.h>
26 
27 #include "bt_common.h"
28 #include "bta_api.h"
29 #include "bta_sdp_api.h"
30 #include "bta_sdp_int.h"
31 #include "bta_sys.h"
32 #include "port_api.h"
33 #include "sdp_api.h"
34 
35 /*****************************************************************************
36  *  Constants
37  ****************************************************************************/
38 
39 static const tBTA_SYS_REG bta_sdp_reg = {bta_sdp_sm_execute, NULL};
40 
41 /*******************************************************************************
42  *
43  * Function         BTA_SdpEnable
44  *
45  * Description      Enable the SDP search I/F service. When the enable
46  *                  operation is complete the callback function will be
47  *                  called with a BTA_SDP_ENABLE_EVT. This function must
48  *                  be called before other functions in the SDP search API are
49  *                  called.
50  *
51  * Returns          BTA_SDP_SUCCESS if successful.
52  *                  BTA_SDP_FAIL if internal failure.
53  *
54  ******************************************************************************/
BTA_SdpEnable(tBTA_SDP_DM_CBACK * p_cback)55 tBTA_SDP_STATUS BTA_SdpEnable(tBTA_SDP_DM_CBACK* p_cback) {
56   tBTA_SDP_STATUS status = BTA_SDP_FAILURE;
57 
58   APPL_TRACE_API(__func__);
59   if (p_cback && !bta_sys_is_register(BTA_ID_SDP)) {
60     memset(&bta_sdp_cb, 0, sizeof(tBTA_SDP_CB));
61 
62     /* register with BTA system manager */
63     bta_sys_register(BTA_ID_SDP, &bta_sdp_reg);
64 
65     if (p_cback) {
66       tBTA_SDP_API_ENABLE* p_buf =
67           (tBTA_SDP_API_ENABLE*)osi_malloc(sizeof(tBTA_SDP_API_ENABLE));
68       p_buf->hdr.event = BTA_SDP_API_ENABLE_EVT;
69       p_buf->p_cback = p_cback;
70       bta_sys_sendmsg(p_buf);
71       status = BTA_SDP_SUCCESS;
72     }
73   }
74   return status;
75 }
76 
77 /*******************************************************************************
78  *
79  * Function         BTA_SdpSearch
80  *
81  * Description      This function performs service discovery for a specific
82  *                  service on given peer device. When the operation is
83  *                  completed the tBTA_SDP_DM_CBACK callback function will be
84  *                  called with a BTA_SDP_SEARCH_COMPLETE_EVT.
85  *
86  * Returns          BTA_SDP_SUCCESS, if the request is being processed.
87  *                  BTA_SDP_FAILURE, otherwise.
88  *
89  ******************************************************************************/
BTA_SdpSearch(const RawAddress & bd_addr,const bluetooth::Uuid & uuid)90 tBTA_SDP_STATUS BTA_SdpSearch(const RawAddress& bd_addr,
91                               const bluetooth::Uuid& uuid) {
92   tBTA_SDP_API_SEARCH* p_msg =
93       (tBTA_SDP_API_SEARCH*)osi_malloc(sizeof(tBTA_SDP_API_SEARCH));
94 
95   APPL_TRACE_API("%s", __func__);
96 
97   p_msg->hdr.event = BTA_SDP_API_SEARCH_EVT;
98   p_msg->bd_addr = bd_addr;
99   p_msg->uuid = uuid;
100 
101   bta_sys_sendmsg(p_msg);
102 
103   return BTA_SDP_SUCCESS;
104 }
105 
106 /*******************************************************************************
107  *
108  * Function         BTA_SdpCreateRecordByUser
109  *
110  * Description      This function is used to request a callback to create a SDP
111  *                  record. The registered callback will be called with event
112  *                  BTA_SDP_CREATE_RECORD_USER_EVT.
113  *
114  * Returns          BTA_SDP_SUCCESS, if the request is being processed.
115  *                  BTA_SDP_FAILURE, otherwise.
116  *
117  ******************************************************************************/
BTA_SdpCreateRecordByUser(void * user_data)118 tBTA_SDP_STATUS BTA_SdpCreateRecordByUser(void* user_data) {
119   tBTA_SDP_API_RECORD_USER* p_msg =
120       (tBTA_SDP_API_RECORD_USER*)osi_malloc(sizeof(tBTA_SDP_API_RECORD_USER));
121 
122   APPL_TRACE_API("%s", __func__);
123 
124   p_msg->hdr.event = BTA_SDP_API_CREATE_RECORD_USER_EVT;
125   p_msg->user_data = user_data;
126 
127   bta_sys_sendmsg(p_msg);
128 
129   return BTA_SDP_SUCCESS;
130 }
131 
132 /*******************************************************************************
133  *
134  * Function         BTA_SdpRemoveRecordByUser
135  *
136  * Description      This function is used to request a callback to remove a SDP
137  *                  record. The registered callback will be called with event
138  *                  BTA_SDP_REMOVE_RECORD_USER_EVT.
139  *
140  * Returns          BTA_SDP_SUCCESS, if the request is being processed.
141  *                  BTA_SDP_FAILURE, otherwise.
142  *
143  ******************************************************************************/
BTA_SdpRemoveRecordByUser(void * user_data)144 tBTA_SDP_STATUS BTA_SdpRemoveRecordByUser(void* user_data) {
145   tBTA_SDP_API_RECORD_USER* p_msg =
146       (tBTA_SDP_API_RECORD_USER*)osi_malloc(sizeof(tBTA_SDP_API_RECORD_USER));
147 
148   APPL_TRACE_API("%s", __func__);
149 
150   p_msg->hdr.event = BTA_SDP_API_REMOVE_RECORD_USER_EVT;
151   p_msg->user_data = user_data;
152 
153   bta_sys_sendmsg(p_msg);
154 
155   return BTA_SDP_SUCCESS;
156 }
157