1 /****************************************************************************** 2 * 3 * Copyright (C) 2006-2012 Broadcom Corporation 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 JAVA API for Bluetooth Wireless 22 * Technology (JABWT) as specified by the JSR82 specificiation 23 * 24 ******************************************************************************/ 25 #include "bta_api.h" 26 #include "bta_sys.h" 27 #include "bta_jv_api.h" 28 #include "bta_jv_int.h" 29 #include "bt_common.h" 30 #include <string.h> 31 #include "port_api.h" 32 #include "sdp_api.h" 33 #include "utl.h" 34 #include "gap_api.h" 35 36 /***************************************************************************** 37 ** Constants 38 *****************************************************************************/ 39 40 static const tBTA_SYS_REG bta_jv_reg = 41 { 42 bta_jv_sm_execute, 43 NULL 44 }; 45 46 /******************************************************************************* 47 ** 48 ** Function BTA_JvEnable 49 ** 50 ** Description Enable the Java I/F service. When the enable 51 ** operation is complete the callback function will be 52 ** called with a BTA_JV_ENABLE_EVT. This function must 53 ** be called before other function in the JV API are 54 ** called. 55 ** 56 ** Returns BTA_JV_SUCCESS if successful. 57 ** BTA_JV_FAIL if internal failure. 58 ** 59 *******************************************************************************/ 60 tBTA_JV_STATUS BTA_JvEnable(tBTA_JV_DM_CBACK *p_cback) 61 { 62 tBTA_JV_STATUS status = BTA_JV_FAILURE; 63 int i; 64 65 APPL_TRACE_API( "BTA_JvEnable"); 66 if(p_cback && FALSE == bta_sys_is_register(BTA_ID_JV)) 67 { 68 memset(&bta_jv_cb, 0, sizeof(tBTA_JV_CB)); 69 /* set handle to invalid value by default */ 70 for (i=0; i<BTA_JV_PM_MAX_NUM; i++) 71 { 72 bta_jv_cb.pm_cb[i].handle = BTA_JV_PM_HANDLE_CLEAR; 73 } 74 75 /* register with BTA system manager */ 76 bta_sys_register(BTA_ID_JV, &bta_jv_reg); 77 78 if (p_cback) { 79 tBTA_JV_API_ENABLE *p_buf = 80 (tBTA_JV_API_ENABLE *)osi_malloc(sizeof(tBTA_JV_API_ENABLE)); 81 p_buf->hdr.event = BTA_JV_API_ENABLE_EVT; 82 p_buf->p_cback = p_cback; 83 bta_sys_sendmsg(p_buf); 84 status = BTA_JV_SUCCESS; 85 } 86 } 87 else 88 { 89 APPL_TRACE_ERROR("JVenable fails"); 90 } 91 return(status); 92 } 93 94 /******************************************************************************* 95 ** 96 ** Function BTA_JvDisable 97 ** 98 ** Description Disable the Java I/F 99 ** 100 ** Returns void 101 ** 102 *******************************************************************************/ 103 void BTA_JvDisable(void) 104 { 105 BT_HDR *p_buf = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 106 107 APPL_TRACE_API("%s", __func__); 108 109 bta_sys_deregister(BTA_ID_JV); 110 p_buf->event = BTA_JV_API_DISABLE_EVT; 111 112 bta_sys_sendmsg(p_buf); 113 } 114 115 /******************************************************************************* 116 ** 117 ** Function BTA_JvIsEncrypted 118 ** 119 ** Description This function checks if the link to peer device is encrypted 120 ** 121 ** Returns TRUE if encrypted. 122 ** FALSE if not. 123 ** 124 *******************************************************************************/ 125 BOOLEAN BTA_JvIsEncrypted(BD_ADDR bd_addr) 126 { 127 BOOLEAN is_encrypted = FALSE; 128 UINT8 sec_flags, le_flags; 129 130 if (BTM_GetSecurityFlags(bd_addr, &sec_flags) && 131 BTM_GetSecurityFlagsByTransport(bd_addr, &le_flags, BT_TRANSPORT_LE)) 132 { 133 if(sec_flags & BTM_SEC_FLAG_ENCRYPTED || 134 le_flags & BTM_SEC_FLAG_ENCRYPTED) 135 is_encrypted = TRUE; 136 } 137 return is_encrypted; 138 } 139 /******************************************************************************* 140 ** 141 ** Function BTA_JvGetChannelId 142 ** 143 ** Description This function reserves a SCN (server channel number) for 144 ** applications running over RFCOMM, L2CAP of L2CAP_LE. 145 ** It is primarily called by server profiles/applications to 146 ** register their SCN into the SDP database. The SCN is reported 147 ** by the tBTA_JV_DM_CBACK callback with a BTA_JV_GET_SCN_EVT 148 ** for RFCOMM channels and BTA_JV_GET_PSM_EVT for L2CAP and LE. 149 ** If the SCN/PSM reported is 0, that means all resources are 150 ** exhausted. 151 ** Parameters 152 ** conn_type one of BTA_JV_CONN_TYPE_ 153 ** user_data Any uservalue - will be returned in the resulting event. 154 ** channel Only used for RFCOMM - to try to allocate a specific RFCOMM 155 ** channel. 156 ** 157 ** Returns BTA_JV_SUCCESS, if the request is being processed. 158 ** BTA_JV_FAILURE, otherwise. 159 ** 160 *******************************************************************************/ 161 tBTA_JV_STATUS BTA_JvGetChannelId(int conn_type, void* user_data, INT32 channel) 162 { 163 tBTA_JV_API_ALLOC_CHANNEL *p_msg = 164 (tBTA_JV_API_ALLOC_CHANNEL *)osi_malloc(sizeof(tBTA_JV_API_ALLOC_CHANNEL)); 165 166 APPL_TRACE_API("%s", __func__); 167 168 p_msg->hdr.event = BTA_JV_API_GET_CHANNEL_EVT; 169 p_msg->type = conn_type; 170 p_msg->channel = channel; 171 p_msg->user_data = user_data; 172 173 bta_sys_sendmsg(p_msg); 174 175 return BTA_JV_SUCCESS; 176 177 } 178 179 /******************************************************************************* 180 ** 181 ** Function BTA_JvFreeChannel 182 ** 183 ** Description This function frees a server channel number that was used 184 ** by an application running over RFCOMM. 185 ** Parameters 186 ** channel The channel to free 187 ** conn_type one of BTA_JV_CONN_TYPE_ 188 ** 189 ** Returns BTA_JV_SUCCESS, if the request is being processed. 190 ** BTA_JV_FAILURE, otherwise. 191 ** 192 *******************************************************************************/ 193 tBTA_JV_STATUS BTA_JvFreeChannel(UINT16 channel, int conn_type) 194 { 195 tBTA_JV_API_FREE_CHANNEL *p_msg = 196 (tBTA_JV_API_FREE_CHANNEL *)osi_malloc(sizeof(tBTA_JV_API_FREE_CHANNEL)); 197 198 APPL_TRACE_API("%s", __func__); 199 200 p_msg->hdr.event = BTA_JV_API_FREE_SCN_EVT; 201 p_msg->scn = channel; 202 p_msg->type = conn_type; 203 204 bta_sys_sendmsg(p_msg); 205 206 return BTA_JV_SUCCESS; 207 } 208 209 /******************************************************************************* 210 ** 211 ** Function BTA_JvStartDiscovery 212 ** 213 ** Description This function performs service discovery for the services 214 ** provided by the given peer device. When the operation is 215 ** complete the tBTA_JV_DM_CBACK callback function will be 216 ** called with a BTA_JV_DISCOVERY_COMP_EVT. 217 ** 218 ** Returns BTA_JV_SUCCESS, if the request is being processed. 219 ** BTA_JV_FAILURE, otherwise. 220 ** 221 *******************************************************************************/ 222 tBTA_JV_STATUS BTA_JvStartDiscovery(BD_ADDR bd_addr, UINT16 num_uuid, 223 tSDP_UUID *p_uuid_list, void * user_data) 224 { 225 tBTA_JV_API_START_DISCOVERY *p_msg = 226 (tBTA_JV_API_START_DISCOVERY *)osi_malloc(sizeof(tBTA_JV_API_START_DISCOVERY)); 227 228 APPL_TRACE_API("%s", __func__); 229 230 p_msg->hdr.event = BTA_JV_API_START_DISCOVERY_EVT; 231 bdcpy(p_msg->bd_addr, bd_addr); 232 p_msg->num_uuid = num_uuid; 233 memcpy(p_msg->uuid_list, p_uuid_list, num_uuid * sizeof(tSDP_UUID)); 234 p_msg->num_attr = 0; 235 p_msg->user_data = user_data; 236 237 bta_sys_sendmsg(p_msg); 238 239 return BTA_JV_SUCCESS; 240 } 241 242 /******************************************************************************* 243 ** 244 ** Function BTA_JvCreateRecord 245 ** 246 ** Description Create a service record in the local SDP database. 247 ** When the operation is complete the tBTA_JV_DM_CBACK callback 248 ** function will be called with a BTA_JV_CREATE_RECORD_EVT. 249 ** 250 ** Returns BTA_JV_SUCCESS, if the request is being processed. 251 ** BTA_JV_FAILURE, otherwise. 252 ** 253 *******************************************************************************/ 254 tBTA_JV_STATUS BTA_JvCreateRecordByUser(void *user_data) 255 { 256 tBTA_JV_API_CREATE_RECORD *p_msg = 257 (tBTA_JV_API_CREATE_RECORD *)osi_malloc(sizeof(tBTA_JV_API_CREATE_RECORD)); 258 259 APPL_TRACE_API("%s", __func__); 260 261 p_msg->hdr.event = BTA_JV_API_CREATE_RECORD_EVT; 262 p_msg->user_data = user_data; 263 264 bta_sys_sendmsg(p_msg); 265 266 return BTA_JV_SUCCESS; 267 } 268 269 /******************************************************************************* 270 ** 271 ** Function BTA_JvDeleteRecord 272 ** 273 ** Description Delete a service record in the local SDP database. 274 ** 275 ** Returns BTA_JV_SUCCESS, if the request is being processed. 276 ** BTA_JV_FAILURE, otherwise. 277 ** 278 *******************************************************************************/ 279 tBTA_JV_STATUS BTA_JvDeleteRecord(UINT32 handle) 280 { 281 tBTA_JV_API_ADD_ATTRIBUTE *p_msg = 282 (tBTA_JV_API_ADD_ATTRIBUTE *)osi_malloc(sizeof(tBTA_JV_API_ADD_ATTRIBUTE)); 283 284 APPL_TRACE_API("%s", __func__); 285 286 p_msg->hdr.event = BTA_JV_API_DELETE_RECORD_EVT; 287 p_msg->handle = handle; 288 289 bta_sys_sendmsg(p_msg); 290 291 return BTA_JV_SUCCESS; 292 } 293 294 /******************************************************************************* 295 ** 296 ** Function BTA_JvL2capConnectLE 297 ** 298 ** Description Initiate an LE connection as a L2CAP client to the given BD 299 ** Address. 300 ** When the connection is initiated or failed to initiate, 301 ** tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_CL_INIT_EVT 302 ** When the connection is established or failed, 303 ** tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT 304 ** 305 ** Returns BTA_JV_SUCCESS, if the request is being processed. 306 ** BTA_JV_FAILURE, otherwise. 307 ** 308 *******************************************************************************/ 309 tBTA_JV_STATUS BTA_JvL2capConnectLE(tBTA_SEC sec_mask, tBTA_JV_ROLE role, 310 const tL2CAP_ERTM_INFO *ertm_info, UINT16 remote_chan, 311 UINT16 rx_mtu, tL2CAP_CFG_INFO *cfg, 312 BD_ADDR peer_bd_addr, tBTA_JV_L2CAP_CBACK *p_cback, void *user_data) 313 { 314 APPL_TRACE_API("%s", __func__); 315 316 if (p_cback == NULL) 317 return BTA_JV_FAILURE; /* Nothing to do */ 318 319 tBTA_JV_API_L2CAP_CONNECT *p_msg = 320 (tBTA_JV_API_L2CAP_CONNECT *)osi_malloc(sizeof(tBTA_JV_API_L2CAP_CONNECT)); 321 p_msg->hdr.event = BTA_JV_API_L2CAP_CONNECT_LE_EVT; 322 p_msg->sec_mask = sec_mask; 323 p_msg->role = role; 324 p_msg->remote_chan = remote_chan; 325 p_msg->rx_mtu = rx_mtu; 326 if (cfg != NULL) { 327 p_msg->has_cfg = TRUE; 328 p_msg->cfg = *cfg; 329 } else { 330 p_msg->has_cfg = FALSE; 331 } 332 if (ertm_info != NULL) { 333 p_msg->has_ertm_info = TRUE; 334 p_msg->ertm_info = *ertm_info; 335 } else { 336 p_msg->has_ertm_info = FALSE; 337 } 338 memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR)); 339 p_msg->p_cback = p_cback; 340 p_msg->user_data = user_data; 341 342 bta_sys_sendmsg(p_msg); 343 344 return BTA_JV_SUCCESS; 345 } 346 347 /******************************************************************************* 348 ** 349 ** Function BTA_JvL2capConnect 350 ** 351 ** Description Initiate a connection as a L2CAP client to the given BD 352 ** Address. 353 ** When the connection is initiated or failed to initiate, 354 ** tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_CL_INIT_EVT 355 ** When the connection is established or failed, 356 ** tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT 357 ** 358 ** Returns BTA_JV_SUCCESS, if the request is being processed. 359 ** BTA_JV_FAILURE, otherwise. 360 ** 361 *******************************************************************************/ 362 tBTA_JV_STATUS BTA_JvL2capConnect(int conn_type, tBTA_SEC sec_mask, tBTA_JV_ROLE role, 363 const tL2CAP_ERTM_INFO *ertm_info, UINT16 remote_psm, 364 UINT16 rx_mtu, tL2CAP_CFG_INFO *cfg, 365 BD_ADDR peer_bd_addr, tBTA_JV_L2CAP_CBACK *p_cback, void *user_data) 366 { 367 APPL_TRACE_API("%s", __func__); 368 369 if (p_cback == NULL) 370 return BTA_JV_FAILURE; /* Nothing to do */ 371 372 tBTA_JV_API_L2CAP_CONNECT *p_msg = 373 (tBTA_JV_API_L2CAP_CONNECT *)osi_malloc(sizeof(tBTA_JV_API_L2CAP_CONNECT)); 374 p_msg->hdr.event = BTA_JV_API_L2CAP_CONNECT_EVT; 375 p_msg->type = conn_type; 376 p_msg->sec_mask = sec_mask; 377 p_msg->role = role; 378 p_msg->remote_psm = remote_psm; 379 p_msg->rx_mtu = rx_mtu; 380 if (cfg != NULL) { 381 p_msg->has_cfg = TRUE; 382 p_msg->cfg = *cfg; 383 } else { 384 p_msg->has_cfg = FALSE; 385 } 386 if (ertm_info != NULL) { 387 p_msg->has_ertm_info = TRUE; 388 p_msg->ertm_info = *ertm_info; 389 } else { 390 p_msg->has_ertm_info = FALSE; 391 } 392 memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR)); 393 p_msg->p_cback = p_cback; 394 p_msg->user_data = user_data; 395 396 bta_sys_sendmsg(p_msg); 397 398 return BTA_JV_SUCCESS; 399 } 400 401 /******************************************************************************* 402 ** 403 ** Function BTA_JvL2capClose 404 ** 405 ** Description This function closes an L2CAP client connection 406 ** 407 ** Returns BTA_JV_SUCCESS, if the request is being processed. 408 ** BTA_JV_FAILURE, otherwise. 409 ** 410 *******************************************************************************/ 411 tBTA_JV_STATUS BTA_JvL2capClose(UINT32 handle) 412 { 413 tBTA_JV_STATUS status = BTA_JV_FAILURE; 414 415 APPL_TRACE_API("%s", __func__); 416 417 if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback) { 418 tBTA_JV_API_L2CAP_CLOSE *p_msg = 419 (tBTA_JV_API_L2CAP_CLOSE *)osi_malloc(sizeof(tBTA_JV_API_L2CAP_CLOSE)); 420 p_msg->hdr.event = BTA_JV_API_L2CAP_CLOSE_EVT; 421 p_msg->handle = handle; 422 p_msg->p_cb = &bta_jv_cb.l2c_cb[handle]; 423 424 bta_sys_sendmsg(p_msg); 425 status = BTA_JV_SUCCESS; 426 } 427 428 return status; 429 } 430 431 /******************************************************************************* 432 ** 433 ** Function BTA_JvL2capCloseLE 434 ** 435 ** Description This function closes an L2CAP client connection for Fixed Channels 436 ** Function is idempotent and no callbacks are called! 437 ** 438 ** Returns BTA_JV_SUCCESS, if the request is being processed. 439 ** BTA_JV_FAILURE, otherwise. 440 ** 441 *******************************************************************************/ 442 tBTA_JV_STATUS BTA_JvL2capCloseLE(UINT32 handle) 443 { 444 tBTA_JV_API_L2CAP_CLOSE *p_msg = 445 (tBTA_JV_API_L2CAP_CLOSE *)osi_malloc(sizeof(tBTA_JV_API_L2CAP_CLOSE)); 446 447 APPL_TRACE_API("%s", __func__); 448 449 p_msg->hdr.event = BTA_JV_API_L2CAP_CLOSE_FIXED_EVT; 450 p_msg->handle = handle; 451 452 bta_sys_sendmsg(p_msg); 453 454 return BTA_JV_SUCCESS; 455 } 456 457 /******************************************************************************* 458 ** 459 ** Function BTA_JvL2capStartServer 460 ** 461 ** Description This function starts an L2CAP server and listens for an L2CAP 462 ** connection from a remote Bluetooth device. When the server 463 ** is started successfully, tBTA_JV_L2CAP_CBACK is called with 464 ** BTA_JV_L2CAP_START_EVT. When the connection is established, 465 ** tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT. 466 ** 467 ** Returns BTA_JV_SUCCESS, if the request is being processed. 468 ** BTA_JV_FAILURE, otherwise. 469 ** 470 *******************************************************************************/ 471 tBTA_JV_STATUS BTA_JvL2capStartServer(int conn_type, tBTA_SEC sec_mask, tBTA_JV_ROLE role, 472 const tL2CAP_ERTM_INFO *ertm_info,UINT16 local_psm, UINT16 rx_mtu, tL2CAP_CFG_INFO *cfg, 473 tBTA_JV_L2CAP_CBACK *p_cback, void *user_data) 474 { 475 APPL_TRACE_API("%s", __func__); 476 477 if (p_cback == NULL) 478 return BTA_JV_FAILURE; /* Nothing to do */ 479 480 tBTA_JV_API_L2CAP_SERVER *p_msg = 481 (tBTA_JV_API_L2CAP_SERVER *)osi_malloc(sizeof(tBTA_JV_API_L2CAP_SERVER)); 482 p_msg->hdr.event = BTA_JV_API_L2CAP_START_SERVER_EVT; 483 p_msg->type = conn_type; 484 p_msg->sec_mask = sec_mask; 485 p_msg->role = role; 486 p_msg->local_psm = local_psm; 487 p_msg->rx_mtu = rx_mtu; 488 if (cfg != NULL) { 489 p_msg->has_cfg = TRUE; 490 p_msg->cfg = *cfg; 491 } else { 492 p_msg->has_cfg = FALSE; 493 } 494 if (ertm_info != NULL) { 495 p_msg->has_ertm_info = TRUE; 496 p_msg->ertm_info = *ertm_info; 497 } else { 498 p_msg->has_ertm_info = FALSE; 499 } 500 p_msg->p_cback = p_cback; 501 p_msg->user_data = user_data; 502 503 bta_sys_sendmsg(p_msg); 504 505 return BTA_JV_SUCCESS; 506 } 507 508 /******************************************************************************* 509 ** 510 ** Function BTA_JvL2capStartServerLE 511 ** 512 ** Description This function starts an LE L2CAP server and listens for an L2CAP 513 ** connection from a remote Bluetooth device. When the server 514 ** is started successfully, tBTA_JV_L2CAP_CBACK is called with 515 ** BTA_JV_L2CAP_START_EVT. When the connection is established, 516 ** tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT. 517 ** 518 ** Returns BTA_JV_SUCCESS, if the request is being processed. 519 ** BTA_JV_FAILURE, otherwise. 520 ** 521 *******************************************************************************/ 522 tBTA_JV_STATUS BTA_JvL2capStartServerLE(tBTA_SEC sec_mask, tBTA_JV_ROLE role, 523 const tL2CAP_ERTM_INFO *ertm_info,UINT16 local_chan, UINT16 rx_mtu, tL2CAP_CFG_INFO *cfg, 524 tBTA_JV_L2CAP_CBACK *p_cback, void *user_data) 525 { 526 APPL_TRACE_API("%s", __func__); 527 528 if (p_cback == NULL) 529 return BTA_JV_FAILURE; /* Nothing to do */ 530 531 tBTA_JV_API_L2CAP_SERVER *p_msg = 532 (tBTA_JV_API_L2CAP_SERVER *)osi_malloc(sizeof(tBTA_JV_API_L2CAP_SERVER)); 533 p_msg->hdr.event = BTA_JV_API_L2CAP_START_SERVER_LE_EVT; 534 p_msg->sec_mask = sec_mask; 535 p_msg->role = role; 536 p_msg->local_chan = local_chan; 537 p_msg->rx_mtu = rx_mtu; 538 if (cfg != NULL) { 539 p_msg->has_cfg = TRUE; 540 p_msg->cfg = *cfg; 541 } else { 542 p_msg->has_cfg = FALSE; 543 } 544 if (ertm_info != NULL) { 545 p_msg->has_ertm_info = TRUE; 546 p_msg->ertm_info = *ertm_info; 547 } else { 548 p_msg->has_ertm_info = FALSE; 549 } 550 p_msg->p_cback = p_cback; 551 p_msg->user_data = user_data; 552 553 bta_sys_sendmsg(p_msg); 554 555 return BTA_JV_SUCCESS; 556 } 557 558 /******************************************************************************* 559 ** 560 ** Function BTA_JvL2capStopServer 561 ** 562 ** Description This function stops the L2CAP server. If the server has an 563 ** active connection, it would be closed. 564 ** 565 ** Returns BTA_JV_SUCCESS, if the request is being processed. 566 ** BTA_JV_FAILURE, otherwise. 567 ** 568 *******************************************************************************/ 569 tBTA_JV_STATUS BTA_JvL2capStopServer(UINT16 local_psm, void *user_data) 570 { 571 APPL_TRACE_API("%s", __func__); 572 573 tBTA_JV_API_L2CAP_SERVER *p_msg = 574 (tBTA_JV_API_L2CAP_SERVER *)osi_malloc(sizeof(tBTA_JV_API_L2CAP_SERVER)); 575 p_msg->hdr.event = BTA_JV_API_L2CAP_STOP_SERVER_EVT; 576 p_msg->local_psm = local_psm; 577 p_msg->user_data = user_data; 578 579 bta_sys_sendmsg(p_msg); 580 581 return BTA_JV_SUCCESS; 582 } 583 584 /******************************************************************************* 585 ** 586 ** Function BTA_JvL2capStopServerLE 587 ** 588 ** Description This function stops the LE L2CAP server. If the server has an 589 ** active connection, it would be closed. 590 ** 591 ** Returns BTA_JV_SUCCESS, if the request is being processed. 592 ** BTA_JV_FAILURE, otherwise. 593 ** 594 *******************************************************************************/ 595 tBTA_JV_STATUS BTA_JvL2capStopServerLE(UINT16 local_chan, void *user_data) 596 { 597 APPL_TRACE_API("%s", __func__); 598 599 tBTA_JV_API_L2CAP_SERVER *p_msg = 600 (tBTA_JV_API_L2CAP_SERVER *)osi_malloc(sizeof(tBTA_JV_API_L2CAP_SERVER)); 601 p_msg->hdr.event = BTA_JV_API_L2CAP_STOP_SERVER_LE_EVT; 602 p_msg->local_chan = local_chan; 603 p_msg->user_data = user_data; 604 605 bta_sys_sendmsg(p_msg); 606 607 return BTA_JV_SUCCESS; 608 } 609 610 /******************************************************************************* 611 ** 612 ** Function BTA_JvL2capRead 613 ** 614 ** Description This function reads data from an L2CAP connecti; 615 tBTA_JV_RFC_CB *p_cb = rc->p_cb; 616 on 617 ** When the operation is complete, tBTA_JV_L2CAP_CBACK is 618 ** called with BTA_JV_L2CAP_READ_EVT. 619 ** 620 ** Returns BTA_JV_SUCCESS, if the request is being processed. 621 ** BTA_JV_FAILURE, otherwise. 622 ** 623 *******************************************************************************/ 624 tBTA_JV_STATUS BTA_JvL2capRead(UINT32 handle, UINT32 req_id, UINT8 *p_data, UINT16 len) 625 { 626 tBTA_JV_STATUS status = BTA_JV_FAILURE; 627 tBTA_JV_L2CAP_READ evt_data; 628 629 APPL_TRACE_API( "%s", __func__); 630 631 632 if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback) 633 { 634 status = BTA_JV_SUCCESS; 635 evt_data.status = BTA_JV_FAILURE; 636 evt_data.handle = handle; 637 evt_data.req_id = req_id; 638 evt_data.p_data = p_data; 639 evt_data.len = 0; 640 641 if (BT_PASS == GAP_ConnReadData((UINT16)handle, p_data, len, &evt_data.len)) 642 { 643 evt_data.status = BTA_JV_SUCCESS; 644 } 645 bta_jv_cb.l2c_cb[handle].p_cback( 646 BTA_JV_L2CAP_READ_EVT, (tBTA_JV *)&evt_data, bta_jv_cb.l2c_cb[handle].user_data); 647 } 648 649 return(status); 650 } 651 652 /******************************************************************************* 653 ** 654 ** Function BTA_JvL2capReady 655 ** 656 ** Description This function determined if there is data to read from 657 ** an L2CAP connection 658 ** 659 ** Returns BTA_JV_SUCCESS, if data queue size is in *p_data_size. 660 ** BTA_JV_FAILURE, if error. 661 ** 662 *******************************************************************************/ 663 tBTA_JV_STATUS BTA_JvL2capReady(UINT32 handle, UINT32 *p_data_size) 664 { 665 tBTA_JV_STATUS status = BTA_JV_FAILURE; 666 667 APPL_TRACE_API( "%s: %d", __func__, handle); 668 if (p_data_size && handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback) 669 { 670 *p_data_size = 0; 671 if(BT_PASS == GAP_GetRxQueueCnt((UINT16)handle, p_data_size) ) 672 { 673 status = BTA_JV_SUCCESS; 674 } 675 } 676 677 return(status); 678 } 679 680 681 /******************************************************************************* 682 ** 683 ** Function BTA_JvL2capWrite 684 ** 685 ** Description This function writes data to an L2CAP connection 686 ** When the operation is complete, tBTA_JV_L2CAP_CBACK is 687 ** called with BTA_JV_L2CAP_WRITE_EVT. Works for 688 ** PSM-based connections 689 ** 690 ** Returns BTA_JV_SUCCESS, if the request is being processed. 691 ** BTA_JV_FAILURE, otherwise. 692 ** 693 *******************************************************************************/ 694 tBTA_JV_STATUS BTA_JvL2capWrite(UINT32 handle, UINT32 req_id, UINT8 *p_data, 695 UINT16 len, void *user_data) 696 { 697 tBTA_JV_STATUS status = BTA_JV_FAILURE; 698 699 APPL_TRACE_API("%s", __func__); 700 701 if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback) { 702 tBTA_JV_API_L2CAP_WRITE *p_msg = 703 (tBTA_JV_API_L2CAP_WRITE *)osi_malloc(sizeof(tBTA_JV_API_L2CAP_WRITE)); 704 p_msg->hdr.event = BTA_JV_API_L2CAP_WRITE_EVT; 705 p_msg->handle = handle; 706 p_msg->req_id = req_id; 707 p_msg->p_data = p_data; 708 p_msg->p_cb = &bta_jv_cb.l2c_cb[handle]; 709 p_msg->len = len; 710 p_msg->user_data = user_data; 711 712 bta_sys_sendmsg(p_msg); 713 714 status = BTA_JV_SUCCESS; 715 } 716 717 return status; 718 } 719 720 /******************************************************************************* 721 ** 722 ** Function BTA_JvL2capWriteFixed 723 ** 724 ** Description This function writes data to an L2CAP connection 725 ** When the operation is complete, tBTA_JV_L2CAP_CBACK is 726 ** called with BTA_JV_L2CAP_WRITE_EVT. Works for 727 ** fixed-channel connections 728 ** 729 ** Returns BTA_JV_SUCCESS, if the request is being processed. 730 ** BTA_JV_FAILURE, otherwise. 731 ** 732 *******************************************************************************/ 733 tBTA_JV_STATUS BTA_JvL2capWriteFixed(UINT16 channel, BD_ADDR *addr, UINT32 req_id, 734 tBTA_JV_L2CAP_CBACK *p_cback, UINT8 *p_data, UINT16 len, void *user_data) 735 { 736 tBTA_JV_API_L2CAP_WRITE_FIXED *p_msg = 737 (tBTA_JV_API_L2CAP_WRITE_FIXED *)osi_malloc(sizeof(tBTA_JV_API_L2CAP_WRITE_FIXED)); 738 739 APPL_TRACE_API("%s", __func__); 740 741 p_msg->hdr.event = BTA_JV_API_L2CAP_WRITE_FIXED_EVT; 742 p_msg->channel = channel; 743 memcpy(p_msg->addr, addr, sizeof(p_msg->addr)); 744 p_msg->req_id = req_id; 745 p_msg->p_data = p_data; 746 p_msg->p_cback = p_cback; 747 p_msg->len = len; 748 p_msg->user_data = user_data; 749 750 bta_sys_sendmsg(p_msg); 751 752 return BTA_JV_SUCCESS; 753 } 754 755 /******************************************************************************* 756 ** 757 ** Function BTA_JvRfcommConnect 758 ** 759 ** Description This function makes an RFCOMM conection to a remote BD 760 ** Address. 761 ** When the connection is initiated or failed to initiate, 762 ** tBTA_JV_RFCOMM_CBACK is called with BTA_JV_RFCOMM_CL_INIT_EVT 763 ** When the connection is established or failed, 764 ** tBTA_JV_RFCOMM_CBACK is called with BTA_JV_RFCOMM_OPEN_EVT 765 ** 766 ** Returns BTA_JV_SUCCESS, if the request is being processed. 767 ** BTA_JV_FAILURE, otherwise. 768 ** 769 *******************************************************************************/ 770 tBTA_JV_STATUS BTA_JvRfcommConnect(tBTA_SEC sec_mask, 771 tBTA_JV_ROLE role, UINT8 remote_scn, BD_ADDR peer_bd_addr, 772 tBTA_JV_RFCOMM_CBACK *p_cback, void* user_data) 773 { 774 APPL_TRACE_API("%s", __func__); 775 776 if (p_cback == NULL) 777 return BTA_JV_FAILURE; /* Nothing to do */ 778 779 tBTA_JV_API_RFCOMM_CONNECT *p_msg = 780 (tBTA_JV_API_RFCOMM_CONNECT *)osi_malloc(sizeof(tBTA_JV_API_RFCOMM_CONNECT)); 781 p_msg->hdr.event = BTA_JV_API_RFCOMM_CONNECT_EVT; 782 p_msg->sec_mask = sec_mask; 783 p_msg->role = role; 784 p_msg->remote_scn = remote_scn; 785 memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR)); 786 p_msg->p_cback = p_cback; 787 p_msg->user_data = user_data; 788 789 bta_sys_sendmsg(p_msg); 790 791 return BTA_JV_SUCCESS; 792 } 793 794 /******************************************************************************* 795 ** 796 ** Function BTA_JvRfcommClose 797 ** 798 ** Description This function closes an RFCOMM connection 799 ** 800 ** Returns BTA_JV_SUCCESS, if the request is being processed. 801 ** BTA_JV_FAILURE, otherwise. 802 ** 803 *******************************************************************************/ 804 tBTA_JV_STATUS BTA_JvRfcommClose(UINT32 handle, void *user_data) 805 { 806 tBTA_JV_STATUS status = BTA_JV_FAILURE; 807 UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1; 808 UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle); 809 810 APPL_TRACE_API("%s", __func__); 811 812 if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback && 813 si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si]) { 814 tBTA_JV_API_RFCOMM_CLOSE *p_msg = 815 (tBTA_JV_API_RFCOMM_CLOSE *)osi_malloc(sizeof(tBTA_JV_API_RFCOMM_CLOSE)); 816 p_msg->hdr.event = BTA_JV_API_RFCOMM_CLOSE_EVT; 817 p_msg->handle = handle; 818 p_msg->p_cb = &bta_jv_cb.rfc_cb[hi]; 819 p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1]; 820 p_msg->user_data = user_data; 821 822 bta_sys_sendmsg(p_msg); 823 824 status = BTA_JV_SUCCESS; 825 } 826 827 return status; 828 } 829 830 /******************************************************************************* 831 ** 832 ** Function BTA_JvRfcommStartServer 833 ** 834 ** Description This function starts listening for an RFCOMM connection 835 ** request from a remote Bluetooth device. When the server is 836 ** started successfully, tBTA_JV_RFCOMM_CBACK is called 837 ** with BTA_JV_RFCOMM_START_EVT. 838 ** When the connection is established, tBTA_JV_RFCOMM_CBACK 839 ** is called with BTA_JV_RFCOMM_OPEN_EVT. 840 ** 841 ** Returns BTA_JV_SUCCESS, if the request is being processed. 842 ** BTA_JV_FAILURE, otherwise. 843 ** 844 *******************************************************************************/ 845 tBTA_JV_STATUS BTA_JvRfcommStartServer(tBTA_SEC sec_mask, 846 tBTA_JV_ROLE role, UINT8 local_scn, UINT8 max_session, 847 tBTA_JV_RFCOMM_CBACK *p_cback, void* user_data) 848 { 849 APPL_TRACE_API("%s", __func__); 850 851 if (p_cback == NULL) 852 return BTA_JV_FAILURE; /* Nothing to do */ 853 854 tBTA_JV_API_RFCOMM_SERVER *p_msg = 855 (tBTA_JV_API_RFCOMM_SERVER *)osi_malloc(sizeof(tBTA_JV_API_RFCOMM_SERVER)); 856 if (max_session == 0) 857 max_session = 1; 858 if (max_session > BTA_JV_MAX_RFC_SR_SESSION) { 859 APPL_TRACE_DEBUG( "max_session is too big. use max (%d)", max_session, BTA_JV_MAX_RFC_SR_SESSION); 860 max_session = BTA_JV_MAX_RFC_SR_SESSION; 861 } 862 p_msg->hdr.event = BTA_JV_API_RFCOMM_START_SERVER_EVT; 863 p_msg->sec_mask = sec_mask; 864 p_msg->role = role; 865 p_msg->local_scn = local_scn; 866 p_msg->max_session = max_session; 867 p_msg->p_cback = p_cback; 868 p_msg->user_data = user_data; //caller's private data 869 870 bta_sys_sendmsg(p_msg); 871 872 return BTA_JV_SUCCESS; 873 } 874 875 /******************************************************************************* 876 ** 877 ** Function BTA_JvRfcommStopServer 878 ** 879 ** Description This function stops the RFCOMM server. If the server has an 880 ** active connection, it would be closed. 881 ** 882 ** Returns BTA_JV_SUCCESS, if the request is being processed. 883 ** BTA_JV_FAILURE, otherwise. 884 ** 885 *******************************************************************************/ 886 tBTA_JV_STATUS BTA_JvRfcommStopServer(UINT32 handle, void * user_data) 887 { 888 tBTA_JV_API_RFCOMM_SERVER *p_msg = 889 (tBTA_JV_API_RFCOMM_SERVER *)osi_malloc(sizeof(tBTA_JV_API_RFCOMM_SERVER)); 890 891 APPL_TRACE_API("%s", __func__); 892 893 p_msg->hdr.event = BTA_JV_API_RFCOMM_STOP_SERVER_EVT; 894 p_msg->handle = handle; 895 p_msg->user_data = user_data; //caller's private data 896 897 bta_sys_sendmsg(p_msg); 898 899 return BTA_JV_SUCCESS; 900 } 901 902 /******************************************************************************* 903 ** 904 ** Function BTA_JvRfcommGetPortHdl 905 ** 906 ** Description This function fetches the rfcomm port handle 907 ** 908 ** Returns BTA_JV_SUCCESS, if the request is being processed. 909 ** BTA_JV_FAILURE, otherwise. 910 ** 911 *******************************************************************************/ 912 UINT16 BTA_JvRfcommGetPortHdl(UINT32 handle) 913 { 914 UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK) & ~BTA_JV_RFCOMM_MASK) - 1; 915 UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle); 916 917 if (hi < BTA_JV_MAX_RFC_CONN && 918 si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si]) 919 return bta_jv_cb.port_cb[bta_jv_cb.rfc_cb[hi].rfc_hdl[si] - 1].port_handle; 920 else 921 return 0xffff; 922 } 923 924 /******************************************************************************* 925 ** 926 ** Function BTA_JvRfcommWrite 927 ** 928 ** Description This function writes data to an RFCOMM connection 929 ** 930 ** Returns BTA_JV_SUCCESS, if the request is being processed. 931 ** BTA_JV_FAILURE, otherwise. 932 ** 933 *******************************************************************************/ 934 tBTA_JV_STATUS BTA_JvRfcommWrite(UINT32 handle, UINT32 req_id) 935 { 936 tBTA_JV_STATUS status = BTA_JV_FAILURE; 937 UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1; 938 UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle); 939 940 APPL_TRACE_API("%s", __func__); 941 942 APPL_TRACE_DEBUG( "handle:0x%x, hi:%d, si:%d", handle, hi, si); 943 if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback && 944 si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si]) { 945 tBTA_JV_API_RFCOMM_WRITE *p_msg = 946 (tBTA_JV_API_RFCOMM_WRITE *)osi_malloc(sizeof(tBTA_JV_API_RFCOMM_WRITE)); 947 p_msg->hdr.event = BTA_JV_API_RFCOMM_WRITE_EVT; 948 p_msg->handle = handle; 949 p_msg->req_id = req_id; 950 p_msg->p_cb = &bta_jv_cb.rfc_cb[hi]; 951 p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1]; 952 APPL_TRACE_API( "write ok"); 953 954 bta_sys_sendmsg(p_msg); 955 status = BTA_JV_SUCCESS; 956 } 957 958 return status; 959 } 960 961 962 /******************************************************************************* 963 ** 964 ** Function BTA_JVSetPmProfile 965 ** 966 ** Description This function set or free power mode profile for different JV application 967 ** 968 ** Parameters: handle, JV handle from RFCOMM or L2CAP 969 ** app_id: app specific pm ID, can be BTA_JV_PM_ALL, see bta_dm_cfg.c for details 970 ** BTA_JV_PM_ID_CLEAR: removes pm management on the handle. init_st is ignored and 971 ** BTA_JV_CONN_CLOSE is called implicitely 972 ** init_st: state after calling this API. typically it should be BTA_JV_CONN_OPEN 973 ** 974 ** Returns BTA_JV_SUCCESS, if the request is being processed. 975 ** BTA_JV_FAILURE, otherwise. 976 ** 977 ** NOTE: BTA_JV_PM_ID_CLEAR: In general no need to be called as jv pm calls automatically 978 ** BTA_JV_CONN_CLOSE to remove in case of connection close! 979 ** 980 *******************************************************************************/ 981 tBTA_JV_STATUS BTA_JvSetPmProfile(UINT32 handle, tBTA_JV_PM_ID app_id, tBTA_JV_CONN_STATE init_st) 982 { 983 tBTA_JV_API_SET_PM_PROFILE *p_msg = 984 (tBTA_JV_API_SET_PM_PROFILE *)osi_malloc(sizeof(tBTA_JV_API_SET_PM_PROFILE)); 985 986 APPL_TRACE_API("%s handle:0x%x, app_id:%d", __func__, handle, app_id); 987 988 p_msg->hdr.event = BTA_JV_API_SET_PM_PROFILE_EVT; 989 p_msg->handle = handle; 990 p_msg->app_id = app_id; 991 p_msg->init_st = init_st; 992 993 bta_sys_sendmsg(p_msg); 994 995 return BTA_JV_SUCCESS; 996 } 997