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 "bd.h" 27 #include "bta_sys.h" 28 #include "bta_jv_api.h" 29 #include "bta_jv_int.h" 30 #include "gki.h" 31 #include <string.h> 32 #include "port_api.h" 33 #include "sdp_api.h" 34 35 /***************************************************************************** 36 ** Constants 37 *****************************************************************************/ 38 39 static const tBTA_SYS_REG bta_jv_reg = 40 { 41 bta_jv_sm_execute, 42 NULL 43 }; 44 45 /******************************************************************************* 46 ** 47 ** Function BTA_JvEnable 48 ** 49 ** Description Enable the Java I/F service. When the enable 50 ** operation is complete the callback function will be 51 ** called with a BTA_JV_ENABLE_EVT. This function must 52 ** be called before other function in the JV API are 53 ** called. 54 ** 55 ** Returns BTA_JV_SUCCESS if successful. 56 ** BTA_JV_FAIL if internal failure. 57 ** 58 *******************************************************************************/ 59 tBTA_JV_STATUS BTA_JvEnable(tBTA_JV_DM_CBACK *p_cback) 60 { 61 tBTA_JV_STATUS status = BTA_JV_FAILURE; 62 tBTA_JV_API_ENABLE *p_buf; 63 int i; 64 65 APPL_TRACE_API0( "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 GKI_sched_lock(); 77 bta_sys_register(BTA_ID_JV, &bta_jv_reg); 78 GKI_sched_unlock(); 79 80 if (p_cback && (p_buf = (tBTA_JV_API_ENABLE *) GKI_getbuf(sizeof(tBTA_JV_API_ENABLE))) != NULL) 81 { 82 p_buf->hdr.event = BTA_JV_API_ENABLE_EVT; 83 p_buf->p_cback = p_cback; 84 bta_sys_sendmsg(p_buf); 85 status = BTA_JV_SUCCESS; 86 } 87 } 88 else 89 { 90 APPL_TRACE_ERROR0("JVenable fails"); 91 } 92 return(status); 93 } 94 95 /******************************************************************************* 96 ** 97 ** Function BTA_JvDisable 98 ** 99 ** Description Disable the Java I/F 100 ** 101 ** Returns void 102 ** 103 *******************************************************************************/ 104 void BTA_JvDisable(void) 105 { 106 BT_HDR *p_buf; 107 108 APPL_TRACE_API0( "BTA_JvDisable"); 109 bta_sys_deregister(BTA_ID_JV); 110 if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 111 { 112 p_buf->event = BTA_JV_API_DISABLE_EVT; 113 bta_sys_sendmsg(p_buf); 114 } 115 } 116 117 /******************************************************************************* 118 ** 119 ** Function BTA_JvIsEnable 120 ** 121 ** Description Get the JV registration status. 122 ** 123 ** Returns TRUE, if registered 124 ** 125 *******************************************************************************/ 126 BOOLEAN BTA_JvIsEnable(void) 127 { 128 return bta_sys_is_register(BTA_ID_JV); 129 } 130 131 /******************************************************************************* 132 ** 133 ** Function BTA_JvSetDiscoverability 134 ** 135 ** Description This function sets the Bluetooth discoverable modes 136 ** of the local device. This controls whether other 137 ** Bluetooth devices can find the local device. 138 ** 139 ** When the operation is complete the tBTA_JV_DM_CBACK callback 140 ** function will be called with a BTA_JV_SET_DISCOVER_EVT. 141 ** 142 ** Returns BTA_JV_SUCCESS if successful. 143 ** BTA_JV_FAIL if internal failure. 144 ** 145 *******************************************************************************/ 146 tBTA_JV_STATUS BTA_JvSetDiscoverability(tBTA_JV_DISC disc_mode) 147 { 148 tBTA_JV_STATUS status = BTA_JV_FAILURE; 149 tBTA_JV_API_SET_DISCOVERABILITY *p_msg; 150 151 APPL_TRACE_API0( "BTA_JvSetDiscoverability"); 152 if ((p_msg = (tBTA_JV_API_SET_DISCOVERABILITY *)GKI_getbuf(sizeof(tBTA_JV_MSG))) != NULL) 153 { 154 p_msg->hdr.event = BTA_JV_API_SET_DISCOVERABILITY_EVT; 155 p_msg->disc_mode = disc_mode; 156 bta_sys_sendmsg(p_msg); 157 status = BTA_JV_SUCCESS; 158 } 159 160 return(status); 161 } 162 163 /******************************************************************************* 164 ** 165 ** Function BTA_JvGetDiscoverability 166 ** 167 ** Description This function gets the Bluetooth 168 ** discoverable modes of local device 169 ** 170 ** Returns The current Bluetooth discoverable mode. 171 ** 172 *******************************************************************************/ 173 tBTA_JV_DISC BTA_JvGetDiscoverability(void) 174 { 175 APPL_TRACE_API0( "BTA_JvGetDiscoverability"); 176 return BTM_ReadDiscoverability(0, 0); 177 } 178 179 /******************************************************************************* 180 ** 181 ** Function BTA_JvGetLocalDeviceAddr 182 ** 183 ** Description This function obtains the local Bluetooth device address. 184 ** The local Bluetooth device address is reported by the 185 ** tBTA_JV_DM_CBACK callback with a BTA_JV_LOCAL_ADDR_EVT. 186 ** 187 ** Returns BTA_JV_SUCCESS if successful. 188 ** BTA_JV_FAIL if internal failure. 189 ** 190 *******************************************************************************/ 191 tBTA_JV_STATUS BTA_JvGetLocalDeviceAddr(void) 192 { 193 tBTA_JV_STATUS ret = BTA_JV_FAILURE; 194 BT_HDR *p_msg; 195 196 APPL_TRACE_API0( "BTA_JvGetLocalDeviceAddr"); 197 if ((p_msg = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL) 198 { 199 p_msg->event = BTA_JV_API_GET_LOCAL_DEVICE_ADDR_EVT; 200 bta_sys_sendmsg(p_msg); 201 ret = BTA_JV_SUCCESS; 202 } 203 204 return(ret); 205 } 206 207 /******************************************************************************* 208 ** 209 ** Function BTA_JvGetLocalDeviceName 210 ** 211 ** Description This function obtains the name of the local device 212 ** The local Bluetooth device name is reported by the 213 ** tBTA_JV_DM_CBACK callback with a BTA_JV_LOCAL_NAME_EVT. 214 ** 215 ** Returns BTA_JV_SUCCESS if successful. 216 ** BTA_JV_FAIL if internal failure. 217 ** 218 *******************************************************************************/ 219 tBTA_JV_STATUS BTA_JvGetLocalDeviceName(void) 220 { 221 tBTA_JV_STATUS ret = BTA_JV_FAILURE; 222 BT_HDR *p_msg; 223 224 APPL_TRACE_API0( "BTA_JvGetLocalDeviceName"); 225 if ((p_msg = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL) 226 { 227 p_msg->event = BTA_JV_API_GET_LOCAL_DEVICE_NAME_EVT; 228 bta_sys_sendmsg(p_msg); 229 ret = BTA_JV_SUCCESS; 230 } 231 232 return(ret); 233 } 234 235 /******************************************************************************* 236 ** 237 ** Function BTA_JvGetRemoteDeviceName 238 ** 239 ** Description This function obtains the name of the specified device. 240 ** The Bluetooth device name is reported by the 241 ** tBTA_JV_DM_CBACK callback with a BTA_JV_REMOTE_NAME_EVT. 242 ** 243 ** Returns BTA_JV_SUCCESS if successful. 244 ** BTA_JV_FAIL if internal failure. 245 ** 246 *******************************************************************************/ 247 tBTA_JV_STATUS BTA_JvGetRemoteDeviceName(BD_ADDR bd_addr) 248 { 249 tBTA_JV_STATUS ret = BTA_JV_FAILURE; 250 tBTA_JV_API_GET_REMOTE_NAME *p_msg; 251 252 APPL_TRACE_API0( "BTA_JvGetRemoteDeviceName"); 253 if ((p_msg = (tBTA_JV_API_GET_REMOTE_NAME *)GKI_getbuf(sizeof(tBTA_JV_API_GET_REMOTE_NAME))) != NULL) 254 { 255 p_msg->hdr.event = BTA_JV_API_GET_REMOTE_DEVICE_NAME_EVT; 256 bdcpy(p_msg->bd_addr, bd_addr); 257 bta_sys_sendmsg(p_msg); 258 ret = BTA_JV_SUCCESS; 259 } 260 261 return(ret); 262 } 263 264 /******************************************************************************* 265 ** 266 ** Function BTA_JvGetPreknownDevice 267 ** 268 ** Description This function obtains the Bluetooth address in the inquiry 269 ** database collected via the previous call to BTA_DmSearch(). 270 ** 271 ** Returns The number of preknown devices if p_bd_addr is NULL 272 ** BTA_JV_SUCCESS if successful. 273 ** BTA_JV_INTERNAL_ERR(-1) if internal failure. 274 ** 275 *******************************************************************************/ 276 INT32 BTA_JvGetPreknownDevice(UINT8 * p_bd_addr, UINT32 index) 277 { 278 tBTA_JV_STATUS status = BTA_JV_FAILURE; 279 tBTM_INQ_INFO *p_info; 280 UINT32 count = 0; 281 INT32 ret = BTA_JV_INTERNAL_ERR; 282 283 APPL_TRACE_API0( "BTA_JvGetPreknownDevice"); 284 p_info = BTM_InqFirstResult(); 285 if(p_info) 286 { 287 status = BTA_JV_SUCCESS; 288 /* the database is valid */ 289 if(NULL == p_bd_addr) 290 { 291 /* p_bd_addr is NULL: count the number of preknown devices */ 292 /* set the index to an invalid size (too big) */ 293 index = BTM_INQ_DB_SIZE; 294 } 295 else if(index >= BTM_INQ_DB_SIZE) 296 { 297 /* invalid index - error */ 298 status = (tBTA_JV_STATUS)BTA_JV_INTERNAL_ERR; 299 } 300 301 if(BTA_JV_SUCCESS == status) 302 { 303 while(p_info && index > count) 304 { 305 count++; 306 p_info = BTM_InqNextResult(p_info); 307 } 308 309 if(p_bd_addr) 310 { 311 if(index == count && p_info) 312 { 313 count = BTA_JV_SUCCESS; 314 bdcpy(p_bd_addr, p_info->results.remote_bd_addr); 315 } 316 else 317 status = (tBTA_JV_STATUS)BTA_JV_INTERNAL_ERR; 318 } 319 /* 320 else report the count 321 */ 322 } 323 /* 324 else error had happened. 325 */ 326 } 327 328 if(BTA_JV_SUCCESS == status) 329 { 330 ret = count; 331 } 332 return ret; 333 } 334 335 336 /******************************************************************************* 337 ** 338 ** Function BTA_JvGetDeviceClass 339 ** 340 ** Description This function obtains the local Class of Device. This 341 ** function executes in place. The result is returned right away. 342 ** 343 ** Returns DEV_CLASS, A three-byte array of UINT8 that contains the 344 ** Class of Device information. The definitions are in the 345 ** "Bluetooth Assigned Numbers". 346 ** 347 *******************************************************************************/ 348 UINT8 * BTA_JvGetDeviceClass(void) 349 { 350 APPL_TRACE_API0( "BTA_JvGetDeviceClass"); 351 return BTM_ReadDeviceClass(); 352 } 353 354 /******************************************************************************* 355 ** 356 ** Function BTA_JvSetServiceClass 357 ** 358 ** Description This function sets the service class of local Class of Device 359 ** 360 ** Returns BTA_JV_SUCCESS if successful. 361 ** BTA_JV_FAIL if internal failure. 362 ** 363 *******************************************************************************/ 364 tBTA_JV_STATUS BTA_JvSetServiceClass(UINT32 service) 365 { 366 tBTA_JV_STATUS status = BTA_JV_FAILURE; 367 tBTA_JV_API_SET_SERVICE_CLASS *p_msg; 368 369 APPL_TRACE_API0( "BTA_JvSetServiceClass"); 370 if ((p_msg = (tBTA_JV_API_SET_SERVICE_CLASS *)GKI_getbuf(sizeof(tBTA_JV_API_SET_SERVICE_CLASS))) != NULL) 371 { 372 p_msg->hdr.event = BTA_JV_API_SET_SERVICE_CLASS_EVT; 373 p_msg->service = service; 374 bta_sys_sendmsg(p_msg); 375 status = BTA_JV_SUCCESS; 376 } 377 378 return(status); 379 } 380 381 /******************************************************************************* 382 ** 383 ** Function BTA_JvSetEncryption 384 ** 385 ** Description This function ensures that the connection to the given device 386 ** is encrypted. 387 ** When the operation is complete the tBTA_JV_DM_CBACK callback 388 ** function will be called with a BTA_JV_SET_ENCRYPTION_EVT. 389 ** 390 ** Returns BTA_JV_SUCCESS, if the request is being processed. 391 ** BTA_JV_FAILURE, otherwise. 392 ** 393 *******************************************************************************/ 394 tBTA_JV_STATUS BTA_JvSetEncryption(BD_ADDR bd_addr) 395 { 396 tBTA_JV_STATUS ret = BTA_JV_FAILURE; 397 tBTA_JV_API_SET_ENCRYPTION *p_msg; 398 399 APPL_TRACE_API0( "BTA_JvSetEncryption"); 400 if ((p_msg = (tBTA_JV_API_SET_ENCRYPTION *)GKI_getbuf(sizeof(tBTA_JV_API_SET_ENCRYPTION))) != NULL) 401 { 402 p_msg->hdr.event = BTA_JV_API_SET_ENCRYPTION_EVT; 403 bdcpy(p_msg->bd_addr, bd_addr); 404 bta_sys_sendmsg(p_msg); 405 ret = BTA_JV_SUCCESS; 406 } 407 408 return(ret); 409 } 410 411 /******************************************************************************* 412 ** 413 ** Function BTA_JvIsAuthenticated 414 ** 415 ** Description This function checks if the peer device is authenticated 416 ** 417 ** Returns TRUE if authenticated. 418 ** FALSE if not. 419 ** 420 *******************************************************************************/ 421 BOOLEAN BTA_JvIsAuthenticated(BD_ADDR bd_addr) 422 { 423 BOOLEAN is_authenticated = FALSE; 424 UINT8 sec_flags; 425 426 if(BTM_GetSecurityFlags(bd_addr, &sec_flags)) 427 { 428 if(sec_flags&BTM_SEC_FLAG_AUTHENTICATED) 429 is_authenticated = TRUE; 430 } 431 return is_authenticated; 432 } 433 434 /******************************************************************************* 435 ** 436 ** Function BTA_JvIsTrusted 437 ** 438 ** Description This function checks if the peer device is trusted 439 ** (previously paired) 440 ** 441 ** Returns TRUE if trusted. 442 ** FALSE if not. 443 ** 444 *******************************************************************************/ 445 BOOLEAN BTA_JvIsTrusted(BD_ADDR bd_addr) 446 { 447 BOOLEAN is_trusted = FALSE; 448 UINT8 sec_flags; 449 450 if(BTM_GetSecurityFlags(bd_addr, &sec_flags)) 451 { 452 if ((sec_flags&BTM_SEC_FLAG_AUTHENTICATED) || 453 (sec_flags&BTM_SEC_FLAG_LKEY_KNOWN)) 454 { 455 is_trusted = TRUE; 456 } 457 } 458 return is_trusted; 459 } 460 461 /******************************************************************************* 462 ** 463 ** Function BTA_JvIsAuthorized 464 ** 465 ** Description This function checks if the peer device is authorized 466 ** 467 ** Returns TRUE if authorized. 468 ** FALSE if not. 469 ** 470 *******************************************************************************/ 471 BOOLEAN BTA_JvIsAuthorized(BD_ADDR bd_addr) 472 { 473 BOOLEAN is_authorized = FALSE; 474 UINT8 sec_flags; 475 476 if(BTM_GetSecurityFlags(bd_addr, &sec_flags)) 477 { 478 if(sec_flags&BTM_SEC_FLAG_AUTHORIZED) 479 is_authorized = TRUE; 480 } 481 return is_authorized; 482 } 483 484 /******************************************************************************* 485 ** 486 ** Function BTA_JvIsEncrypted 487 ** 488 ** Description This function checks if the link to peer device is encrypted 489 ** 490 ** Returns TRUE if encrypted. 491 ** FALSE if not. 492 ** 493 *******************************************************************************/ 494 BOOLEAN BTA_JvIsEncrypted(BD_ADDR bd_addr) 495 { 496 BOOLEAN is_encrypted = FALSE; 497 UINT8 sec_flags; 498 499 if(BTM_GetSecurityFlags(bd_addr, &sec_flags)) 500 { 501 if(sec_flags&BTM_SEC_FLAG_ENCRYPTED) 502 is_encrypted = TRUE; 503 } 504 return is_encrypted; 505 } 506 507 /******************************************************************************* 508 ** 509 ** Function BTA_JvGetSecurityMode 510 ** 511 ** Description This function returns the current Bluetooth security mode 512 ** of the local device 513 ** 514 ** Returns The current Bluetooth security mode. 515 ** 516 *******************************************************************************/ 517 tBTA_JV_SEC_MODE BTA_JvGetSecurityMode(void) 518 { 519 return BTM_GetSecurityMode(); 520 } 521 522 /******************************************************************************* 523 ** 524 ** Function BTA_JvGetSCN 525 ** 526 ** Description This function reserves a SCN (server channel number) for 527 ** applications running over RFCOMM. It is primarily called by 528 ** server profiles/applications to register their SCN into the 529 ** SDP database. The SCN is reported by the tBTA_JV_DM_CBACK 530 ** callback with a BTA_JV_GET_SCN_EVT. 531 ** If the SCN reported is 0, that means all SCN resources are 532 ** exhausted. 533 ** 534 ** Returns BTA_JV_SUCCESS, if the request is being processed. 535 ** BTA_JV_FAILURE, otherwise. 536 ** 537 *******************************************************************************/ 538 tBTA_JV_STATUS BTA_JvGetSCN(void) 539 { 540 tBTA_JV_STATUS status = BTA_JV_FAILURE; 541 BT_HDR *p_msg; 542 543 APPL_TRACE_API0( "BTA_JvGetSCN"); 544 if ((p_msg = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR))) != NULL) 545 { 546 p_msg->event = BTA_JV_API_GET_SCN_EVT; 547 bta_sys_sendmsg(p_msg); 548 status = BTA_JV_SUCCESS; 549 } 550 551 return(status); 552 } 553 554 /******************************************************************************* 555 ** 556 ** Function BTA_JvFreeSCN 557 ** 558 ** Description This function frees a server channel number that was used 559 ** by an application running over RFCOMM. 560 ** 561 ** Returns BTA_JV_SUCCESS, if the request is being processed. 562 ** BTA_JV_FAILURE, otherwise. 563 ** 564 *******************************************************************************/ 565 tBTA_JV_STATUS BTA_JvFreeSCN(UINT8 scn) 566 { 567 tBTA_JV_STATUS status = BTA_JV_FAILURE; 568 tBTA_JV_API_FREE_SCN *p_msg; 569 570 APPL_TRACE_API0( "BTA_JvFreeSCN"); 571 if ((p_msg = (tBTA_JV_API_FREE_SCN *)GKI_getbuf(sizeof(tBTA_JV_API_FREE_SCN))) != NULL) 572 { 573 p_msg->hdr.event = BTA_JV_API_FREE_SCN_EVT; 574 p_msg->scn = scn; 575 bta_sys_sendmsg(p_msg); 576 status = BTA_JV_SUCCESS; 577 } 578 579 return(status); 580 } 581 582 /******************************************************************************* 583 ** 584 ** Function BTA_JvGetPSM 585 ** 586 ** Description This function reserves a PSM (Protocol Service Multiplexer) 587 ** applications running over L2CAP. It is primarily called by 588 ** server profiles/applications to register their PSM into the 589 ** SDP database. 590 ** 591 ** Returns The next free PSM 592 ** 593 *******************************************************************************/ 594 UINT16 BTA_JvGetPSM(void) 595 { 596 #if 0 597 APPL_TRACE_API0( "BTA_JvGetPSM"); 598 599 return (L2CA_AllocatePSM()); 600 #endif 601 return 0; 602 } 603 604 605 /******************************************************************************* 606 ** 607 ** Function BTA_JvStartDiscovery 608 ** 609 ** Description This function performs service discovery for the services 610 ** provided by the given peer device. When the operation is 611 ** complete the tBTA_JV_DM_CBACK callback function will be 612 ** called with a BTA_JV_DISCOVERY_COMP_EVT. 613 ** 614 ** Returns BTA_JV_SUCCESS, if the request is being processed. 615 ** BTA_JV_FAILURE, otherwise. 616 ** 617 *******************************************************************************/ 618 tBTA_JV_STATUS BTA_JvStartDiscovery(BD_ADDR bd_addr, UINT16 num_uuid, 619 tSDP_UUID *p_uuid_list, void * user_data) 620 { 621 tBTA_JV_STATUS status = BTA_JV_FAILURE; 622 tBTA_JV_API_START_DISCOVERY *p_msg; 623 624 APPL_TRACE_API0( "BTA_JvStartDiscovery"); 625 if ((p_msg = (tBTA_JV_API_START_DISCOVERY *)GKI_getbuf(sizeof(tBTA_JV_API_START_DISCOVERY))) != NULL) 626 { 627 p_msg->hdr.event = BTA_JV_API_START_DISCOVERY_EVT; 628 bdcpy(p_msg->bd_addr, bd_addr); 629 p_msg->num_uuid = num_uuid; 630 memcpy(p_msg->uuid_list, p_uuid_list, num_uuid * sizeof(tSDP_UUID)); 631 p_msg->num_attr = 0; 632 p_msg->user_data = user_data; 633 bta_sys_sendmsg(p_msg); 634 status = BTA_JV_SUCCESS; 635 } 636 637 return(status); 638 } 639 640 /******************************************************************************* 641 ** 642 ** Function BTA_JvCancelDiscovery 643 ** 644 ** Description This function cancels an active service discovery. 645 ** When the operation is 646 ** complete the tBTA_JV_DM_CBACK callback function will be 647 ** called with a BTA_JV_CANCEL_DISCVRY_EVT. 648 ** 649 ** Returns BTA_JV_SUCCESS, if the request is being processed. 650 ** BTA_JV_FAILURE, otherwise. 651 ** 652 *******************************************************************************/ 653 tBTA_JV_STATUS BTA_JvCancelDiscovery(void * user_data) 654 { 655 tBTA_JV_STATUS status = BTA_JV_FAILURE; 656 tBTA_JV_API_CANCEL_DISCOVERY *p_msg; 657 658 APPL_TRACE_API0( "BTA_JvCancelDiscovery"); 659 if ((p_msg = (tBTA_JV_API_CANCEL_DISCOVERY *)GKI_getbuf(sizeof(tBTA_JV_API_CANCEL_DISCOVERY))) != NULL) 660 { 661 p_msg->hdr.event = BTA_JV_API_CANCEL_DISCOVERY_EVT; 662 p_msg->user_data = user_data; 663 bta_sys_sendmsg(p_msg); 664 status = BTA_JV_SUCCESS; 665 } 666 667 return(status); 668 } 669 670 /******************************************************************************* 671 ** 672 ** Function BTA_JvGetServicesLength 673 ** 674 ** Description This function obtains the number of services and the length 675 ** of each service found in the SDP database (result of last 676 ** BTA_JvStartDiscovery().When the operation is complete the 677 ** tBTA_JV_DM_CBACK callback function will be called with a 678 ** BTA_JV_SERVICES_LEN_EVT. 679 ** 680 ** Returns BTA_JV_SUCCESS, if the request is being processed. 681 ** BTA_JV_FAILURE, otherwise. 682 ** 683 *******************************************************************************/ 684 tBTA_JV_STATUS BTA_JvGetServicesLength(BOOLEAN inc_hdr, UINT16 *p_services_len) 685 { 686 tBTA_JV_STATUS status = BTA_JV_FAILURE; 687 tBTA_JV_API_GET_SERVICES_LENGTH *p_msg; 688 689 APPL_TRACE_API0( "BTA_JvGetServicesLength"); 690 if ((p_msg = (tBTA_JV_API_GET_SERVICES_LENGTH *)GKI_getbuf(sizeof(tBTA_JV_API_GET_SERVICES_LENGTH))) != NULL) 691 { 692 p_msg->hdr.event = BTA_JV_API_GET_SERVICES_LENGTH_EVT; 693 p_msg->p_services_len = p_services_len; 694 p_msg->inc_hdr = inc_hdr; 695 bta_sys_sendmsg(p_msg); 696 status = BTA_JV_SUCCESS; 697 } 698 699 return(status); 700 } 701 /******************************************************************************* 702 ** 703 ** Function BTA_JvGetServicesResult 704 ** 705 ** Description This function returns a number of service records found 706 ** during current service search, equals to the number returned 707 ** by previous call to BTA_JvGetServicesLength. 708 ** The contents of each SDP record will be returned under a 709 ** TLV (type, len, value) representation in the data buffer 710 ** provided by the caller. 711 ** 712 ** Returns -1, if error. Otherwise, the number of services 713 ** 714 *******************************************************************************/ 715 INT32 BTA_JvGetServicesResult(BOOLEAN inc_hdr, UINT8 **TLVs) 716 { 717 #if 0 718 INT32 num_services = -1; 719 UINT8 *p, *np, *op, type; 720 UINT32 raw_used, raw_cur; 721 UINT32 len; 722 UINT32 hdr_len; 723 724 APPL_TRACE_API0( "BTA_JvGetServicesResult"); 725 if(p_bta_jv_cfg->p_sdp_db->p_first_rec) 726 { 727 /* the database is valid */ 728 num_services = 0; 729 p = p_bta_jv_cfg->p_sdp_db->raw_data; 730 raw_used = p_bta_jv_cfg->p_sdp_db->raw_used; 731 while(raw_used && p) 732 { 733 op = p; 734 type = *p++; 735 np = sdpu_get_len_from_type(p, type, &len); 736 p = np + len; 737 raw_cur = p - op; 738 if(raw_used >= raw_cur) 739 { 740 raw_used -= raw_cur; 741 } 742 else 743 { 744 /* error. can not continue */ 745 break; 746 } 747 if(inc_hdr) 748 { 749 hdr_len = np - op; 750 memcpy(TLVs[num_services++], op, len+hdr_len); 751 } 752 else 753 { 754 memcpy(TLVs[num_services++], np, len); 755 } 756 } /* end of while */ 757 } 758 return(num_services); 759 #endif 760 return 0; 761 } 762 /******************************************************************************* 763 ** 764 ** Function BTA_JvServiceSelect 765 ** 766 ** Description This function checks if the SDP database contains the given 767 ** service UUID. When the operation is complete the 768 ** tBTA_JV_DM_CBACK callback function will be called with a 769 ** BTA_JV_SERVICE_SEL_EVT with the length of the service record. 770 ** If the service is not found or error, -1 is reported. 771 ** 772 ** Returns BTA_JV_SUCCESS, if the request is being processed. 773 ** BTA_JV_FAILURE, otherwise. 774 ** 775 *******************************************************************************/ 776 tBTA_JV_STATUS BTA_JvServiceSelect(UINT16 uuid) 777 { 778 tBTA_JV_STATUS status = BTA_JV_FAILURE; 779 tBTA_JV_API_SERVICE_SELECT *p_msg; 780 781 APPL_TRACE_API0( "BTA_JvServiceSelect"); 782 if ((p_msg = (tBTA_JV_API_SERVICE_SELECT *)GKI_getbuf(sizeof(tBTA_JV_API_SERVICE_SELECT))) != NULL) 783 { 784 p_msg->hdr.event = BTA_JV_API_SERVICE_SELECT_EVT; 785 p_msg->uuid = uuid; 786 bta_sys_sendmsg(p_msg); 787 status = BTA_JV_SUCCESS; 788 } 789 return(status); 790 } 791 792 /******************************************************************************* 793 ** 794 ** Function BTA_JvServiceResult 795 ** 796 ** Description This function returns the contents of the SDP record from 797 ** last BTA_JvServiceSelect. The contents will be returned under 798 ** a TLV (type, len, value) representation in the data buffer 799 ** provided by the caller. 800 ** 801 ** Returns -1, if error. Otherwise, the length of service record. 802 ** 803 *******************************************************************************/ 804 INT32 BTA_JvServiceResult(UINT8 *TLV) 805 { 806 INT32 serv_sel = -1; 807 808 APPL_TRACE_API0( "BTA_JvServiceResult"); 809 if(bta_jv_cb.p_sel_raw_data) 810 { 811 serv_sel = bta_jv_cb.sel_len; 812 memcpy(TLV, bta_jv_cb.p_sel_raw_data, serv_sel); 813 } 814 815 return serv_sel; 816 } 817 818 819 /******************************************************************************* 820 ** 821 ** Function BTA_JvCreateRecord 822 ** 823 ** Description Create a service record in the local SDP database. 824 ** When the operation is complete the tBTA_JV_DM_CBACK callback 825 ** function will be called with a BTA_JV_CREATE_RECORD_EVT. 826 ** 827 ** Returns BTA_JV_SUCCESS, if the request is being processed. 828 ** BTA_JV_FAILURE, otherwise. 829 ** 830 *******************************************************************************/ 831 tBTA_JV_STATUS BTA_JvCreateRecordByUser(void *user_data) 832 { 833 tBTA_JV_STATUS status = BTA_JV_FAILURE; 834 tBTA_JV_API_CREATE_RECORD *p_msg; 835 836 APPL_TRACE_API0( "BTA_JvCreateRecordByUser"); 837 if ((p_msg = (tBTA_JV_API_CREATE_RECORD *)GKI_getbuf(sizeof(tBTA_JV_API_CREATE_RECORD))) != NULL) 838 { 839 p_msg->hdr.event = BTA_JV_API_CREATE_RECORD_EVT; 840 p_msg->user_data = user_data; 841 bta_sys_sendmsg(p_msg); 842 status = BTA_JV_SUCCESS; 843 } 844 845 return(status); 846 } 847 848 /******************************************************************************* 849 ** 850 ** Function BTA_JvUpdateRecord 851 ** 852 ** Description Update a service record in the local SDP database. 853 ** When the operation is complete the tBTA_JV_DM_CBACK callback 854 ** function will be called with a BTA_JV_UPDATE_RECORD_EVT. 855 ** 856 ** Returns BTA_JV_SUCCESS, if the request is being processed. 857 ** BTA_JV_FAILURE, otherwise. 858 ** 859 *******************************************************************************/ 860 tBTA_JV_STATUS BTA_JvUpdateRecord(UINT32 handle, UINT16 *p_ids, 861 UINT8 **p_values, INT32 *p_value_sizes, INT32 array_len) 862 { 863 #if 0 864 tBTA_JV_STATUS status = BTA_JV_FAILURE; 865 tBTA_JV_API_UPDATE_RECORD *p_msg; 866 867 APPL_TRACE_API0( "BTA_JvUpdateRecord"); 868 if ((p_msg = (tBTA_JV_API_UPDATE_RECORD *)GKI_getbuf(sizeof(tBTA_JV_API_UPDATE_RECORD))) != NULL) 869 { 870 p_msg->hdr.event = BTA_JV_API_UPDATE_RECORD_EVT; 871 p_msg->handle = handle; 872 p_msg->p_ids = p_ids; 873 p_msg->p_values = p_values; 874 p_msg->p_value_sizes = p_value_sizes; 875 p_msg->array_len = array_len; 876 bta_sys_sendmsg(p_msg); 877 status = BTA_JV_SUCCESS; 878 } 879 return(status); 880 #endif 881 return -1; 882 } 883 884 /******************************************************************************* 885 ** 886 ** Function BTA_JvAddAttribute 887 ** 888 ** Description Add an attribute to a service record in the local SDP database. 889 ** When the operation is complete the tBTA_JV_DM_CBACK callback 890 ** function will be called with a BTA_JV_ADD_ATTR_EVT. 891 ** 892 ** Returns BTA_JV_SUCCESS, if the request is being processed. 893 ** BTA_JV_FAILURE, otherwise. 894 ** 895 *******************************************************************************/ 896 tBTA_JV_STATUS BTA_JvAddAttribute(UINT32 handle, UINT16 attr_id, 897 UINT8 *p_value, INT32 value_size) 898 { 899 tBTA_JV_STATUS status = BTA_JV_FAILURE; 900 tBTA_JV_API_ADD_ATTRIBUTE *p_msg; 901 902 APPL_TRACE_API0( "BTA_JvAddAttribute"); 903 if ((p_msg = (tBTA_JV_API_ADD_ATTRIBUTE *)GKI_getbuf(sizeof(tBTA_JV_API_ADD_ATTRIBUTE))) != NULL) 904 { 905 p_msg->hdr.event = BTA_JV_API_ADD_ATTRIBUTE_EVT; 906 p_msg->handle = handle; 907 p_msg->attr_id = attr_id; 908 p_msg->p_value = p_value; 909 p_msg->value_size = value_size; 910 bta_sys_sendmsg(p_msg); 911 status = BTA_JV_SUCCESS; 912 } 913 return(status); 914 } 915 916 /******************************************************************************* 917 ** 918 ** Function BTA_JvDeleteAttribute 919 ** 920 ** Description Delete an attribute from a service record in the local SDP database. 921 ** When the operation is complete the tBTA_JV_DM_CBACK callback 922 ** function will be called with a BTA_JV_DELETE_ATTR_EVT. 923 ** 924 ** Returns BTA_JV_SUCCESS, if the request is being processed. 925 ** BTA_JV_FAILURE, otherwise. 926 ** 927 *******************************************************************************/ 928 tBTA_JV_STATUS BTA_JvDeleteAttribute(UINT32 handle, UINT16 attr_id) 929 { 930 tBTA_JV_STATUS status = BTA_JV_FAILURE; 931 tBTA_JV_API_ADD_ATTRIBUTE *p_msg; 932 933 APPL_TRACE_API0( "BTA_JvDeleteAttribute"); 934 if ((p_msg = (tBTA_JV_API_ADD_ATTRIBUTE *)GKI_getbuf(sizeof(tBTA_JV_API_ADD_ATTRIBUTE))) != NULL) 935 { 936 p_msg->hdr.event = BTA_JV_API_DELETE_ATTRIBUTE_EVT; 937 p_msg->handle = handle; 938 p_msg->attr_id = attr_id; 939 bta_sys_sendmsg(p_msg); 940 status = BTA_JV_SUCCESS; 941 } 942 return(status); 943 } 944 945 /******************************************************************************* 946 ** 947 ** Function BTA_JvDeleteRecord 948 ** 949 ** Description Delete a service record in the local SDP database. 950 ** 951 ** Returns BTA_JV_SUCCESS, if the request is being processed. 952 ** BTA_JV_FAILURE, otherwise. 953 ** 954 *******************************************************************************/ 955 tBTA_JV_STATUS BTA_JvDeleteRecord(UINT32 handle) 956 { 957 tBTA_JV_STATUS status = BTA_JV_FAILURE; 958 tBTA_JV_API_ADD_ATTRIBUTE *p_msg; 959 960 APPL_TRACE_API0( "BTA_JvDeleteRecord"); 961 if ((p_msg = (tBTA_JV_API_ADD_ATTRIBUTE *)GKI_getbuf(sizeof(tBTA_JV_API_ADD_ATTRIBUTE))) != NULL) 962 { 963 p_msg->hdr.event = BTA_JV_API_DELETE_RECORD_EVT; 964 p_msg->handle = handle; 965 bta_sys_sendmsg(p_msg); 966 status = BTA_JV_SUCCESS; 967 } 968 return(status); 969 } 970 971 /******************************************************************************* 972 ** 973 ** Function BTA_JvReadRecord 974 ** 975 ** Description Read a service record in the local SDP database. 976 ** 977 ** Returns -1, if the record is not found. 978 ** Otherwise, the offset (0 or 1) to start of data in p_data. 979 ** 980 ** The size of data copied into p_data is in *p_data_len. 981 ** 982 *******************************************************************************/ 983 INT32 BTA_JvReadRecord(UINT32 handle, UINT8 *p_data, INT32 *p_data_len) 984 { 985 UINT32 sdp_handle; 986 987 sdp_handle = bta_jv_get_sdp_handle(handle); 988 989 if(sdp_handle) 990 { 991 return SDP_ReadRecord(sdp_handle, p_data, p_data_len); 992 } 993 994 return -1; 995 } 996 997 /******************************************************************************* 998 ** 999 ** Function BTA_JvL2capConnect 1000 ** 1001 ** Description Initiate a connection as a L2CAP client to the given BD 1002 ** Address. 1003 ** When the connection is initiated or failed to initiate, 1004 ** tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_CL_INIT_EVT 1005 ** When the connection is established or failed, 1006 ** tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT 1007 ** 1008 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1009 ** BTA_JV_FAILURE, otherwise. 1010 ** 1011 *******************************************************************************/ 1012 tBTA_JV_STATUS BTA_JvL2capConnect(tBTA_SEC sec_mask, 1013 tBTA_JV_ROLE role, UINT16 remote_psm, UINT16 rx_mtu, 1014 BD_ADDR peer_bd_addr, tBTA_JV_L2CAP_CBACK *p_cback) 1015 { 1016 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1017 tBTA_JV_API_L2CAP_CONNECT *p_msg; 1018 1019 APPL_TRACE_API0( "BTA_JvL2capConnect"); 1020 if (p_cback && 1021 (p_msg = (tBTA_JV_API_L2CAP_CONNECT *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_CONNECT))) != NULL) 1022 { 1023 p_msg->hdr.event = BTA_JV_API_L2CAP_CONNECT_EVT; 1024 p_msg->sec_mask = sec_mask; 1025 p_msg->role = role; 1026 p_msg->remote_psm = remote_psm; 1027 p_msg->rx_mtu = rx_mtu; 1028 memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR)); 1029 p_msg->p_cback = p_cback; 1030 bta_sys_sendmsg(p_msg); 1031 status = BTA_JV_SUCCESS; 1032 } 1033 1034 return(status); 1035 } 1036 1037 /******************************************************************************* 1038 ** 1039 ** Function BTA_JvL2capClose 1040 ** 1041 ** Description This function closes an L2CAP client connection 1042 ** 1043 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1044 ** BTA_JV_FAILURE, otherwise. 1045 ** 1046 *******************************************************************************/ 1047 tBTA_JV_STATUS BTA_JvL2capClose(UINT32 handle) 1048 { 1049 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1050 tBTA_JV_API_L2CAP_CLOSE *p_msg; 1051 1052 APPL_TRACE_API0( "BTA_JvL2capClose"); 1053 if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback && 1054 (p_msg = (tBTA_JV_API_L2CAP_CLOSE *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_CLOSE))) != NULL) 1055 { 1056 p_msg->hdr.event = BTA_JV_API_L2CAP_CLOSE_EVT; 1057 p_msg->handle = handle; 1058 p_msg->p_cb = &bta_jv_cb.l2c_cb[handle]; 1059 bta_sys_sendmsg(p_msg); 1060 status = BTA_JV_SUCCESS; 1061 } 1062 1063 return(status); 1064 } 1065 1066 /******************************************************************************* 1067 ** 1068 ** Function BTA_JvL2capStartServer 1069 ** 1070 ** Description This function starts an L2CAP server and listens for an L2CAP 1071 ** connection from a remote Bluetooth device. When the server 1072 ** is started successfully, tBTA_JV_L2CAP_CBACK is called with 1073 ** BTA_JV_L2CAP_START_EVT. When the connection is established, 1074 ** tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT. 1075 ** 1076 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1077 ** BTA_JV_FAILURE, otherwise. 1078 ** 1079 *******************************************************************************/ 1080 tBTA_JV_STATUS BTA_JvL2capStartServer(tBTA_SEC sec_mask, tBTA_JV_ROLE role, 1081 UINT16 local_psm, UINT16 rx_mtu, 1082 tBTA_JV_L2CAP_CBACK *p_cback) 1083 { 1084 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1085 tBTA_JV_API_L2CAP_SERVER *p_msg; 1086 1087 APPL_TRACE_API0( "BTA_JvL2capStartServer"); 1088 if (p_cback && 1089 (p_msg = (tBTA_JV_API_L2CAP_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_SERVER))) != NULL) 1090 { 1091 p_msg->hdr.event = BTA_JV_API_L2CAP_START_SERVER_EVT; 1092 p_msg->sec_mask = sec_mask; 1093 p_msg->role = role; 1094 p_msg->local_psm = local_psm; 1095 p_msg->rx_mtu = rx_mtu; 1096 p_msg->p_cback = p_cback; 1097 bta_sys_sendmsg(p_msg); 1098 status = BTA_JV_SUCCESS; 1099 } 1100 1101 return(status); 1102 } 1103 1104 /******************************************************************************* 1105 ** 1106 ** Function BTA_JvL2capStopServer 1107 ** 1108 ** Description This function stops the L2CAP server. If the server has an 1109 ** active connection, it would be closed. 1110 ** 1111 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1112 ** BTA_JV_FAILURE, otherwise. 1113 ** 1114 *******************************************************************************/ 1115 tBTA_JV_STATUS BTA_JvL2capStopServer(UINT16 local_psm) 1116 { 1117 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1118 tBTA_JV_API_L2CAP_SERVER *p_msg; 1119 1120 APPL_TRACE_API0( "BTA_JvL2capStopServer"); 1121 if ((p_msg = (tBTA_JV_API_L2CAP_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_SERVER))) != NULL) 1122 { 1123 p_msg->hdr.event = BTA_JV_API_L2CAP_STOP_SERVER_EVT; 1124 p_msg->local_psm = local_psm; 1125 bta_sys_sendmsg(p_msg); 1126 status = BTA_JV_SUCCESS; 1127 } 1128 1129 return(status); 1130 } 1131 1132 /******************************************************************************* 1133 ** 1134 ** Function BTA_JvL2capRead 1135 ** 1136 ** Description This function reads data from an L2CAP connecti; 1137 tBTA_JV_RFC_CB *p_cb = rc->p_cb; 1138 on 1139 ** When the operation is complete, tBTA_JV_L2CAP_CBACK is 1140 ** called with BTA_JV_L2CAP_READ_EVT. 1141 ** 1142 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1143 ** BTA_JV_FAILURE, otherwise. 1144 ** 1145 *******************************************************************************/ 1146 tBTA_JV_STATUS BTA_JvL2capRead(UINT32 handle, UINT32 req_id, UINT8 *p_data, UINT16 len) 1147 { 1148 #if 0 1149 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1150 #if SDP_FOR_JV_INCLUDED == TRUE 1151 tBTA_JV_API_L2CAP_READ *p_msg; 1152 #endif 1153 tBTA_JV_L2CAP_READ evt_data; 1154 1155 APPL_TRACE_API0( "BTA_JvL2capRead"); 1156 1157 #if SDP_FOR_JV_INCLUDED == TRUE 1158 if(BTA_JV_L2C_FOR_SDP_HDL == handle) 1159 { 1160 if (bta_jv_cb.l2c_cb[handle].p_cback && 1161 (p_msg = (tBTA_JV_API_L2CAP_READ *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_READ))) != NULL) 1162 { 1163 p_msg->hdr.event = BTA_JV_API_L2CAP_READ_EVT; 1164 p_msg->handle = handle; 1165 p_msg->req_id = req_id; 1166 p_msg->p_data = p_data; 1167 p_msg->len = len; 1168 p_msg->p_cback = bta_jv_cb.l2c_cb[handle].p_cback; 1169 bta_sys_sendmsg(p_msg); 1170 status = BTA_JV_SUCCESS; 1171 } 1172 } 1173 else 1174 #endif 1175 if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback) 1176 { 1177 status = BTA_JV_SUCCESS; 1178 evt_data.status = BTA_JV_FAILURE; 1179 evt_data.handle = handle; 1180 evt_data.req_id = req_id; 1181 evt_data.p_data = p_data; 1182 evt_data.len = 0; 1183 1184 if (BT_PASS == GAP_ConnReadData((UINT16)handle, p_data, len, &evt_data.len)) 1185 { 1186 evt_data.status = BTA_JV_SUCCESS; 1187 } 1188 bta_jv_cb.l2c_cb[handle].p_cback(BTA_JV_L2CAP_READ_EVT, (tBTA_JV *)&evt_data); 1189 } 1190 1191 return(status); 1192 #endif 1193 return -1; 1194 } 1195 1196 /******************************************************************************* 1197 ** 1198 ** Function BTA_JvL2capReceive 1199 ** 1200 ** Description This function reads data from an L2CAP connection 1201 ** When the operation is complete, tBTA_JV_L2CAP_CBACK is 1202 ** called with BTA_JV_L2CAP_RECEIVE_EVT. 1203 ** If there are more data queued in L2CAP than len, the extra data will be discarded. 1204 ** 1205 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1206 ** BTA_JV_FAILURE, otherwise. 1207 ** 1208 *******************************************************************************/ 1209 tBTA_JV_STATUS BTA_JvL2capReceive(UINT32 handle, UINT32 req_id, UINT8 *p_data, UINT16 len) 1210 { 1211 #if 0 1212 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1213 tBTA_JV_L2CAP_RECEIVE evt_data; 1214 UINT32 left_over = 0; 1215 UINT16 max_len, read_len; 1216 1217 APPL_TRACE_API0( "BTA_JvL2capReceive"); 1218 1219 if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback) 1220 { 1221 status = BTA_JV_SUCCESS; 1222 evt_data.status = BTA_JV_FAILURE; 1223 evt_data.handle = handle; 1224 evt_data.req_id = req_id; 1225 evt_data.p_data = p_data; 1226 evt_data.len = 0; 1227 1228 if (BT_PASS == GAP_ConnReadData((UINT16)handle, p_data, len, &evt_data.len)) 1229 { 1230 evt_data.status = BTA_JV_SUCCESS; 1231 GAP_GetRxQueueCnt ((UINT16)handle, &left_over); 1232 while (left_over) 1233 { 1234 max_len = (left_over > 0xFFFF)?0xFFFF:left_over; 1235 GAP_ConnReadData ((UINT16)handle, NULL, max_len, &read_len); 1236 left_over -= read_len; 1237 } 1238 } 1239 bta_jv_cb.l2c_cb[handle].p_cback(BTA_JV_L2CAP_RECEIVE_EVT, (tBTA_JV *)&evt_data); 1240 } 1241 1242 return(status); 1243 #endif 1244 return -1; 1245 } 1246 /******************************************************************************* 1247 ** 1248 ** Function BTA_JvL2capReady 1249 ** 1250 ** Description This function determined if there is data to read from 1251 ** an L2CAP connection 1252 ** 1253 ** Returns BTA_JV_SUCCESS, if data queue size is in *p_data_size. 1254 ** BTA_JV_FAILURE, if error. 1255 ** 1256 *******************************************************************************/ 1257 tBTA_JV_STATUS BTA_JvL2capReady(UINT32 handle, UINT32 *p_data_size) 1258 { 1259 #if 0 1260 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1261 1262 APPL_TRACE_API1( "BTA_JvL2capReady: %d", handle); 1263 if (p_data_size && handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback) 1264 { 1265 *p_data_size = 0; 1266 #if SDP_FOR_JV_INCLUDED == TRUE 1267 if(BTA_JV_L2C_FOR_SDP_HDL == handle) 1268 { 1269 *p_data_size = bta_jv_cb.sdp_data_size; 1270 status = BTA_JV_SUCCESS; 1271 } 1272 else 1273 #endif 1274 if(BT_PASS == GAP_GetRxQueueCnt((UINT16)handle, p_data_size) ) 1275 { 1276 status = BTA_JV_SUCCESS; 1277 } 1278 } 1279 1280 return(status); 1281 #endif 1282 return -1; 1283 } 1284 1285 1286 /******************************************************************************* 1287 ** 1288 ** Function BTA_JvL2capWrite 1289 ** 1290 ** Description This function writes data to an L2CAP connection 1291 ** When the operation is complete, tBTA_JV_L2CAP_CBACK is 1292 ** called with BTA_JV_L2CAP_WRITE_EVT. 1293 ** 1294 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1295 ** BTA_JV_FAILURE, otherwise. 1296 ** 1297 *******************************************************************************/ 1298 tBTA_JV_STATUS BTA_JvL2capWrite(UINT32 handle, UINT32 req_id, UINT8 *p_data, UINT16 len) 1299 { 1300 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1301 tBTA_JV_API_L2CAP_WRITE *p_msg; 1302 1303 APPL_TRACE_API0( "BTA_JvL2capWrite"); 1304 if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback && 1305 (p_msg = (tBTA_JV_API_L2CAP_WRITE *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_WRITE))) != NULL) 1306 { 1307 p_msg->hdr.event = BTA_JV_API_L2CAP_WRITE_EVT; 1308 p_msg->handle = handle; 1309 p_msg->req_id = req_id; 1310 p_msg->p_data = p_data; 1311 p_msg->p_cb = &bta_jv_cb.l2c_cb[handle]; 1312 p_msg->len = len; 1313 bta_sys_sendmsg(p_msg); 1314 status = BTA_JV_SUCCESS; 1315 } 1316 1317 return(status); 1318 } 1319 1320 /******************************************************************************* 1321 ** 1322 ** Function BTA_JvRfcommConnect 1323 ** 1324 ** Description This function makes an RFCOMM conection to a remote BD 1325 ** Address. 1326 ** When the connection is initiated or failed to initiate, 1327 ** tBTA_JV_RFCOMM_CBACK is called with BTA_JV_RFCOMM_CL_INIT_EVT 1328 ** When the connection is established or failed, 1329 ** tBTA_JV_RFCOMM_CBACK is called with BTA_JV_RFCOMM_OPEN_EVT 1330 ** 1331 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1332 ** BTA_JV_FAILURE, otherwise. 1333 ** 1334 *******************************************************************************/ 1335 tBTA_JV_STATUS BTA_JvRfcommConnect(tBTA_SEC sec_mask, 1336 tBTA_JV_ROLE role, UINT8 remote_scn, BD_ADDR peer_bd_addr, 1337 tBTA_JV_RFCOMM_CBACK *p_cback, void* user_data) 1338 { 1339 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1340 tBTA_JV_API_RFCOMM_CONNECT *p_msg; 1341 1342 APPL_TRACE_API0( "BTA_JvRfcommConnect"); 1343 if (p_cback && 1344 (p_msg = (tBTA_JV_API_RFCOMM_CONNECT *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_CONNECT))) != NULL) 1345 { 1346 p_msg->hdr.event = BTA_JV_API_RFCOMM_CONNECT_EVT; 1347 p_msg->sec_mask = sec_mask; 1348 p_msg->role = role; 1349 p_msg->remote_scn = remote_scn; 1350 memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR)); 1351 p_msg->p_cback = p_cback; 1352 p_msg->user_data = user_data; 1353 bta_sys_sendmsg(p_msg); 1354 status = BTA_JV_SUCCESS; 1355 } 1356 1357 return(status); 1358 } 1359 1360 /******************************************************************************* 1361 ** 1362 ** Function BTA_JvRfcommClose 1363 ** 1364 ** Description This function closes an RFCOMM connection 1365 ** 1366 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1367 ** BTA_JV_FAILURE, otherwise. 1368 ** 1369 *******************************************************************************/ 1370 tBTA_JV_STATUS BTA_JvRfcommClose(UINT32 handle, void *user_data) 1371 { 1372 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1373 tBTA_JV_API_RFCOMM_CLOSE *p_msg; 1374 UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1; 1375 UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle); 1376 1377 APPL_TRACE_API0( "BTA_JvRfcommClose"); 1378 if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback && 1379 si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] && 1380 (p_msg = (tBTA_JV_API_RFCOMM_CLOSE *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_CLOSE))) != NULL) 1381 { 1382 p_msg->hdr.event = BTA_JV_API_RFCOMM_CLOSE_EVT; 1383 p_msg->handle = handle; 1384 p_msg->p_cb = &bta_jv_cb.rfc_cb[hi]; 1385 p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1]; 1386 p_msg->user_data = user_data; 1387 bta_sys_sendmsg(p_msg); 1388 status = BTA_JV_SUCCESS; 1389 } 1390 1391 return(status); 1392 } 1393 1394 /******************************************************************************* 1395 ** 1396 ** Function BTA_JvRfcommStartServer 1397 ** 1398 ** Description This function starts listening for an RFCOMM connection 1399 ** request from a remote Bluetooth device. When the server is 1400 ** started successfully, tBTA_JV_RFCOMM_CBACK is called 1401 ** with BTA_JV_RFCOMM_START_EVT. 1402 ** When the connection is established, tBTA_JV_RFCOMM_CBACK 1403 ** is called with BTA_JV_RFCOMM_OPEN_EVT. 1404 ** 1405 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1406 ** BTA_JV_FAILURE, otherwise. 1407 ** 1408 *******************************************************************************/ 1409 tBTA_JV_STATUS BTA_JvRfcommStartServer(tBTA_SEC sec_mask, 1410 tBTA_JV_ROLE role, UINT8 local_scn, UINT8 max_session, 1411 tBTA_JV_RFCOMM_CBACK *p_cback, void* user_data) 1412 { 1413 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1414 tBTA_JV_API_RFCOMM_SERVER *p_msg; 1415 1416 APPL_TRACE_API0( "BTA_JvRfcommStartServer"); 1417 if (p_cback && 1418 (p_msg = (tBTA_JV_API_RFCOMM_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_SERVER))) != NULL) 1419 { 1420 if (max_session == 0) 1421 max_session = 1; 1422 if (max_session > BTA_JV_MAX_RFC_SR_SESSION) 1423 { 1424 APPL_TRACE_DEBUG2( "max_session is too big. use max (%d)", max_session, BTA_JV_MAX_RFC_SR_SESSION); 1425 max_session = BTA_JV_MAX_RFC_SR_SESSION; 1426 } 1427 p_msg->hdr.event = BTA_JV_API_RFCOMM_START_SERVER_EVT; 1428 p_msg->sec_mask = sec_mask; 1429 p_msg->role = role; 1430 p_msg->local_scn = local_scn; 1431 p_msg->max_session = max_session; 1432 p_msg->p_cback = p_cback; 1433 p_msg->user_data = user_data; //caller's private data 1434 bta_sys_sendmsg(p_msg); 1435 status = BTA_JV_SUCCESS; 1436 } 1437 1438 return(status); 1439 } 1440 1441 /******************************************************************************* 1442 ** 1443 ** Function BTA_JvRfcommStopServer 1444 ** 1445 ** Description This function stops the RFCOMM server. If the server has an 1446 ** active connection, it would be closed. 1447 ** 1448 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1449 ** BTA_JV_FAILURE, otherwise. 1450 ** 1451 *******************************************************************************/ 1452 tBTA_JV_STATUS BTA_JvRfcommStopServer(UINT32 handle, void * user_data) 1453 { 1454 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1455 tBTA_JV_API_RFCOMM_SERVER *p_msg; 1456 APPL_TRACE_API0( "BTA_JvRfcommStopServer"); 1457 if ((p_msg = (tBTA_JV_API_RFCOMM_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_SERVER))) != NULL) 1458 { 1459 p_msg->hdr.event = BTA_JV_API_RFCOMM_STOP_SERVER_EVT; 1460 p_msg->handle = handle; 1461 p_msg->user_data = user_data; //caller's private data 1462 bta_sys_sendmsg(p_msg); 1463 status = BTA_JV_SUCCESS; 1464 } 1465 1466 return(status); 1467 } 1468 1469 /******************************************************************************* 1470 ** 1471 ** Function BTA_JvRfcommRead 1472 ** 1473 ** Description This function reads data from an RFCOMM connection 1474 ** The actual size of data read is returned in p_len. 1475 ** 1476 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1477 ** BTA_JV_FAILURE, otherwise. 1478 ** 1479 *******************************************************************************/ 1480 tBTA_JV_STATUS BTA_JvRfcommRead(UINT32 handle, UINT32 req_id, UINT8 *p_data, UINT16 len) 1481 { 1482 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1483 tBTA_JV_API_RFCOMM_READ *p_msg; 1484 UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1; 1485 UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle); 1486 1487 APPL_TRACE_API0( "BTA_JvRfcommRead"); 1488 if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback && 1489 si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] && 1490 (p_msg = (tBTA_JV_API_RFCOMM_READ *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_READ))) != NULL) 1491 { 1492 p_msg->hdr.event = BTA_JV_API_RFCOMM_READ_EVT; 1493 p_msg->handle = handle; 1494 p_msg->req_id = req_id; 1495 p_msg->p_data = p_data; 1496 p_msg->len = len; 1497 p_msg->p_cb = &bta_jv_cb.rfc_cb[hi]; 1498 p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1]; 1499 bta_sys_sendmsg(p_msg); 1500 status = BTA_JV_SUCCESS; 1501 } 1502 1503 return(status); 1504 } 1505 1506 /******************************************************************************* 1507 ** 1508 ** Function BTA_JvRfcommGetPortHdl 1509 ** 1510 ** Description This function fetches the rfcomm port handle 1511 ** 1512 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1513 ** BTA_JV_FAILURE, otherwise. 1514 ** 1515 *******************************************************************************/ 1516 UINT16 BTA_JvRfcommGetPortHdl(UINT32 handle) 1517 { 1518 UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK) & ~BTA_JV_RFCOMM_MASK) - 1; 1519 UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle); 1520 1521 if (hi < BTA_JV_MAX_RFC_CONN && 1522 si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si]) 1523 return bta_jv_cb.port_cb[bta_jv_cb.rfc_cb[hi].rfc_hdl[si] - 1].port_handle; 1524 else 1525 return 0xffff; 1526 } 1527 1528 1529 /******************************************************************************* 1530 ** 1531 ** Function BTA_JvRfcommReady 1532 ** 1533 ** Description This function determined if there is data to read from 1534 ** an RFCOMM connection 1535 ** 1536 ** Returns BTA_JV_SUCCESS, if data queue size is in *p_data_size. 1537 ** BTA_JV_FAILURE, if error. 1538 ** 1539 *******************************************************************************/ 1540 tBTA_JV_STATUS BTA_JvRfcommReady(UINT32 handle, UINT32 *p_data_size) 1541 { 1542 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1543 UINT16 size = 0; 1544 UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1; 1545 UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle); 1546 1547 APPL_TRACE_API0( "BTA_JvRfcommReady"); 1548 if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback && 1549 si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si]) 1550 { 1551 if(PORT_GetRxQueueCnt(bta_jv_cb.rfc_cb[hi].rfc_hdl[si], &size) == PORT_SUCCESS) 1552 { 1553 status = BTA_JV_SUCCESS; 1554 } 1555 } 1556 *p_data_size = size; 1557 return(status); 1558 } 1559 1560 /******************************************************************************* 1561 ** 1562 ** Function BTA_JvRfcommWrite 1563 ** 1564 ** Description This function writes data to an RFCOMM connection 1565 ** 1566 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1567 ** BTA_JV_FAILURE, otherwise. 1568 ** 1569 *******************************************************************************/ 1570 tBTA_JV_STATUS BTA_JvRfcommWrite(UINT32 handle, UINT32 req_id) 1571 { 1572 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1573 tBTA_JV_API_RFCOMM_WRITE *p_msg; 1574 UINT32 hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1; 1575 UINT32 si = BTA_JV_RFC_HDL_TO_SIDX(handle); 1576 1577 APPL_TRACE_API0( "BTA_JvRfcommWrite"); 1578 APPL_TRACE_DEBUG3( "handle:0x%x, hi:%d, si:%d", handle, hi, si); 1579 if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback && 1580 si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] && 1581 (p_msg = (tBTA_JV_API_RFCOMM_WRITE *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_WRITE))) != NULL) 1582 { 1583 p_msg->hdr.event = BTA_JV_API_RFCOMM_WRITE_EVT; 1584 p_msg->handle = handle; 1585 p_msg->req_id = req_id; 1586 p_msg->p_cb = &bta_jv_cb.rfc_cb[hi]; 1587 p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1]; 1588 APPL_TRACE_API0( "write ok"); 1589 bta_sys_sendmsg(p_msg); 1590 status = BTA_JV_SUCCESS; 1591 } 1592 1593 return(status); 1594 } 1595 1596 1597 /******************************************************************************* 1598 ** 1599 ** Function BTA_JVSetPmProfile 1600 ** 1601 ** Description This function set or free power mode profile for different JV application 1602 ** 1603 ** Parameters: handle, JV handle from RFCOMM or L2CAP 1604 ** app_id: app specific pm ID, can be BTA_JV_PM_ALL, see bta_dm_cfg.c for details 1605 ** BTA_JV_PM_ID_CLEAR: removes pm management on the handle. init_st is ignored and 1606 ** BTA_JV_CONN_CLOSE is called implicitely 1607 ** init_st: state after calling this API. typically it should be BTA_JV_CONN_OPEN 1608 ** 1609 ** Returns BTA_JV_SUCCESS, if the request is being processed. 1610 ** BTA_JV_FAILURE, otherwise. 1611 ** 1612 ** NOTE: BTA_JV_PM_ID_CLEAR: In general no need to be called as jv pm calls automatically 1613 ** BTA_JV_CONN_CLOSE to remove in case of connection close! 1614 ** 1615 *******************************************************************************/ 1616 tBTA_JV_STATUS BTA_JvSetPmProfile(UINT32 handle, tBTA_JV_PM_ID app_id, tBTA_JV_CONN_STATE init_st) 1617 { 1618 tBTA_JV_STATUS status = BTA_JV_FAILURE; 1619 tBTA_JV_API_SET_PM_PROFILE *p_msg; 1620 1621 APPL_TRACE_API2("BTA_JVSetPmProfile handle:0x%x, app_id:%d", handle, app_id); 1622 if ((p_msg = (tBTA_JV_API_SET_PM_PROFILE *)GKI_getbuf(sizeof(tBTA_JV_API_SET_PM_PROFILE))) 1623 != NULL) 1624 { 1625 p_msg->hdr.event = BTA_JV_API_SET_PM_PROFILE_EVT; 1626 p_msg->handle = handle; 1627 p_msg->app_id = app_id; 1628 p_msg->init_st = init_st; 1629 bta_sys_sendmsg(p_msg); 1630 status = BTA_JV_SUCCESS; 1631 } 1632 1633 return (status); 1634 } 1635