Home | History | Annotate | Download | only in jv
      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 "gki.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     tBTA_JV_API_ENABLE  *p_buf;
     64     int i;
     65 
     66     APPL_TRACE_API( "BTA_JvEnable");
     67     if(p_cback && FALSE == bta_sys_is_register(BTA_ID_JV))
     68     {
     69         memset(&bta_jv_cb, 0, sizeof(tBTA_JV_CB));
     70         /* set handle to invalid value by default */
     71         for (i=0; i<BTA_JV_PM_MAX_NUM; i++)
     72         {
     73             bta_jv_cb.pm_cb[i].handle = BTA_JV_PM_HANDLE_CLEAR;
     74         }
     75 
     76         /* register with BTA system manager */
     77         bta_sys_register(BTA_ID_JV, &bta_jv_reg);
     78 
     79         if (p_cback && (p_buf = (tBTA_JV_API_ENABLE *) GKI_getbuf(sizeof(tBTA_JV_API_ENABLE))) != NULL)
     80         {
     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;
    106 
    107     APPL_TRACE_API( "BTA_JvDisable");
    108     bta_sys_deregister(BTA_ID_JV);
    109     if ((p_buf = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    110     {
    111         p_buf->event = BTA_JV_API_DISABLE_EVT;
    112         bta_sys_sendmsg(p_buf);
    113     }
    114 }
    115 
    116 /*******************************************************************************
    117 **
    118 ** Function         BTA_JvIsEnable
    119 **
    120 ** Description      Get the JV registration status.
    121 **
    122 ** Returns          TRUE, if registered
    123 **
    124 *******************************************************************************/
    125 BOOLEAN BTA_JvIsEnable(void)
    126 {
    127     return bta_sys_is_register(BTA_ID_JV);
    128 }
    129 
    130 /*******************************************************************************
    131 **
    132 ** Function         BTA_JvIsEncrypted
    133 **
    134 ** Description      This function checks if the link to peer device is encrypted
    135 **
    136 ** Returns          TRUE if encrypted.
    137 **                  FALSE if not.
    138 **
    139 *******************************************************************************/
    140 BOOLEAN BTA_JvIsEncrypted(BD_ADDR bd_addr)
    141 {
    142     BOOLEAN is_encrypted = FALSE;
    143     UINT8 sec_flags, le_flags;
    144 
    145     if (BTM_GetSecurityFlags(bd_addr, &sec_flags) &&
    146         BTM_GetSecurityFlagsByTransport(bd_addr, &le_flags, BT_TRANSPORT_LE))
    147     {
    148         if(sec_flags & BTM_SEC_FLAG_ENCRYPTED ||
    149            le_flags & BTM_SEC_FLAG_ENCRYPTED)
    150             is_encrypted = TRUE;
    151     }
    152     return is_encrypted;
    153 }
    154 /*******************************************************************************
    155 **
    156 ** Function         BTA_JvGetChannelId
    157 **
    158 ** Description      This function reserves a SCN (server channel number) for
    159 **                  applications running over RFCOMM, L2CAP of L2CAP_LE.
    160 **                  It is primarily called by server profiles/applications to
    161 **                  register their SCN into the SDP database. The SCN is reported
    162 **                  by the tBTA_JV_DM_CBACK callback with a BTA_JV_GET_SCN_EVT
    163 **                  for RFCOMM channels and BTA_JV_GET_PSM_EVT for L2CAP and LE.
    164 **                  If the SCN/PSM reported is 0, that means all resources are
    165 **                  exhausted.
    166 ** Parameters
    167 **   conn_type      one of BTA_JV_CONN_TYPE_
    168 **   user_data      Any uservalue - will be returned in the resulting event.
    169 **   channel        Only used for RFCOMM - to try to allocate a specific RFCOMM
    170 **                  channel.
    171 **
    172 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    173 **                  BTA_JV_FAILURE, otherwise.
    174 **
    175 *******************************************************************************/
    176 tBTA_JV_STATUS BTA_JvGetChannelId(int conn_type, void* user_data, INT32 channel)
    177 {
    178     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    179     tBTA_JV_API_ALLOC_CHANNEL *p_msg;
    180 
    181     APPL_TRACE_API( "%s", __func__);
    182     if ((p_msg = (tBTA_JV_API_ALLOC_CHANNEL *)GKI_getbuf(sizeof(tBTA_JV_API_ALLOC_CHANNEL))) != NULL)
    183     {
    184         p_msg->hdr.event = BTA_JV_API_GET_CHANNEL_EVT;
    185         p_msg->type      = conn_type;
    186         p_msg->channel   = channel;
    187         p_msg->user_data = user_data;
    188         bta_sys_sendmsg(p_msg);
    189         status = BTA_JV_SUCCESS;
    190     }
    191 
    192     return(status);
    193 }
    194 
    195 /*******************************************************************************
    196 **
    197 ** Function         BTA_JvFreeChannel
    198 **
    199 ** Description      This function frees a server channel number that was used
    200 **                  by an application running over RFCOMM.
    201 ** Parameters
    202 **   channel        The channel to free
    203 **   conn_type      one of BTA_JV_CONN_TYPE_
    204 **
    205 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    206 **                  BTA_JV_FAILURE, otherwise.
    207 **
    208 *******************************************************************************/
    209 tBTA_JV_STATUS BTA_JvFreeChannel(UINT16 channel, int conn_type)
    210 {
    211     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    212     tBTA_JV_API_FREE_CHANNEL *p_msg;
    213 
    214     APPL_TRACE_API( "%s", __func__);
    215     if ((p_msg = (tBTA_JV_API_FREE_CHANNEL *)GKI_getbuf(sizeof(tBTA_JV_API_FREE_CHANNEL))) != NULL)
    216     {
    217         p_msg->hdr.event = BTA_JV_API_FREE_SCN_EVT;
    218         p_msg->scn       = channel;
    219         p_msg->type      = conn_type;
    220         bta_sys_sendmsg(p_msg);
    221         status = BTA_JV_SUCCESS;
    222     }
    223 
    224     return(status);
    225 }
    226 
    227 /*******************************************************************************
    228 **
    229 ** Function         BTA_JvStartDiscovery
    230 **
    231 ** Description      This function performs service discovery for the services
    232 **                  provided by the given peer device. When the operation is
    233 **                  complete the tBTA_JV_DM_CBACK callback function will be
    234 **                  called with a BTA_JV_DISCOVERY_COMP_EVT.
    235 **
    236 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    237 **                  BTA_JV_FAILURE, otherwise.
    238 **
    239 *******************************************************************************/
    240 tBTA_JV_STATUS BTA_JvStartDiscovery(BD_ADDR bd_addr, UINT16 num_uuid,
    241             tSDP_UUID *p_uuid_list, void * user_data)
    242 {
    243     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    244     tBTA_JV_API_START_DISCOVERY *p_msg;
    245 
    246     APPL_TRACE_API( "BTA_JvStartDiscovery");
    247     if ((p_msg = (tBTA_JV_API_START_DISCOVERY *)GKI_getbuf(sizeof(tBTA_JV_API_START_DISCOVERY))) != NULL)
    248     {
    249         p_msg->hdr.event = BTA_JV_API_START_DISCOVERY_EVT;
    250         bdcpy(p_msg->bd_addr, bd_addr);
    251         p_msg->num_uuid = num_uuid;
    252         memcpy(p_msg->uuid_list, p_uuid_list, num_uuid * sizeof(tSDP_UUID));
    253         p_msg->num_attr = 0;
    254         p_msg->user_data = user_data;
    255         bta_sys_sendmsg(p_msg);
    256         status = BTA_JV_SUCCESS;
    257     }
    258 
    259     return(status);
    260 }
    261 
    262 /*******************************************************************************
    263 **
    264 ** Function         BTA_JvCreateRecord
    265 **
    266 ** Description      Create a service record in the local SDP database.
    267 **                  When the operation is complete the tBTA_JV_DM_CBACK callback
    268 **                  function will be called with a BTA_JV_CREATE_RECORD_EVT.
    269 **
    270 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    271 **                  BTA_JV_FAILURE, otherwise.
    272 **
    273 *******************************************************************************/
    274 tBTA_JV_STATUS BTA_JvCreateRecordByUser(void *user_data)
    275 {
    276     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    277     tBTA_JV_API_CREATE_RECORD *p_msg;
    278 
    279     APPL_TRACE_API( "BTA_JvCreateRecordByUser");
    280     if ((p_msg = (tBTA_JV_API_CREATE_RECORD *)GKI_getbuf(sizeof(tBTA_JV_API_CREATE_RECORD))) != NULL)
    281     {
    282         p_msg->hdr.event = BTA_JV_API_CREATE_RECORD_EVT;
    283         p_msg->user_data = user_data;
    284         bta_sys_sendmsg(p_msg);
    285         status = BTA_JV_SUCCESS;
    286     }
    287 
    288     return(status);
    289 }
    290 
    291 /*******************************************************************************
    292 **
    293 ** Function         BTA_JvDeleteRecord
    294 **
    295 ** Description      Delete a service record in the local SDP database.
    296 **
    297 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    298 **                  BTA_JV_FAILURE, otherwise.
    299 **
    300 *******************************************************************************/
    301 tBTA_JV_STATUS BTA_JvDeleteRecord(UINT32 handle)
    302 {
    303     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    304     tBTA_JV_API_ADD_ATTRIBUTE *p_msg;
    305 
    306     APPL_TRACE_API( "BTA_JvDeleteRecord");
    307     if ((p_msg = (tBTA_JV_API_ADD_ATTRIBUTE *)GKI_getbuf(sizeof(tBTA_JV_API_ADD_ATTRIBUTE))) != NULL)
    308     {
    309         p_msg->hdr.event = BTA_JV_API_DELETE_RECORD_EVT;
    310         p_msg->handle = handle;
    311         bta_sys_sendmsg(p_msg);
    312         status = BTA_JV_SUCCESS;
    313     }
    314     return(status);
    315 }
    316 
    317 /*******************************************************************************
    318 **
    319 ** Function         BTA_JvL2capConnectLE
    320 **
    321 ** Description      Initiate an LE connection as a L2CAP client to the given BD
    322 **                  Address.
    323 **                  When the connection is initiated or failed to initiate,
    324 **                  tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_CL_INIT_EVT
    325 **                  When the connection is established or failed,
    326 **                  tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT
    327 **
    328 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    329 **                  BTA_JV_FAILURE, otherwise.
    330 **
    331 *******************************************************************************/
    332 tBTA_JV_STATUS BTA_JvL2capConnectLE(tBTA_SEC sec_mask, tBTA_JV_ROLE role,
    333                            const tL2CAP_ERTM_INFO *ertm_info, UINT16 remote_chan,
    334                            UINT16 rx_mtu, tL2CAP_CFG_INFO *cfg,
    335                            BD_ADDR peer_bd_addr, tBTA_JV_L2CAP_CBACK *p_cback, void *user_data)
    336 {
    337     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    338     tBTA_JV_API_L2CAP_CONNECT *p_msg;
    339 
    340     APPL_TRACE_API( "%s", __func__);
    341 
    342     if (p_cback &&
    343         (p_msg =
    344          (tBTA_JV_API_L2CAP_CONNECT *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_CONNECT))) != NULL)
    345     {
    346         p_msg->hdr.event    = BTA_JV_API_L2CAP_CONNECT_LE_EVT;
    347         p_msg->sec_mask     = sec_mask;
    348         p_msg->role         = role;
    349         p_msg->remote_chan  = remote_chan;
    350         p_msg->rx_mtu       = rx_mtu;
    351         if(cfg != NULL) {
    352             p_msg->has_cfg = TRUE;
    353             p_msg->cfg = *cfg;
    354         } else {
    355             p_msg->has_cfg = FALSE;
    356         }
    357         if(ertm_info != NULL) {
    358             p_msg->has_ertm_info = TRUE;
    359             p_msg->ertm_info = *ertm_info;
    360         } else {
    361             p_msg->has_ertm_info = FALSE;
    362         }
    363         memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR));
    364         p_msg->p_cback      = p_cback;
    365         p_msg->user_data    = user_data;
    366         bta_sys_sendmsg(p_msg);
    367         status = BTA_JV_SUCCESS;
    368     }
    369 
    370     return(status);
    371 }
    372 
    373 /*******************************************************************************
    374 **
    375 ** Function         BTA_JvL2capConnect
    376 **
    377 ** Description      Initiate a connection as a L2CAP client to the given BD
    378 **                  Address.
    379 **                  When the connection is initiated or failed to initiate,
    380 **                  tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_CL_INIT_EVT
    381 **                  When the connection is established or failed,
    382 **                  tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT
    383 **
    384 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    385 **                  BTA_JV_FAILURE, otherwise.
    386 **
    387 *******************************************************************************/
    388 tBTA_JV_STATUS BTA_JvL2capConnect(tBTA_SEC sec_mask, tBTA_JV_ROLE role,
    389                            const tL2CAP_ERTM_INFO *ertm_info, UINT16 remote_psm,
    390                            UINT16 rx_mtu, tL2CAP_CFG_INFO *cfg,
    391                            BD_ADDR peer_bd_addr, tBTA_JV_L2CAP_CBACK *p_cback, void *user_data)
    392 {
    393     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    394     tBTA_JV_API_L2CAP_CONNECT *p_msg;
    395 
    396     APPL_TRACE_API( "%s", __func__);
    397 
    398     if (p_cback &&
    399         (p_msg = (tBTA_JV_API_L2CAP_CONNECT *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_CONNECT))) != NULL)
    400     {
    401         p_msg->hdr.event    = BTA_JV_API_L2CAP_CONNECT_EVT;
    402         p_msg->sec_mask     = sec_mask;
    403         p_msg->role         = role;
    404         p_msg->remote_psm   = remote_psm;
    405         p_msg->rx_mtu       = rx_mtu;
    406         if(cfg != NULL) {
    407             p_msg->has_cfg = TRUE;
    408             p_msg->cfg = *cfg;
    409         } else {
    410             p_msg->has_cfg = FALSE;
    411         }
    412         if(ertm_info != NULL) {
    413             p_msg->has_ertm_info = TRUE;
    414             p_msg->ertm_info = *ertm_info;
    415         } else {
    416             p_msg->has_ertm_info = FALSE;
    417         }
    418         memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR));
    419         p_msg->p_cback      = p_cback;
    420         p_msg->user_data    = user_data;
    421         bta_sys_sendmsg(p_msg);
    422         status = BTA_JV_SUCCESS;
    423     }
    424 
    425     return(status);
    426 }
    427 
    428 /*******************************************************************************
    429 **
    430 ** Function         BTA_JvL2capClose
    431 **
    432 ** Description      This function closes an L2CAP client connection
    433 **
    434 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    435 **                  BTA_JV_FAILURE, otherwise.
    436 **
    437 *******************************************************************************/
    438 tBTA_JV_STATUS BTA_JvL2capClose(UINT32 handle)
    439 {
    440     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    441     tBTA_JV_API_L2CAP_CLOSE *p_msg;
    442 
    443     APPL_TRACE_API( "%s", __func__);
    444 
    445     if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback &&
    446         (p_msg = (tBTA_JV_API_L2CAP_CLOSE *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_CLOSE))) != NULL)
    447     {
    448         p_msg->hdr.event = BTA_JV_API_L2CAP_CLOSE_EVT;
    449         p_msg->handle = handle;
    450         p_msg->p_cb = &bta_jv_cb.l2c_cb[handle];
    451         bta_sys_sendmsg(p_msg);
    452         status = BTA_JV_SUCCESS;
    453     }
    454 
    455     return(status);
    456 }
    457 
    458 /*******************************************************************************
    459 **
    460 ** Function         BTA_JvL2capCloseLE
    461 **
    462 ** Description      This function closes an L2CAP client connection for Fixed Channels
    463 **                  Function is idempotent and no callbacks are called!
    464 **
    465 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    466 **                  BTA_JV_FAILURE, otherwise.
    467 **
    468 *******************************************************************************/
    469 tBTA_JV_STATUS BTA_JvL2capCloseLE(UINT32 handle)
    470 {
    471     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    472     tBTA_JV_API_L2CAP_CLOSE *p_msg;
    473 
    474     APPL_TRACE_API( "%s", __func__);
    475 
    476     if ((p_msg = (tBTA_JV_API_L2CAP_CLOSE *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_CLOSE))) != NULL)
    477     {
    478         p_msg->hdr.event = BTA_JV_API_L2CAP_CLOSE_FIXED_EVT;
    479         p_msg->handle = handle;
    480         bta_sys_sendmsg(p_msg);
    481         status = BTA_JV_SUCCESS;
    482     }
    483 
    484     return(status);
    485 }
    486 
    487 /*******************************************************************************
    488 **
    489 ** Function         BTA_JvL2capStartServer
    490 **
    491 ** Description      This function starts an L2CAP server and listens for an L2CAP
    492 **                  connection from a remote Bluetooth device.  When the server
    493 **                  is started successfully, tBTA_JV_L2CAP_CBACK is called with
    494 **                  BTA_JV_L2CAP_START_EVT.  When the connection is established,
    495 **                  tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT.
    496 **
    497 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    498 **                  BTA_JV_FAILURE, otherwise.
    499 **
    500 *******************************************************************************/
    501 tBTA_JV_STATUS BTA_JvL2capStartServer(tBTA_SEC sec_mask, tBTA_JV_ROLE role,
    502         const tL2CAP_ERTM_INFO *ertm_info,UINT16 local_psm, UINT16 rx_mtu, tL2CAP_CFG_INFO *cfg,
    503         tBTA_JV_L2CAP_CBACK *p_cback, void *user_data)
    504 {
    505     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    506     tBTA_JV_API_L2CAP_SERVER *p_msg;
    507 
    508     APPL_TRACE_API( "%s", __func__);
    509 
    510     if (p_cback &&
    511         (p_msg = (tBTA_JV_API_L2CAP_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_SERVER))) != NULL)
    512     {
    513         p_msg->hdr.event = BTA_JV_API_L2CAP_START_SERVER_EVT;
    514         p_msg->sec_mask = sec_mask;
    515         p_msg->role = role;
    516         p_msg->local_psm = local_psm;
    517         p_msg->rx_mtu = rx_mtu;
    518         if(cfg != NULL) {
    519             p_msg->has_cfg = TRUE;
    520             p_msg->cfg = *cfg;
    521         } else {
    522             p_msg->has_cfg = FALSE;
    523         }
    524         if(ertm_info != NULL) {
    525             p_msg->has_ertm_info = TRUE;
    526             p_msg->ertm_info = *ertm_info;
    527         } else {
    528             p_msg->has_ertm_info = FALSE;
    529         }
    530         p_msg->p_cback = p_cback;
    531         p_msg->user_data = user_data;
    532         bta_sys_sendmsg(p_msg);
    533         status = BTA_JV_SUCCESS;
    534     }
    535 
    536     return(status);
    537 }
    538 
    539 /*******************************************************************************
    540 **
    541 ** Function         BTA_JvL2capStartServerLE
    542 **
    543 ** Description      This function starts an LE L2CAP server and listens for an L2CAP
    544 **                  connection from a remote Bluetooth device.  When the server
    545 **                  is started successfully, tBTA_JV_L2CAP_CBACK is called with
    546 **                  BTA_JV_L2CAP_START_EVT.  When the connection is established,
    547 **                  tBTA_JV_L2CAP_CBACK is called with BTA_JV_L2CAP_OPEN_EVT.
    548 **
    549 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    550 **                  BTA_JV_FAILURE, otherwise.
    551 **
    552 *******************************************************************************/
    553 tBTA_JV_STATUS BTA_JvL2capStartServerLE(tBTA_SEC sec_mask, tBTA_JV_ROLE role,
    554         const tL2CAP_ERTM_INFO *ertm_info,UINT16 local_chan, UINT16 rx_mtu, tL2CAP_CFG_INFO *cfg,
    555         tBTA_JV_L2CAP_CBACK *p_cback, void *user_data)
    556 {
    557     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    558     tBTA_JV_API_L2CAP_SERVER *p_msg;
    559 
    560     APPL_TRACE_API( "%s", __func__);
    561 
    562     if (p_cback &&
    563         (p_msg = (tBTA_JV_API_L2CAP_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_SERVER))) != NULL)
    564     {
    565         p_msg->hdr.event = BTA_JV_API_L2CAP_START_SERVER_LE_EVT;
    566         p_msg->sec_mask = sec_mask;
    567         p_msg->role = role;
    568         p_msg->local_chan = local_chan;
    569         p_msg->rx_mtu = rx_mtu;
    570         if(cfg != NULL) {
    571             p_msg->has_cfg = TRUE;
    572             p_msg->cfg = *cfg;
    573         } else {
    574             p_msg->has_cfg = FALSE;
    575         }
    576         if(ertm_info != NULL) {
    577             p_msg->has_ertm_info = TRUE;
    578             p_msg->ertm_info = *ertm_info;
    579         } else {
    580             p_msg->has_ertm_info = FALSE;
    581         }
    582         p_msg->p_cback = p_cback;
    583         p_msg->user_data = user_data;
    584         bta_sys_sendmsg(p_msg);
    585         status = BTA_JV_SUCCESS;
    586     }
    587 
    588     return(status);
    589 }
    590 
    591 /*******************************************************************************
    592 **
    593 ** Function         BTA_JvL2capStopServer
    594 **
    595 ** Description      This function stops the L2CAP server. If the server has an
    596 **                  active connection, it would be closed.
    597 **
    598 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    599 **                  BTA_JV_FAILURE, otherwise.
    600 **
    601 *******************************************************************************/
    602 tBTA_JV_STATUS BTA_JvL2capStopServer(UINT16 local_psm, void *user_data)
    603 {
    604     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    605     tBTA_JV_API_L2CAP_SERVER *p_msg;
    606 
    607     APPL_TRACE_API( "%s", __func__);
    608 
    609     if ((p_msg = (tBTA_JV_API_L2CAP_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_SERVER))) != NULL)
    610     {
    611         p_msg->hdr.event = BTA_JV_API_L2CAP_STOP_SERVER_EVT;
    612         p_msg->local_psm = local_psm;
    613         p_msg->user_data = user_data;
    614         bta_sys_sendmsg(p_msg);
    615         status = BTA_JV_SUCCESS;
    616     }
    617 
    618     return(status);
    619 }
    620 
    621 /*******************************************************************************
    622 **
    623 ** Function         BTA_JvL2capStopServerLE
    624 **
    625 ** Description      This function stops the LE L2CAP server. If the server has an
    626 **                  active connection, it would be closed.
    627 **
    628 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    629 **                  BTA_JV_FAILURE, otherwise.
    630 **
    631 *******************************************************************************/
    632 tBTA_JV_STATUS BTA_JvL2capStopServerLE(UINT16 local_chan, void *user_data)
    633 {
    634     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    635     tBTA_JV_API_L2CAP_SERVER *p_msg;
    636 
    637     APPL_TRACE_API( "%s", __func__);
    638 
    639     if ((p_msg = (tBTA_JV_API_L2CAP_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_SERVER))) != NULL)
    640     {
    641         p_msg->hdr.event = BTA_JV_API_L2CAP_STOP_SERVER_LE_EVT;
    642         p_msg->local_chan = local_chan;
    643         p_msg->user_data = user_data;
    644         bta_sys_sendmsg(p_msg);
    645         status = BTA_JV_SUCCESS;
    646     }
    647 
    648     return(status);
    649 }
    650 
    651 /*******************************************************************************
    652 **
    653 ** Function         BTA_JvL2capRead
    654 **
    655 ** Description      This function reads data from an L2CAP connecti;
    656     tBTA_JV_RFC_CB  *p_cb = rc->p_cb;
    657 on
    658 **                  When the operation is complete, tBTA_JV_L2CAP_CBACK is
    659 **                  called with BTA_JV_L2CAP_READ_EVT.
    660 **
    661 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    662 **                  BTA_JV_FAILURE, otherwise.
    663 **
    664 *******************************************************************************/
    665 tBTA_JV_STATUS BTA_JvL2capRead(UINT32 handle, UINT32 req_id, UINT8 *p_data, UINT16 len)
    666 {
    667     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    668     tBTA_JV_L2CAP_READ evt_data;
    669 
    670     APPL_TRACE_API( "%s", __func__);
    671 
    672 
    673     if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback)
    674     {
    675         status = BTA_JV_SUCCESS;
    676         evt_data.status = BTA_JV_FAILURE;
    677         evt_data.handle = handle;
    678         evt_data.req_id = req_id;
    679         evt_data.p_data = p_data;
    680         evt_data.len    = 0;
    681 
    682         if (BT_PASS == GAP_ConnReadData((UINT16)handle, p_data, len, &evt_data.len))
    683         {
    684             evt_data.status = BTA_JV_SUCCESS;
    685         }
    686         bta_jv_cb.l2c_cb[handle].p_cback(
    687                 BTA_JV_L2CAP_READ_EVT, (tBTA_JV *)&evt_data, bta_jv_cb.l2c_cb[handle].user_data);
    688     }
    689 
    690     return(status);
    691 }
    692 
    693 /*******************************************************************************
    694 **
    695 ** Function         BTA_JvL2capReceive
    696 **
    697 ** Description      This function reads data from an L2CAP connection
    698 **                  When the operation is complete, tBTA_JV_L2CAP_CBACK is
    699 **                  called with BTA_JV_L2CAP_RECEIVE_EVT.
    700 **                  If there are more data queued in L2CAP than len, the extra data will be discarded.
    701 **
    702 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    703 **                  BTA_JV_FAILURE, otherwise.
    704 **
    705 *******************************************************************************/
    706 tBTA_JV_STATUS BTA_JvL2capReceive(UINT32 handle, UINT32 req_id, UINT8 *p_data, UINT16 len)
    707 {
    708     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    709     tBTA_JV_L2CAP_RECEIVE evt_data;
    710     UINT32  left_over = 0;
    711     UINT16  max_len, read_len;
    712 
    713     APPL_TRACE_API( "%s", __func__);
    714 
    715 
    716     if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback)
    717     {
    718         status = BTA_JV_SUCCESS;
    719         evt_data.status = BTA_JV_FAILURE;
    720         evt_data.handle = handle;
    721         evt_data.req_id = req_id;
    722         evt_data.p_data = p_data;
    723         evt_data.len    = 0;
    724 
    725         if (BT_PASS == GAP_ConnReadData((UINT16)handle, p_data, len, &evt_data.len))
    726         {
    727             evt_data.status = BTA_JV_SUCCESS;
    728             GAP_GetRxQueueCnt ((UINT16)handle, &left_over);
    729             while (left_over)
    730             {
    731                 max_len = (left_over > 0xFFFF)?0xFFFF:left_over;
    732                 GAP_ConnReadData ((UINT16)handle, NULL, max_len, &read_len);
    733                 left_over -= read_len;
    734             }
    735         }
    736         bta_jv_cb.l2c_cb[handle].p_cback(
    737             BTA_JV_L2CAP_RECEIVE_EVT, (tBTA_JV *)&evt_data, bta_jv_cb.l2c_cb[handle].user_data);
    738     }
    739 
    740     return(status);
    741 }
    742 /*******************************************************************************
    743 **
    744 ** Function         BTA_JvL2capReady
    745 **
    746 ** Description      This function determined if there is data to read from
    747 **                    an L2CAP connection
    748 **
    749 ** Returns          BTA_JV_SUCCESS, if data queue size is in *p_data_size.
    750 **                  BTA_JV_FAILURE, if error.
    751 **
    752 *******************************************************************************/
    753 tBTA_JV_STATUS BTA_JvL2capReady(UINT32 handle, UINT32 *p_data_size)
    754 {
    755     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    756 
    757     APPL_TRACE_API( "%s: %d", __func__, handle);
    758     if (p_data_size && handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback)
    759     {
    760         *p_data_size = 0;
    761         if(BT_PASS == GAP_GetRxQueueCnt((UINT16)handle, p_data_size) )
    762         {
    763             status = BTA_JV_SUCCESS;
    764         }
    765     }
    766 
    767     return(status);
    768 }
    769 
    770 
    771 /*******************************************************************************
    772 **
    773 ** Function         BTA_JvL2capWrite
    774 **
    775 ** Description      This function writes data to an L2CAP connection
    776 **                  When the operation is complete, tBTA_JV_L2CAP_CBACK is
    777 **                  called with BTA_JV_L2CAP_WRITE_EVT. Works for
    778 **                  PSM-based connections
    779 **
    780 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    781 **                  BTA_JV_FAILURE, otherwise.
    782 **
    783 *******************************************************************************/
    784 tBTA_JV_STATUS BTA_JvL2capWrite(UINT32 handle, UINT32 req_id, UINT8 *p_data,
    785         UINT16 len, void *user_data)
    786 {
    787     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    788     tBTA_JV_API_L2CAP_WRITE *p_msg;
    789 
    790     APPL_TRACE_API( "%s", __func__);
    791 
    792     if (handle < BTA_JV_MAX_L2C_CONN && bta_jv_cb.l2c_cb[handle].p_cback &&
    793         (p_msg = (tBTA_JV_API_L2CAP_WRITE *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_WRITE))) != NULL)
    794     {
    795         p_msg->hdr.event = BTA_JV_API_L2CAP_WRITE_EVT;
    796         p_msg->handle = handle;
    797         p_msg->req_id = req_id;
    798         p_msg->p_data = p_data;
    799         p_msg->p_cb = &bta_jv_cb.l2c_cb[handle];
    800         p_msg->len = len;
    801         p_msg->user_data = user_data;
    802         bta_sys_sendmsg(p_msg);
    803         status = BTA_JV_SUCCESS;
    804     }
    805 
    806     return(status);
    807 }
    808 
    809 /*******************************************************************************
    810 **
    811 ** Function         BTA_JvL2capWriteFixed
    812 **
    813 ** Description      This function writes data to an L2CAP connection
    814 **                  When the operation is complete, tBTA_JV_L2CAP_CBACK is
    815 **                  called with BTA_JV_L2CAP_WRITE_EVT. Works for
    816 **                  fixed-channel connections
    817 **
    818 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    819 **                  BTA_JV_FAILURE, otherwise.
    820 **
    821 *******************************************************************************/
    822 tBTA_JV_STATUS BTA_JvL2capWriteFixed(UINT16 channel, BD_ADDR *addr, UINT32 req_id,
    823         tBTA_JV_L2CAP_CBACK *p_cback, UINT8 *p_data, UINT16 len, void *user_data)
    824 {
    825     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    826     tBTA_JV_API_L2CAP_WRITE_FIXED *p_msg;
    827 
    828     APPL_TRACE_API( "%s", __func__);
    829 
    830     if ((p_msg =
    831         (tBTA_JV_API_L2CAP_WRITE_FIXED *)GKI_getbuf(sizeof(tBTA_JV_API_L2CAP_WRITE_FIXED))) != NULL)
    832     {
    833         p_msg->hdr.event = BTA_JV_API_L2CAP_WRITE_FIXED_EVT;
    834         p_msg->channel = channel;
    835         memcpy(p_msg->addr, addr, sizeof(p_msg->addr));
    836         p_msg->req_id = req_id;
    837         p_msg->p_data = p_data;
    838         p_msg->p_cback = p_cback;
    839         p_msg->len = len;
    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_JvRfcommConnect
    851 **
    852 ** Description      This function makes an RFCOMM conection to a remote BD
    853 **                  Address.
    854 **                  When the connection is initiated or failed to initiate,
    855 **                  tBTA_JV_RFCOMM_CBACK is called with BTA_JV_RFCOMM_CL_INIT_EVT
    856 **                  When the connection is established or failed,
    857 **                  tBTA_JV_RFCOMM_CBACK is called with BTA_JV_RFCOMM_OPEN_EVT
    858 **
    859 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    860 **                  BTA_JV_FAILURE, otherwise.
    861 **
    862 *******************************************************************************/
    863 tBTA_JV_STATUS BTA_JvRfcommConnect(tBTA_SEC sec_mask,
    864                            tBTA_JV_ROLE role, UINT8 remote_scn, BD_ADDR peer_bd_addr,
    865                            tBTA_JV_RFCOMM_CBACK *p_cback, void* user_data)
    866 {
    867     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    868     tBTA_JV_API_RFCOMM_CONNECT *p_msg;
    869 
    870     APPL_TRACE_API( "BTA_JvRfcommConnect");
    871     if (p_cback &&
    872         (p_msg = (tBTA_JV_API_RFCOMM_CONNECT *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_CONNECT))) != NULL)
    873     {
    874         p_msg->hdr.event    = BTA_JV_API_RFCOMM_CONNECT_EVT;
    875         p_msg->sec_mask     = sec_mask;
    876         p_msg->role         = role;
    877         p_msg->remote_scn   = remote_scn;
    878         memcpy(p_msg->peer_bd_addr, peer_bd_addr, sizeof(BD_ADDR));
    879         p_msg->p_cback      = p_cback;
    880         p_msg->user_data    = user_data;
    881         bta_sys_sendmsg(p_msg);
    882         status = BTA_JV_SUCCESS;
    883     }
    884 
    885     return(status);
    886 }
    887 
    888 /*******************************************************************************
    889 **
    890 ** Function         BTA_JvRfcommClose
    891 **
    892 ** Description      This function closes an RFCOMM connection
    893 **
    894 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    895 **                  BTA_JV_FAILURE, otherwise.
    896 **
    897 *******************************************************************************/
    898 tBTA_JV_STATUS BTA_JvRfcommClose(UINT32 handle, void *user_data)
    899 {
    900     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    901     tBTA_JV_API_RFCOMM_CLOSE *p_msg;
    902     UINT32  hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
    903     UINT32  si = BTA_JV_RFC_HDL_TO_SIDX(handle);
    904 
    905     APPL_TRACE_API( "BTA_JvRfcommClose");
    906     if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
    907         si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] &&
    908         (p_msg = (tBTA_JV_API_RFCOMM_CLOSE *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_CLOSE))) != NULL)
    909     {
    910         p_msg->hdr.event = BTA_JV_API_RFCOMM_CLOSE_EVT;
    911         p_msg->handle = handle;
    912         p_msg->p_cb = &bta_jv_cb.rfc_cb[hi];
    913         p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1];
    914         p_msg->user_data = user_data;
    915         bta_sys_sendmsg(p_msg);
    916         status = BTA_JV_SUCCESS;
    917     }
    918 
    919     return(status);
    920 }
    921 
    922 /*******************************************************************************
    923 **
    924 ** Function         BTA_JvRfcommStartServer
    925 **
    926 ** Description      This function starts listening for an RFCOMM connection
    927 **                  request from a remote Bluetooth device.  When the server is
    928 **                  started successfully, tBTA_JV_RFCOMM_CBACK is called
    929 **                  with BTA_JV_RFCOMM_START_EVT.
    930 **                  When the connection is established, tBTA_JV_RFCOMM_CBACK
    931 **                  is called with BTA_JV_RFCOMM_OPEN_EVT.
    932 **
    933 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    934 **                  BTA_JV_FAILURE, otherwise.
    935 **
    936 *******************************************************************************/
    937 tBTA_JV_STATUS BTA_JvRfcommStartServer(tBTA_SEC sec_mask,
    938                            tBTA_JV_ROLE role, UINT8 local_scn, UINT8 max_session,
    939                            tBTA_JV_RFCOMM_CBACK *p_cback, void* user_data)
    940 {
    941     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    942     tBTA_JV_API_RFCOMM_SERVER *p_msg;
    943 
    944     APPL_TRACE_API( "BTA_JvRfcommStartServer");
    945     if (p_cback &&
    946         (p_msg = (tBTA_JV_API_RFCOMM_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_SERVER))) != NULL)
    947     {
    948         if (max_session == 0)
    949             max_session = 1;
    950         if (max_session > BTA_JV_MAX_RFC_SR_SESSION)
    951         {
    952             APPL_TRACE_DEBUG( "max_session is too big. use max (%d)", max_session, BTA_JV_MAX_RFC_SR_SESSION);
    953             max_session = BTA_JV_MAX_RFC_SR_SESSION;
    954         }
    955         p_msg->hdr.event = BTA_JV_API_RFCOMM_START_SERVER_EVT;
    956         p_msg->sec_mask = sec_mask;
    957         p_msg->role = role;
    958         p_msg->local_scn = local_scn;
    959         p_msg->max_session = max_session;
    960         p_msg->p_cback = p_cback;
    961         p_msg->user_data = user_data; //caller's private data
    962         bta_sys_sendmsg(p_msg);
    963         status = BTA_JV_SUCCESS;
    964     }
    965 
    966     return(status);
    967 }
    968 
    969 /*******************************************************************************
    970 **
    971 ** Function         BTA_JvRfcommStopServer
    972 **
    973 ** Description      This function stops the RFCOMM server. If the server has an
    974 **                  active connection, it would be closed.
    975 **
    976 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
    977 **                  BTA_JV_FAILURE, otherwise.
    978 **
    979 *******************************************************************************/
    980 tBTA_JV_STATUS BTA_JvRfcommStopServer(UINT32 handle, void * user_data)
    981 {
    982     tBTA_JV_STATUS status = BTA_JV_FAILURE;
    983     tBTA_JV_API_RFCOMM_SERVER *p_msg;
    984     APPL_TRACE_API( "BTA_JvRfcommStopServer");
    985     if ((p_msg = (tBTA_JV_API_RFCOMM_SERVER *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_SERVER))) != NULL)
    986     {
    987         p_msg->hdr.event = BTA_JV_API_RFCOMM_STOP_SERVER_EVT;
    988         p_msg->handle = handle;
    989         p_msg->user_data = user_data; //caller's private data
    990         bta_sys_sendmsg(p_msg);
    991         status = BTA_JV_SUCCESS;
    992     }
    993 
    994     return(status);
    995 }
    996 
    997 /*******************************************************************************
    998 **
    999 ** Function         BTA_JvRfcommRead
   1000 **
   1001 ** Description      This function reads data from an RFCOMM connection
   1002 **                  The actual size of data read is returned in p_len.
   1003 **
   1004 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
   1005 **                  BTA_JV_FAILURE, otherwise.
   1006 **
   1007 *******************************************************************************/
   1008 tBTA_JV_STATUS BTA_JvRfcommRead(UINT32 handle, UINT32 req_id, UINT8 *p_data, UINT16 len)
   1009 {
   1010     tBTA_JV_STATUS status = BTA_JV_FAILURE;
   1011     tBTA_JV_API_RFCOMM_READ *p_msg;
   1012     UINT32  hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
   1013     UINT32  si = BTA_JV_RFC_HDL_TO_SIDX(handle);
   1014 
   1015     APPL_TRACE_API( "BTA_JvRfcommRead");
   1016     if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
   1017         si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] &&
   1018         (p_msg = (tBTA_JV_API_RFCOMM_READ *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_READ))) != NULL)
   1019     {
   1020         p_msg->hdr.event = BTA_JV_API_RFCOMM_READ_EVT;
   1021         p_msg->handle = handle;
   1022         p_msg->req_id = req_id;
   1023         p_msg->p_data = p_data;
   1024         p_msg->len = len;
   1025         p_msg->p_cb = &bta_jv_cb.rfc_cb[hi];
   1026         p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1];
   1027         bta_sys_sendmsg(p_msg);
   1028         status = BTA_JV_SUCCESS;
   1029     }
   1030 
   1031     return(status);
   1032 }
   1033 
   1034 /*******************************************************************************
   1035 **
   1036 ** Function         BTA_JvRfcommGetPortHdl
   1037 **
   1038 ** Description    This function fetches the rfcomm port handle
   1039 **
   1040 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
   1041 **                  BTA_JV_FAILURE, otherwise.
   1042 **
   1043 *******************************************************************************/
   1044 UINT16 BTA_JvRfcommGetPortHdl(UINT32 handle)
   1045 {
   1046     UINT32  hi = ((handle & BTA_JV_RFC_HDL_MASK) & ~BTA_JV_RFCOMM_MASK) - 1;
   1047     UINT32  si = BTA_JV_RFC_HDL_TO_SIDX(handle);
   1048 
   1049     if (hi < BTA_JV_MAX_RFC_CONN &&
   1050         si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si])
   1051         return bta_jv_cb.port_cb[bta_jv_cb.rfc_cb[hi].rfc_hdl[si] - 1].port_handle;
   1052     else
   1053         return 0xffff;
   1054 }
   1055 
   1056 
   1057 /*******************************************************************************
   1058 **
   1059 ** Function         BTA_JvRfcommReady
   1060 **
   1061 ** Description      This function determined if there is data to read from
   1062 **                  an RFCOMM connection
   1063 **
   1064 ** Returns          BTA_JV_SUCCESS, if data queue size is in *p_data_size.
   1065 **                  BTA_JV_FAILURE, if error.
   1066 **
   1067 *******************************************************************************/
   1068 tBTA_JV_STATUS BTA_JvRfcommReady(UINT32 handle, UINT32 *p_data_size)
   1069 {
   1070     tBTA_JV_STATUS status = BTA_JV_FAILURE;
   1071     UINT16          size = 0;
   1072     UINT32  hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
   1073     UINT32  si = BTA_JV_RFC_HDL_TO_SIDX(handle);
   1074 
   1075     APPL_TRACE_API( "BTA_JvRfcommReady");
   1076     if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
   1077         si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si])
   1078     {
   1079         if(PORT_GetRxQueueCnt(bta_jv_cb.rfc_cb[hi].rfc_hdl[si], &size) == PORT_SUCCESS)
   1080         {
   1081             status = BTA_JV_SUCCESS;
   1082         }
   1083     }
   1084     *p_data_size = size;
   1085     return(status);
   1086 }
   1087 
   1088 /*******************************************************************************
   1089 **
   1090 ** Function         BTA_JvRfcommWrite
   1091 **
   1092 ** Description      This function writes data to an RFCOMM connection
   1093 **
   1094 ** Returns          BTA_JV_SUCCESS, if the request is being processed.
   1095 **                  BTA_JV_FAILURE, otherwise.
   1096 **
   1097 *******************************************************************************/
   1098 tBTA_JV_STATUS BTA_JvRfcommWrite(UINT32 handle, UINT32 req_id)
   1099 {
   1100     tBTA_JV_STATUS status = BTA_JV_FAILURE;
   1101     tBTA_JV_API_RFCOMM_WRITE *p_msg;
   1102     UINT32  hi = ((handle & BTA_JV_RFC_HDL_MASK)&~BTA_JV_RFCOMM_MASK) - 1;
   1103     UINT32  si = BTA_JV_RFC_HDL_TO_SIDX(handle);
   1104 
   1105     APPL_TRACE_API( "BTA_JvRfcommWrite");
   1106     APPL_TRACE_DEBUG( "handle:0x%x, hi:%d, si:%d", handle, hi, si);
   1107     if (hi < BTA_JV_MAX_RFC_CONN && bta_jv_cb.rfc_cb[hi].p_cback &&
   1108         si < BTA_JV_MAX_RFC_SR_SESSION && bta_jv_cb.rfc_cb[hi].rfc_hdl[si] &&
   1109         (p_msg = (tBTA_JV_API_RFCOMM_WRITE *)GKI_getbuf(sizeof(tBTA_JV_API_RFCOMM_WRITE))) != NULL)
   1110     {
   1111         p_msg->hdr.event = BTA_JV_API_RFCOMM_WRITE_EVT;
   1112         p_msg->handle = handle;
   1113         p_msg->req_id = req_id;
   1114         p_msg->p_cb = &bta_jv_cb.rfc_cb[hi];
   1115         p_msg->p_pcb = &bta_jv_cb.port_cb[p_msg->p_cb->rfc_hdl[si] - 1];
   1116         APPL_TRACE_API( "write ok");
   1117         bta_sys_sendmsg(p_msg);
   1118         status = BTA_JV_SUCCESS;
   1119     }
   1120 
   1121     return(status);
   1122 }
   1123 
   1124 
   1125 /*******************************************************************************
   1126  **
   1127  ** Function    BTA_JVSetPmProfile
   1128  **
   1129  ** Description This function set or free power mode profile for different JV application
   1130  **
   1131  ** Parameters:  handle,  JV handle from RFCOMM or L2CAP
   1132  **              app_id:  app specific pm ID, can be BTA_JV_PM_ALL, see bta_dm_cfg.c for details
   1133  **              BTA_JV_PM_ID_CLEAR: removes pm management on the handle. init_st is ignored and
   1134  **              BTA_JV_CONN_CLOSE is called implicitely
   1135  **              init_st:  state after calling this API. typically it should be BTA_JV_CONN_OPEN
   1136  **
   1137  ** Returns      BTA_JV_SUCCESS, if the request is being processed.
   1138  **              BTA_JV_FAILURE, otherwise.
   1139  **
   1140  ** NOTE:        BTA_JV_PM_ID_CLEAR: In general no need to be called as jv pm calls automatically
   1141  **              BTA_JV_CONN_CLOSE to remove in case of connection close!
   1142  **
   1143  *******************************************************************************/
   1144 tBTA_JV_STATUS BTA_JvSetPmProfile(UINT32 handle, tBTA_JV_PM_ID app_id, tBTA_JV_CONN_STATE init_st)
   1145 {
   1146     tBTA_JV_STATUS status = BTA_JV_FAILURE;
   1147     tBTA_JV_API_SET_PM_PROFILE *p_msg;
   1148 
   1149     APPL_TRACE_API("BTA_JVSetPmProfile handle:0x%x, app_id:%d", handle, app_id);
   1150     if ((p_msg = (tBTA_JV_API_SET_PM_PROFILE *)GKI_getbuf(sizeof(tBTA_JV_API_SET_PM_PROFILE)))
   1151         != NULL)
   1152     {
   1153         p_msg->hdr.event = BTA_JV_API_SET_PM_PROFILE_EVT;
   1154         p_msg->handle = handle;
   1155         p_msg->app_id = app_id;
   1156         p_msg->init_st = init_st;
   1157         bta_sys_sendmsg(p_msg);
   1158         status = BTA_JV_SUCCESS;
   1159     }
   1160 
   1161     return (status);
   1162 }
   1163