15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2004-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains the audio gateway functions controlling the RFCOMM
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  connections.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
27f355ef5a4d7fb667fc57a0dfb60f738d870e252eMyles Watson
28cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bt_common.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_api.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_co.h"
31cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_ag_int.h"
32cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_api.h"
33cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#include "bta_sys.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
35d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "rfcdefs.h"
385cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "utl.h"
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Event mask for RfCOMM port callback */
41cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson#define BTA_AG_PORT_EV_MASK PORT_EV_RXCHAR
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* each scb has its own rfcomm callbacks */
44e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_port_cback_1(uint32_t code, uint16_t port_handle);
45e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_port_cback_2(uint32_t code, uint16_t port_handle);
46e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_port_cback_3(uint32_t code, uint16_t port_handle);
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
48e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_mgmt_cback_1(uint32_t code, uint16_t port_handle);
49e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_mgmt_cback_2(uint32_t code, uint16_t port_handle);
50e9e58ced195ec2c983c7723c9cbdabd45eb0f2fdMarie Janssenvoid bta_ag_mgmt_cback_3(uint32_t code, uint16_t port_handle);
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
52cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_1(uint16_t port_handle, void* p_data, uint16_t len);
53cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_2(uint16_t port_handle, void* p_data, uint16_t len);
54cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_3(uint16_t port_handle, void* p_data, uint16_t len);
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* rfcomm callback function tables */
57cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsontypedef tPORT_CALLBACK* tBTA_AG_PORT_CBACK;
58cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_AG_PORT_CBACK bta_ag_port_cback_tbl[] = {
59cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_ag_port_cback_1, bta_ag_port_cback_2, bta_ag_port_cback_3};
60cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
61cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_AG_PORT_CBACK bta_ag_mgmt_cback_tbl[] = {
62cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_ag_mgmt_cback_1, bta_ag_mgmt_cback_2, bta_ag_mgmt_cback_3};
63cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
64cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsontypedef tPORT_DATA_CALLBACK* tBTA_AG_DATA_CBACK;
65cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonconst tBTA_AG_DATA_CBACK bta_ag_data_cback_tbl[] = {
66cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_ag_data_cback_1, bta_ag_data_cback_2, bta_ag_data_cback_3};
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_port_cback
718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      RFCOMM Port callback
738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
768af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
778af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
78d35a648d39710bbc5ac59f8add85166455af5af7Myles Watsonstatic void bta_ag_port_cback(UNUSED_ATTR uint32_t code, uint16_t port_handle,
79cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              uint16_t handle) {
80cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_AG_SCB* p_scb;
81cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
82f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  p_scb = bta_ag_scb_by_idx(handle);
83f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  if (p_scb != NULL) {
84cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* ignore port events for port handles other than connected handle */
85cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (port_handle != p_scb->conn_handle) {
86cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_DEBUG(
87cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          "ag_port_cback ignoring handle:%d conn_handle = %d other handle = %d",
88cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          port_handle, p_scb->conn_handle, handle);
89cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      return;
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
91cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
92cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    BT_HDR* p_buf = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
93cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->event = BTA_AG_RFC_DATA_EVT;
94cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->layer_specific = handle;
95cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_sys_sendmsg(p_buf);
96cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_mgmt_cback
1028af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1038af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      RFCOMM management callback
1048af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1058af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1068af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1078af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1088af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
109cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic void bta_ag_mgmt_cback(uint32_t code, uint16_t port_handle,
110cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                              uint16_t handle) {
111cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  tBTA_AG_SCB* p_scb;
112cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint16_t event;
113cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t i;
114cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bool found_handle = false;
115cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
116cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  APPL_TRACE_DEBUG("ag_mgmt_cback : code = %d, port_handle = %d, handle = %d",
117cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                   code, port_handle, handle);
118cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
119f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  p_scb = bta_ag_scb_by_idx(handle);
120f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen  if (p_scb != NULL) {
121cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* ignore close event for port handles other than connected handle */
122cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if ((code != PORT_SUCCESS) && (port_handle != p_scb->conn_handle)) {
123cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      APPL_TRACE_DEBUG("ag_mgmt_cback ignoring handle:%d", port_handle);
124cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      return;
125cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
127cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (code == PORT_SUCCESS) {
128cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (p_scb->conn_handle) /* Outgoing connection */
129cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      {
130cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        if (port_handle == p_scb->conn_handle) found_handle = true;
131cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      } else /* Incoming connection */
132cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      {
133cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        for (i = 0; i < BTA_AG_NUM_IDX; i++) {
134cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          if (port_handle == p_scb->serv_handle[i]) found_handle = true;
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
136cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
138cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (!found_handle) {
139cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        APPL_TRACE_ERROR(
140cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            "bta_ag_mgmt_cback: PORT_SUCCESS, ignoring handle = %d",
141cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            port_handle);
142cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        return;
143cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
145cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      event = BTA_AG_RFC_OPEN_EVT;
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
147cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* distinguish server close events */
148cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    else if (port_handle == p_scb->conn_handle) {
149cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      event = BTA_AG_RFC_CLOSE_EVT;
150cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    } else {
151cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      event = BTA_AG_RFC_SRV_CLOSE_EVT;
152cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    }
153cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
154cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    tBTA_AG_RFC* p_buf = (tBTA_AG_RFC*)osi_malloc(sizeof(tBTA_AG_RFC));
155cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->hdr.event = event;
156cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->hdr.layer_specific = handle;
157cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->port_handle = port_handle;
158cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_sys_sendmsg(p_buf);
159cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1638af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1648af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_data_cback
1658af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1668af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      RFCOMM data callback
1678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
172cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonstatic int bta_ag_data_cback(UNUSED_ATTR uint16_t port_handle, void* p_data,
173cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                             uint16_t len, uint16_t handle) {
174cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* call data call-out directly */
175cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_ag_co_tx_write(handle, (uint8_t*)p_data, len);
176cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return 0;
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1808af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1818af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_port_cback_1 to 3
1828af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  bta_ag_mgmt_cback_1 to 3
1838af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1848af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      RFCOMM callback functions.  This is an easy way to
1858af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  distinguish scb from the callback.
1868af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1878af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1888af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
1898af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
1908af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
191cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_mgmt_cback_1(uint32_t code, uint16_t handle) {
192cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_ag_mgmt_cback(code, handle, 1);
193cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson}
194cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_mgmt_cback_2(uint32_t code, uint16_t handle) {
195cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_ag_mgmt_cback(code, handle, 2);
196cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson}
197cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_mgmt_cback_3(uint32_t code, uint16_t handle) {
198cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_ag_mgmt_cback(code, handle, 3);
199cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson}
200cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_port_cback_1(uint32_t code, uint16_t handle) {
201cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_ag_port_cback(code, handle, 1);
202cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson}
203cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_port_cback_2(uint32_t code, uint16_t handle) {
204cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_ag_port_cback(code, handle, 2);
205cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson}
206cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_port_cback_3(uint32_t code, uint16_t handle) {
207cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bta_ag_port_cback(code, handle, 3);
208cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson}
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2118af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2128af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_data_cback_1 to 3
2138af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2148af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      RFCOMM data callback functions.  This is an easy way to
2158af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *                  distinguish scb from the callback.
2168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
2198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
221cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_1(uint16_t port_handle, void* p_data, uint16_t len) {
222cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_ag_data_cback(port_handle, p_data, len, 1);
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
224cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_2(uint16_t port_handle, void* p_data, uint16_t len) {
225cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_ag_data_cback(port_handle, p_data, len, 2);
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
227cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonint bta_ag_data_cback_3(uint16_t port_handle, void* p_data, uint16_t len) {
228cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return bta_ag_data_cback(port_handle, p_data, len, 3);
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2328af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2338af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_setup_port
2348af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2358af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Setup RFCOMM port for use by AG.
2368af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
2398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
241cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_setup_port(tBTA_AG_SCB* p_scb, uint16_t handle) {
242cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint16_t i = bta_ag_scb_to_idx(p_scb) - 1;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
244cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* set up data callback if using pass through mode */
245cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (bta_ag_cb.parse_mode == BTA_AG_PASS_THROUGH) {
246cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    PORT_SetDataCallback(handle, bta_ag_data_cback_tbl[i]);
247cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
249cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  PORT_SetEventMask(handle, BTA_AG_PORT_EV_MASK);
250cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  PORT_SetEventCallback(handle, bta_ag_port_cback_tbl[i]);
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2548af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2558af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_start_servers
2568af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2578af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Setup RFCOMM servers for use by AG.
2588af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2598af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2608af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
2618af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2628af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
263cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_start_servers(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK services) {
264cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  int i;
265cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  int bta_ag_port_status;
266cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
267cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  services >>= BTA_HSP_SERVICE_ID;
268cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (i = 0; i < BTA_AG_NUM_IDX && services != 0; i++, services >>= 1) {
269cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* if service is set in mask */
270cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (services & 1) {
271cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      BTM_SetSecurityLevel(false, "", bta_ag_sec_id[i], p_scb->serv_sec_mask,
272cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                           BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM,
273cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                           bta_ag_cb.profile[i].scn);
274cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
275cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      bta_ag_port_status = RFCOMM_CreateConnection(
276cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          bta_ag_uuid[i], bta_ag_cb.profile[i].scn, true, BTA_AG_MTU,
277cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          (uint8_t*)bd_addr_any, &(p_scb->serv_handle[i]),
278cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          bta_ag_mgmt_cback_tbl[bta_ag_scb_to_idx(p_scb) - 1]);
279cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
280cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      if (bta_ag_port_status == PORT_SUCCESS) {
281cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        bta_ag_setup_port(p_scb, p_scb->serv_handle[i]);
282cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      } else {
283cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        /* TODO: CR#137125 to handle to error properly */
284cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        APPL_TRACE_DEBUG(
285cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            "bta_ag_start_servers: RFCOMM_CreateConnection returned error:%d",
286cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson            bta_ag_port_status);
287cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      }
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
289cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2938af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2948af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_close_servers
2958af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2968af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Close RFCOMM servers port for use by AG.
2978af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2988af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
2998af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
3008af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3018af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
302cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_close_servers(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK services) {
303cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  int i;
304cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
305cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  services >>= BTA_HSP_SERVICE_ID;
306cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (i = 0; i < BTA_AG_NUM_IDX && services != 0; i++, services >>= 1) {
307cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* if service is set in mask */
308cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (services & 1) {
309cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      RFCOMM_RemoveServer(p_scb->serv_handle[i]);
310cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      p_scb->serv_handle[i] = 0;
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
312cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3168af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3178af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_is_server_closed
3188af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3198af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Returns true if all servers are closed.
3208af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3218af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3228af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          true if all servers are closed, false otherwise
3238af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3248af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
325cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonbool bta_ag_is_server_closed(tBTA_AG_SCB* p_scb) {
326cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  uint8_t xx;
327cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  bool is_closed = true;
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
329cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  for (xx = 0; xx < BTA_AG_NUM_IDX; xx++) {
330cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if (p_scb->serv_handle[xx] != 0) is_closed = false;
331cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
333cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  return is_closed;
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3378af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3388af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_rfc_do_open
3398af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3408af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Open an RFCOMM connection to the peer device.
3418af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3428af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3438af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
3448af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3458af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
346cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_rfc_do_open(tBTA_AG_SCB* p_scb, tBTA_AG_DATA* p_data) {
347cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  BTM_SetSecurityLevel(true, "", bta_ag_sec_id[p_scb->conn_service],
348cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                       p_scb->cli_sec_mask, BT_PSM_RFCOMM, BTM_SEC_PROTO_RFCOMM,
349cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                       p_scb->peer_scn);
350cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
351cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (RFCOMM_CreateConnection(
352cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          bta_ag_uuid[p_scb->conn_service], p_scb->peer_scn, false, BTA_AG_MTU,
353cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          p_scb->peer_addr, &(p_scb->conn_handle),
354cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson          bta_ag_mgmt_cback_tbl[bta_ag_scb_to_idx(p_scb) - 1]) ==
355cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson      PORT_SUCCESS) {
356cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_ag_setup_port(p_scb, p_scb->conn_handle);
357cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    APPL_TRACE_DEBUG("bta_ag_rfc_do_open : conn_handle = %d",
358cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson                     p_scb->conn_handle);
359cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
360cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  /* RFCOMM create connection failed; send ourselves RFCOMM close event */
361cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  else {
362cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_ag_sm_execute(p_scb, BTA_AG_RFC_CLOSE_EVT, p_data);
363cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3678af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3688af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Function         bta_ag_rfc_do_close
3698af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3708af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Description      Close RFCOMM connection.
3718af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3728af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3738af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson * Returns          void
3748af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson *
3758af480e24549ba51a3f6858d9d9af504715e0beaMyles Watson ******************************************************************************/
376cd1fd07f1306e08fe048682dd5918987e579f937Myles Watsonvoid bta_ag_rfc_do_close(tBTA_AG_SCB* p_scb, UNUSED_ATTR tBTA_AG_DATA* p_data) {
377cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  if (p_scb->conn_handle) {
378cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    RFCOMM_RemoveConnection(p_scb->conn_handle);
379cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  } else {
380cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* Close API was called while AG is in Opening state.               */
381cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* Need to trigger the state machine to send callback to the app    */
382cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* and move back to INIT state.                                     */
383cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    tBTA_AG_RFC* p_buf = (tBTA_AG_RFC*)osi_malloc(sizeof(tBTA_AG_RFC));
384cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->hdr.event = BTA_AG_RFC_CLOSE_EVT;
385cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    p_buf->hdr.layer_specific = bta_ag_scb_to_idx(p_scb);
386cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    bta_sys_sendmsg(p_buf);
387cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson
388cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /* Cancel SDP if it had been started. */
389cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    /*
390cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    if(p_scb->p_disc_db)
391cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    {
392cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson        (void)SDP_CancelServiceSearch (p_scb->p_disc_db);
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
394cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson    */
395cd1fd07f1306e08fe048682dd5918987e579f937Myles Watson  }
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
397