bta_ag_cmd.c revision 5738f83aeb59361a0a2eda2460113f6dc919427
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2004-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains functions for processing AT commands and results.
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h"
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h"
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_api.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_int.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_at.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Constants
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* ring timeout */
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_RING_TOUT        10000
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CMD_MAX_VAL      32767  /* Maximum value is signed 16-bit value */
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* clip type constants */
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_MIN        128
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_MAX        175
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_DEFAULT    129
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_VOIP       255
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_MULTI_RESULT_INCLUDED) && (BTA_AG_MULTI_RESULT_INCLUDED == TRUE)
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_AT_MULTI_LEN            2
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define AT_SET_RES_CB(res_cb, c, p, i) {res_cb.code = c; res_cb.p_arg = p; res_cb.int_arg = i;}
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for AT result code block */
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 code;
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *p_arg;
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT16 int_arg;
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AG_RESULT_CB;
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* type for multiple AT result codes block */
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 num_result;
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_RESULT_CB res_cb[BTA_AG_AT_MULTI_LEN];
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AG_MULTI_RESULT_CB;
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* enumeration of HSP AT commands matches HSP command interpreter table */
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HS_CMD_CKPD,
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HS_CMD_VGS,
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HS_CMD_VGM
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* enumeration of HFP AT commands matches HFP command interpreter table */
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_A,
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_D,
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_VGS,
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_VGM,
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_CCWA,
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_CHLD,
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_CHUP,
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_CIND,
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_CLIP,
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_CMER,
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_VTS,
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_BINP,
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_BLDN,
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_BVRA,
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_BRSF,
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_NREC,
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_CNUM,
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_BTRH,
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_CLCC,
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_COPS,
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_CMEE,
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_BIA,
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_CBC,
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_BCC,
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_BCS,
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_HF_CMD_BAC
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT command interpreter table for HSP */
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD bta_ag_hsp_cmd[] =
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CKPD",   BTA_AG_AT_SET,                      BTA_AG_AT_INT, 200, 200},
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+VGS",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,  15},
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+VGM",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,  15},
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"",        BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0}
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT command interpreter table for HFP */
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD bta_ag_hfp_cmd[] =
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"A",       BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"D",       (BTA_AG_AT_NONE | BTA_AG_AT_FREE),  BTA_AG_AT_STR,   0,   0},
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+VGS",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,  15},
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+VGM",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,  15},
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CCWA",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   1},
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Consider CHLD as str to take care of indexes for ECC */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CHLD",   (BTA_AG_AT_SET | BTA_AG_AT_TEST),   BTA_AG_AT_STR,   0,   4},
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CHUP",   BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CIND",   (BTA_AG_AT_READ | BTA_AG_AT_TEST),  BTA_AG_AT_STR,   0,   0},
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CLIP",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   1},
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CMER",   BTA_AG_AT_SET,                      BTA_AG_AT_STR,   0,   0},
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+VTS",    BTA_AG_AT_SET,                      BTA_AG_AT_STR,   0,   0},
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BINP",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   1,   1},
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BLDN",   BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BVRA",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   1},
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BRSF",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   BTA_AG_CMD_MAX_VAL},
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+NREC",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   0},
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CNUM",   BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BTRH",   (BTA_AG_AT_READ | BTA_AG_AT_SET),   BTA_AG_AT_INT,   0,   2},
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CLCC",   BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+COPS",   (BTA_AG_AT_READ | BTA_AG_AT_SET),   BTA_AG_AT_STR,   0,   0},
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CMEE",   BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   1},
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BIA",    BTA_AG_AT_SET,                      BTA_AG_AT_STR,   0,   20},
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CBC",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   100},
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BCC",    BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0},
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BCS",    BTA_AG_AT_SET,                      BTA_AG_AT_INT,   0,   BTA_AG_CMD_MAX_VAL},
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BAC",    BTA_AG_AT_SET,                      BTA_AG_AT_STR,   0,   0},
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"",        BTA_AG_AT_NONE,                     BTA_AG_AT_STR,   0,   0}
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT result code table element */
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char  *p_res;         /* AT result string */
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       fmt;            /* whether argument is int or string */
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AG_RESULT;
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT result code argument types */
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_FMT_NONE,       /* no argument */
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_FMT_INT,        /* integer argument */
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_FMT_STR         /* string argument */
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* enumeration of AT result codes, matches constant table */
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_OK,
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_ERROR,
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_RING,
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_VGS,
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_VGM,
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CCWA,
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CHLD,
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CIND,
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CLIP,
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CIEV,
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_BINP,
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_BVRA,
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_BRSF,
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_BSIR,
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CNUM,
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_BTRH,
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CLCC,
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_COPS,
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CMEE,
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_BCS,
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_UNAT
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_HSP_RESULT_REPLACE_COLON) && (BTA_HSP_RESULT_REPLACE_COLON == TRUE)
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define COLON_IDX_4_VGSVGM    4
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT result code constant table  (Indexed by result code) */
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_RESULT bta_ag_result_tbl[] =
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"OK",      BTA_AG_RES_FMT_NONE},
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"ERROR",   BTA_AG_RES_FMT_NONE},
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"RING",    BTA_AG_RES_FMT_NONE},
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+VGS: ",  BTA_AG_RES_FMT_INT},
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+VGM: ",  BTA_AG_RES_FMT_INT},
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CCWA: ", BTA_AG_RES_FMT_STR},
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CHLD: ", BTA_AG_RES_FMT_STR},
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CIND: ", BTA_AG_RES_FMT_STR},
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CLIP: ", BTA_AG_RES_FMT_STR},
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CIEV: ", BTA_AG_RES_FMT_STR},
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BINP: ", BTA_AG_RES_FMT_STR},
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BVRA: ", BTA_AG_RES_FMT_INT},
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BRSF: ", BTA_AG_RES_FMT_INT},
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BSIR: ", BTA_AG_RES_FMT_INT},
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CNUM: ", BTA_AG_RES_FMT_STR},
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BTRH: ", BTA_AG_RES_FMT_INT},
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CLCC: ", BTA_AG_RES_FMT_STR},
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+COPS: ", BTA_AG_RES_FMT_STR},
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+CME ERROR: ", BTA_AG_RES_FMT_INT},
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"+BCS: ",  BTA_AG_RES_FMT_INT},
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {"",        BTA_AG_RES_FMT_STR}
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD *bta_ag_at_tbl[BTA_AG_NUM_IDX] =
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_hsp_cmd,
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_hfp_cmd
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* callback event lookup table for HSP */
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_EVT bta_ag_hsp_cb_evt[] =
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_CKPD_EVT,     /* BTA_AG_HS_CMD_CKPD */
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_SPK_EVT,         /* BTA_AG_HS_CMD_VGS */
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_MIC_EVT          /* BTA_AG_HS_CMD_VGM */
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* callback event lookup table for HFP  (Indexed by command) */
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_EVT bta_ag_hfp_cb_evt[] =
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_A_EVT,        /* BTA_AG_HF_CMD_A */
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_D_EVT,        /* BTA_AG_HF_CMD_D */
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_SPK_EVT,         /* BTA_AG_HF_CMD_VGS */
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_MIC_EVT,         /* BTA_AG_HF_CMD_VGM */
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                      /* BTA_AG_HF_CMD_CCWA */
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_CHLD_EVT,     /* BTA_AG_HF_CMD_CHLD */
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_CHUP_EVT,     /* BTA_AG_HF_CMD_CHUP */
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_CIND_EVT,     /* BTA_AG_HF_CMD_CIND */
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                      /* BTA_AG_HF_CMD_CLIP */
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                      /* BTA_AG_HF_CMD_CMER */
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_VTS_EVT,      /* BTA_AG_HF_CMD_VTS */
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_BINP_EVT,     /* BTA_AG_HF_CMD_BINP */
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_BLDN_EVT,     /* BTA_AG_HF_CMD_BLDN */
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_BVRA_EVT,     /* BTA_AG_HF_CMD_BVRA */
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                      /* BTA_AG_HF_CMD_BRSF */
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_NREC_EVT,     /* BTA_AG_HF_CMD_NREC */
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_CNUM_EVT,     /* BTA_AG_HF_CMD_CNUM */
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_BTRH_EVT,     /* BTA_AG_HF_CMD_BTRH */
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_CLCC_EVT,     /* BTA_AG_HF_CMD_CLCC */
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_COPS_EVT,     /* BTA_AG_HF_CMD_COPS */
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                      /* BTA_AG_HF_CMD_CMEE */
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                      /* BTA_AG_HF_CMD_BIA */
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_CBC_EVT,      /* BTA_AG_HF_CMD_CBC */
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                      /* BTA_AG_HF_CMD_BCC */
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_BCS_EVT,      /* BTA_AG_HF_CMD_BCS */
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_AT_BAC_EVT       /* BTA_AG_HF_CMD_BAC */
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* translation of API result code values to internal values */
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 bta_ag_trans_result[] =
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_VGS,     /* BTA_AG_SPK_RES */
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_VGM,     /* BTA_AG_MIC_RES */
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_BSIR,    /* BTA_AG_INBAND_RING_RES */
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CIND,    /* BTA_AG_CIND_RES */
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_BINP,    /* BTA_AG_BINP_RES */
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CIEV,    /* BTA_AG_IND_RES */
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_BVRA,    /* BTA_AG_BVRA_RES */
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CNUM,    /* BTA_AG_CNUM_RES */
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_BTRH,    /* BTA_AG_BTRH_RES */
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CLCC,    /* BTA_AG_CLCC_RES */
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_COPS,    /* BTA_AG_COPS_RES */
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                  /* BTA_AG_IN_CALL_RES */
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                  /* BTA_AG_IN_CALL_CONN_RES */
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_CCWA,    /* BTA_AG_CALL_WAIT_RES */
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                  /* BTA_AG_OUT_CALL_ORIG_RES */
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                  /* BTA_AG_OUT_CALL_ALERT_RES */
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                  /* BTA_AG_OUT_CALL_CONN_RES */
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                  /* BTA_AG_CALL_CANCEL_RES */
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                  /* BTA_AG_END_CALL_RES */
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                  /* BTA_AG_IN_CALL_HELD_RES */
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_UNAT     /* BTA_AG_UNAT_RES */
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* callsetup indicator value lookup table */
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 bta_ag_callsetup_ind_tbl[] =
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_SPK_RES */
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_MIC_RES */
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_INBAND_RING_RES */
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_CIND_RES */
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_BINP_RES */
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_IND_RES */
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_BVRA_RES */
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_CNUM_RES */
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_BTRH_RES */
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_CLCC_RES */
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0,                          /* BTA_AG_COPS_RES */
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_CALLSETUP_INCOMING,  /* BTA_AG_IN_CALL_RES */
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_CALLSETUP_NONE,      /* BTA_AG_IN_CALL_CONN_RES */
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_CALLSETUP_INCOMING,  /* BTA_AG_CALL_WAIT_RES */
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_CALLSETUP_OUTGOING,  /* BTA_AG_OUT_CALL_ORIG_RES */
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_CALLSETUP_ALERTING,  /* BTA_AG_OUT_CALL_ALERT_RES */
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_CALLSETUP_NONE,      /* BTA_AG_OUT_CALL_CONN_RES */
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_CALLSETUP_NONE,      /* BTA_AG_CALL_CANCEL_RES */
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_CALLSETUP_NONE,      /* BTA_AG_END_CALL_RES */
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_CALLSETUP_NONE       /* BTA_AG_IN_CALL_HELD_RES */
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_result
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send an AT result code.
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_result(tBTA_AG_SCB *p_scb, UINT8 code, char *p_arg,
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               INT16 int_arg)
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    buf[BTA_AG_AT_MAX_LEN + 16];
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    *p = buf;
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  len;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(buf, NULL, sizeof(buf));
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* init with \r\n */
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p++ = '\r';
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p++ = '\n';
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* copy result code string */
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BCM_STRCPY_S(p, sizeof(buf), bta_ag_result_tbl[code].p_res);
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_HSP_RESULT_REPLACE_COLON) && (BTA_HSP_RESULT_REPLACE_COLON == TRUE)
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_scb->conn_service == BTA_AG_HSP)
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If HSP then ":"symbol should be changed as "=" for HSP compatibility */
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(code)
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_RES_VGS:
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_RES_VGM:
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(*(p+COLON_IDX_4_VGSVGM) == ':')
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                #if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_DEBUG0("[HSP] ':'symbol is changed as '=' for HSP compatibility");
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                #endif
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *(p+COLON_IDX_4_VGSVGM) = '=';
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p += strlen(bta_ag_result_tbl[code].p_res);
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* copy argument if any */
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_ag_result_tbl[code].fmt == BTA_AG_RES_FMT_INT)
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += utl_itoa((UINT16) int_arg, p);
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (bta_ag_result_tbl[code].fmt == BTA_AG_RES_FMT_STR)
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRCPY_S(p, sizeof(buf), p_arg);
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += strlen(p_arg);
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* finish with \r\n */
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p++ = '\r';
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p++ = '\n';
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_ag_send_result: %s", buf);
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send to RFCOMM */
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PORT_WriteData(p_scb->conn_handle, buf, (UINT16) (p - buf), &len);
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_MULTI_RESULT_INCLUDED) && (BTA_AG_MULTI_RESULT_INCLUDED == TRUE)
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_multi_result
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send multiple AT result codes.
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_multi_result(tBTA_AG_SCB *p_scb, tBTA_AG_MULTI_RESULT_CB *m_res_cb)
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    buf[BTA_AG_AT_MAX_LEN * BTA_AG_AT_MULTI_LEN + 16];
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    *p = buf;
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  len;
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   res_idx = 0;
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((!m_res_cb) || (m_res_cb->num_result == 0) || (m_res_cb->num_result > BTA_AG_AT_MULTI_LEN))
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG0("m_res_cb is NULL or num_result is out of range.");
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(buf, NULL, sizeof(buf));
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(res_idx < m_res_cb->num_result)
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* init with \r\n */
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = '\r';
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = '\n';
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* copy result code string */
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRCPY_S(p, sizeof(buf), bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].p_res);
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += strlen(bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].p_res);
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* copy argument if any */
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].fmt == BTA_AG_RES_FMT_INT)
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p += utl_itoa((UINT16) m_res_cb->res_cb[res_idx].int_arg, p);
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (bta_ag_result_tbl[m_res_cb->res_cb[res_idx].code].fmt == BTA_AG_RES_FMT_STR)
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BCM_STRCPY_S(p, sizeof(buf), m_res_cb->res_cb[res_idx].p_arg);
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p += strlen(m_res_cb->res_cb[res_idx].p_arg);
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* finish with \r\n */
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = '\r';
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = '\n';
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        res_idx++;
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_RESULT_DEBUG) && (BTA_AG_RESULT_DEBUG == TRUE)
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("send_result: %s", buf);
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send to RFCOMM */
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PORT_WriteData(p_scb->conn_handle, buf, (UINT16) (p - buf), &len);
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_ok
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send an OK result code.
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_ok(tBTA_AG_SCB *p_scb)
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_send_result(p_scb, BTA_AG_RES_OK, NULL, 0);
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_error
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send an ERROR result code.
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      errcode - used to send verbose errocode
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_error(tBTA_AG_SCB *p_scb, INT16 errcode)
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If HFP and extended audio gateway error codes are enabled */
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->conn_service == BTA_AG_HFP && p_scb->cmee_enabled)
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_send_result(p_scb, BTA_AG_RES_CMEE, NULL, errcode);
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_send_result(p_scb, BTA_AG_RES_ERROR, NULL, 0);
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_ind
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send an indicator CIEV result code.
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_ind(tBTA_AG_SCB *p_scb, UINT16 id, UINT16 value, BOOLEAN on_demand)
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    str[12];
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    *p = str;
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the indicator is masked out, just return */
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Mandatory indicators can not be masked out. */
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_scb->bia_masked_out & ((UINT32)1 << id)) &&
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ((id != BTA_AG_IND_CALL) && (id != BTA_AG_IND_CALLSETUP) && (id != BTA_AG_IND_CALLHELD)))
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ensure we do not send duplicate indicators if not requested by app */
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If it was requested by app, transmit CIEV even if it is duplicate. */
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (id == BTA_AG_IND_CALL)
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((value == p_scb->call_ind) && (on_demand == FALSE))
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->call_ind = (UINT8)value;
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_CALLSETUP) && (on_demand == FALSE))
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (value == p_scb->callsetup_ind)
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->callsetup_ind = (UINT8)value;
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_SERVICE) && (on_demand == FALSE))
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (value == p_scb->service_ind)
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->service_ind = (UINT8)value;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_SIGNAL) && (on_demand == FALSE))
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (value == p_scb->signal_ind)
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->signal_ind = (UINT8)value;
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_ROAM) && (on_demand == FALSE))
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (value == p_scb->roam_ind)
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->roam_ind = (UINT8)value;
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_BATTCHG) && (on_demand == FALSE))
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (value == p_scb->battchg_ind)
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->battchg_ind = (UINT8)value;
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_CALLHELD) && (on_demand == FALSE))
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* call swap could result in sending callheld=1 multiple times */
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((value != 1) && (value == p_scb->callheld_ind))
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->callheld_ind = (UINT8)value;
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->cmer_enabled)
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += utl_itoa(id, p);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = ',';
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        utl_itoa(value, p);
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_send_result(p_scb, BTA_AG_RES_CIEV, str, 0);
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_parse_cmer
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Parse AT+CMER parameter string.
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if parsed ok, FALSE otherwise.
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_ag_parse_cmer(char *p_s, BOOLEAN *p_enabled)
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT16   n[4] = {-1, -1, -1, -1};
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    *p;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < 4; i++)
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* skip to comma delimiter */
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (p = p_s; *p != ',' && *p != 0; p++);
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get integer value */
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p = 0;
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        n[i] = utl_str2int(p_s);
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_s = p + 1;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_s == 0)
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* process values */
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (n[0] < 0 || n[3] < 0)
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((n[0] == 3) && ((n[3] == 1) || (n[3] == 0)))
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_enabled = (BOOLEAN) n[3];
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_parse_chld
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Parse AT+CHLD parameter string.
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Returns idx (1-7), or 0 if ECC not enabled or idx doesn't exist
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_ag_parse_chld(tBTA_AG_SCB *p_scb, char *p_s)
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   retval = 0;
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT16   idx = -1;
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_s[1] != 0)
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* p_idxstr++;  point to beginning of call number */
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        idx = utl_str2int(&p_s[1]);
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (idx != -1 && idx < 255)
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            retval = (UINT8)idx;
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (retval);
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE )
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_parse_bac
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Parse AT+BAC parameter string.
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Returns bitmap of supported codecs.
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_AG_PEER_CODEC bta_ag_parse_bac(tBTA_AG_SCB *p_scb, char *p_s)
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_PEER_CODEC  retval = BTA_AG_CODEC_NONE;
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  uuid_codec;
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN cont = FALSE;       /* Continue processing */
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *p;
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(p_s)
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* skip to comma delimiter */
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(p = p_s; *p != ',' && *p != 0; p++);
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get integre value */
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (*p != 0)
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p = 0;
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cont = TRUE;
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cont = FALSE;
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        uuid_codec = utl_str2int(p_s);
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(uuid_codec)
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case UUID_CODEC_CVSD:   retval |= BTA_AG_CODEC_CVSD;     break;
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case UUID_CODEC_MSBC:   retval |= BTA_AG_CODEC_MSBC;     break;
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR1("Unknown Codec UUID(%d) received", uuid_codec);
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTA_AG_CODEC_NONE;
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (cont)
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_s = p + 1;
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (retval);
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_process_unat_res
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process the unat response data and remove extra carriage return
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and line feed
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_process_unat_res(char *unat_result)
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   str_leng;
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i = 0;
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   j = 0;
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   pairs_of_nl_cr;
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    trim_data[BTA_AG_AT_MAX_LEN];
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    str_leng = strlen(unat_result);
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If no extra CR and LF, just return */
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(str_leng < 4)
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Remove the carriage return and left feed */
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(unat_result[0] =='\r' && unat_result[1] =='\n'
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && unat_result[str_leng-2] =='\r' && unat_result[str_leng-1] =='\n')
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pairs_of_nl_cr = 1;
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i=0;i<(str_leng-4*pairs_of_nl_cr);i++)
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            trim_data[j++] = unat_result[i+pairs_of_nl_cr*2];
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Add EOF */
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        trim_data[j] = '\0';
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        str_leng = str_leng - 4;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S(unat_result, BTA_AG_AT_MAX_LEN+1, trim_data,str_leng+1);
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        i=0;
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        j=0;
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(str_leng <4)
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_inband_enabled
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Determine whether in-band ring can be used.
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_inband_enabled(tBTA_AG_SCB *p_scb)
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if feature is enabled and no other scbs connected */
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->inband_enabled && !bta_ag_other_scb_open(p_scb))
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_call_inds
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send call and callsetup indicators.
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_call_inds(tBTA_AG_SCB *p_scb, tBTA_AG_RES result)
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 call = p_scb->call_ind;
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 callsetup;
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set new call and callsetup values based on BTA_AgResult */
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    callsetup = bta_ag_callsetup_ind_tbl[result];
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (result == BTA_AG_END_CALL_RES)
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        call = BTA_AG_CALL_INACTIVE;
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (result == BTA_AG_IN_CALL_CONN_RES || result == BTA_AG_OUT_CALL_CONN_RES
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || result == BTA_AG_IN_CALL_HELD_RES)
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        call = BTA_AG_CALL_ACTIVE;
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        call = p_scb->call_ind;
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send indicator function tracks if the values have actually changed */
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_send_ind(p_scb, BTA_AG_IND_CALL, call, FALSE);
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_send_ind(p_scb, BTA_AG_IND_CALLSETUP, callsetup, FALSE);
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_at_hsp_cback
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      AT command processing callback for HSP.
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_hsp_cback(tBTA_AG_SCB *p_scb, UINT16 cmd, UINT8 arg_type,
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                char *p_arg, INT16 int_arg)
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_VAL val;
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG4("AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      int_arg, p_arg);
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send OK */
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_send_ok(p_scb);
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.hdr.handle = bta_ag_scb_to_idx(p_scb);
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.hdr.app_id = p_scb->app_id;
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.num = (UINT16) int_arg;
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN);
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.str[BTA_AG_AT_MAX_LEN] = 0;
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* call callback with event */
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    (*bta_ag_cb.p_cback)(bta_ag_hsp_cb_evt[cmd], (tBTA_AG *) &val);
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_at_hfp_cback
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      AT command processing callback for HFP.
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_hfp_cback(tBTA_AG_SCB *p_scb, UINT16 cmd, UINT8 arg_type,
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                char *p_arg, INT16 int_arg)
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_VAL     val;
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_EVT   event;
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_SCB     *ag_scb;
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32          i, ind_id;
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32          bia_masked_out;
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE )
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_PEER_CODEC  codec_type, codec_sent;
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG4("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      int_arg, p_arg);
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.hdr.handle = bta_ag_scb_to_idx(p_scb);
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.hdr.app_id = p_scb->app_id;
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.num = int_arg;
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN);
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.str[BTA_AG_AT_MAX_LEN] = 0;
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event = bta_ag_hfp_cb_evt[cmd];
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (cmd)
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_A:
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_VGS:
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_VGM:
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_CHUP:
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_CBC:
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send OK */
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_BLDN:
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Do not send OK, App will send error or OK depending on
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** last dial number enabled or not */
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_D:
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Do not send OK for Dial cmds
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Let application decide whether to send OK or ERROR*/
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if mem dial cmd, make sure string contains only digits */
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_arg[0] == '>')
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(!utl_isintstr(p_arg+1))
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    event = 0;
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_DSTR);
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (p_arg[0] == 'V')   /* ATDV : Dial VoIP Call */
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* We do not check string. Code will be added later if needed. */
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(!((p_scb->peer_features & BTA_AG_PEER_FEAT_VOIP) && (p_scb->features & BTA_AG_FEAT_VOIP)))
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    event = 0;
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If dial cmd, make sure string contains only dial digits
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Dial digits are 0-9, A-C, *, #, + */
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(!utl_isdialstr(p_arg))
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    event = 0;
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_DSTR);
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_CCWA:
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store setting */
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->ccwa_enabled = (BOOLEAN) int_arg;
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send OK */
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_CHLD:
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (arg_type == BTA_AG_AT_TEST)
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* don't call callback */
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send CHLD string */
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Form string based on supported 1.5 feature */
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_scb->peer_version >= HFP_VERSION_1_5) &&
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_scb->features & BTA_AG_FEAT_ECC) &&
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_scb->peer_features & BTA_AG_PEER_FEAT_ECC))
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_result(p_scb, BTA_AG_RES_CHLD, p_bta_ag_cfg->chld_val_ecc, 0);
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_result(p_scb, BTA_AG_RES_CHLD, p_bta_ag_cfg->chld_val, 0);
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send OK */
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if service level conn. not already open, now it's open */
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_svc_conn_open(p_scb, NULL);
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                val.idx = bta_ag_parse_chld(p_scb, val.str);
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(val.idx && !((p_scb->features & BTA_AG_FEAT_ECC) && (p_scb->peer_features & BTA_AG_PEER_FEAT_ECC)))
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* we do not support ECC, but HF is sending us a CHLD with call index*/
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    event = 0;
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* If it is swap between calls, set call held indicator to 3(out of valid 0-2)
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ** Application will set it back to 1
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ** callheld indicator will be sent across to the peer. */
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(val.str[0] == '2')
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++)
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if (ag_scb->in_use)
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            if((ag_scb->call_ind == BTA_AG_CALL_ACTIVE)
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                && (ag_scb->callsetup_ind == BTA_AG_CALLSETUP_NONE))
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                ag_scb->callheld_ind = BTA_AG_CALLHELD_NOACTIVE + 1;
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Do not send OK. Let app decide after parsing the val str */
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* bta_ag_send_ok(p_scb); */
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_CIND:
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (arg_type == BTA_AG_AT_TEST)
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* don't call callback */
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send CIND string, send OK */
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_result(p_scb, BTA_AG_RES_CIND, p_bta_ag_cfg->cind_info, 0);
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_CLIP:
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store setting, send OK */
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->clip_enabled = (BOOLEAN) int_arg;
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_CMER:
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if parsed ok store setting, send OK */
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_ag_parse_cmer(p_arg, &p_scb->cmer_enabled))
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if service level conn. not already open and our features and
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ** peer features do not have 3-way, service level conn. now open
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                */
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!p_scb->svc_conn &&
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    !((p_scb->features & BTA_AG_FEAT_3WAY) && (p_scb->peer_features & BTA_AG_PEER_FEAT_3WAY)))
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_svc_conn_open(p_scb, NULL);
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_VTS:
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check argument */
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (strlen(p_arg) == 1)
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_BINP:
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if feature not set don't call callback, send ERROR */
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(p_scb->features & BTA_AG_FEAT_VTAG))
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_BVRA:
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if feature not supported don't call callback, send ERROR. App will send OK */
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(p_scb->features & BTA_AG_FEAT_VREC))
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_BRSF:
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store peer features */
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->peer_features = (UINT16) int_arg;
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send BRSF, send OK */
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_result(p_scb, BTA_AG_RES_BRSF, NULL,
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               (INT16) (p_scb->features & BTA_AG_BSRF_FEAT_SPEC));
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_NREC:
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if feature send OK, else don't call callback, send ERROR */
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->features & BTA_AG_FEAT_ECNR)
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_BTRH:
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if feature send BTRH, send OK:, else don't call callback, send ERROR */
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->features & BTA_AG_FEAT_BTRH)
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* If set command; send response and notify app */
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (arg_type == BTA_AG_AT_SET)
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++)
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if (ag_scb->in_use)
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            bta_ag_send_result(ag_scb, BTA_AG_RES_BTRH, NULL, int_arg);
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ok(p_scb);
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else /* Read Command */
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    val.num = BTA_AG_BTRH_READ;
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_COPS:
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (arg_type == BTA_AG_AT_SET)
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* don't call callback */
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send OK */
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_CMEE:
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->features & BTA_AG_FEAT_EXTERR)
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* store setting */
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->cmee_enabled = (BOOLEAN) int_arg;
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send OK */
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* don't call callback */
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            event = 0;
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_BIA:
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* don't call callback */
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            event = 0;
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bia_masked_out = p_scb->bia_masked_out;
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Parse the indicator mask */
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i = 0, ind_id = 1; (val.str[i] != 0) && (ind_id <= 20); i++, ind_id++)
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (val.str[i] == ',')
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    continue;
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (val.str[i] == '0')
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bia_masked_out |= ((UINT32)1 << ind_id);
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (val.str[i] == '1')
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bia_masked_out &= ~((UINT32)1 << ind_id);
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                i++;
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( (val.str[i] != 0) && (val.str[i] != ',') )
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (val.str[i] == 0)
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->bia_masked_out = bia_masked_out;
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok (p_scb);
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error (p_scb, BTA_AG_ERR_INVALID_INDEX);
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_CNUM:
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_CLCC:
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!(p_scb->features & BTA_AG_FEAT_ECS))
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE )
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_BAC:
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store available codecs from the peer */
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if((p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC) && (p_scb->features & BTA_AG_FEAT_CODEC))
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->peer_codecs = bta_ag_parse_bac(p_scb, p_arg);
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->codec_updated = TRUE;
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_scb->peer_codecs & BTA_AG_CODEC_MSBC)
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_scb->sco_codec = UUID_CODEC_MSBC;
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    APPL_TRACE_DEBUG0("Received AT+BAC, updating sco codec to MSBC");
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_scb->sco_codec = UUID_CODEC_CVSD;
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    APPL_TRACE_DEBUG0("Received AT+BAC, updating sco codec to CVSD");
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Received BAC while in codec negotiation. */
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST) && (bta_ag_cb.sco.p_curr_scb == p_scb))
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_codec_negotiate (p_scb);
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->peer_codecs = BTA_AG_CODEC_NONE;
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR0("Unexpected CMD:AT+BAC, Codec Negotiation is not supported");
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_BCS:
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop cn timer */
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_stop_timer(&p_scb->cn_timer);
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            switch(int_arg)
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                case UUID_CODEC_CVSD:   codec_type = BTA_AG_CODEC_CVSD;     break;
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                case UUID_CODEC_MSBC:   codec_type = BTA_AG_CODEC_MSBC;     break;
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                default:
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    APPL_TRACE_ERROR1("Unknown codec_uuid %d", int_arg);
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    codec_type = 0xFFFF;
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->codec_fallback)
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                codec_sent = BTA_AG_CODEC_CVSD;
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                codec_sent = p_scb->sco_codec;
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(codec_type == codec_sent)
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_codec_nego(p_scb, TRUE);
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_codec_nego(p_scb, FALSE);
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_HF_CMD_BCC:
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_sco_open(p_scb, NULL);
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* call callback */
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (event != 0)
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_ag_cb.p_cback)(event, (tBTA_AG *) &val);
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_at_err_cback
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      AT command parser error callback.
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_err_cback(tBTA_AG_SCB *p_scb, BOOLEAN unknown, char *p_arg)
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_VAL     val;
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(unknown && (!strlen(p_arg)))
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG0("Empty AT cmd string received");
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_send_ok(p_scb);
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if unknown AT command and configured to pass these to app */
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (unknown && (p_scb->features & BTA_AG_FEAT_UNAT))
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        val.hdr.handle = bta_ag_scb_to_idx(p_scb);
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        val.hdr.app_id = p_scb->app_id;
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        val.num = 0;
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S(val.str, sizeof(val.str), p_arg, BTA_AG_AT_MAX_LEN);
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        val.str[BTA_AG_AT_MAX_LEN] = 0;
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_ag_cb.p_cback)(BTA_AG_AT_UNAT_EVT, (tBTA_AG *) &val);
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_hsp_result
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle API result for HSP connections.
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_hsp_result(tBTA_AG_SCB *p_scb, tBTA_AG_API_RESULT *p_result)
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 code = bta_ag_trans_result[p_result->result];
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_ag_hsp_result : res = %d", p_result->result);
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(p_result->result)
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_SPK_RES:
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_MIC_RES:
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_result(p_scb, code, NULL, p_result->data.num);
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IN_CALL_RES:
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* tell sys to stop av if any */
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if sco already opened or no inband ring send ring now */
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_ag_sco_is_open(p_scb) || !bta_ag_inband_enabled(p_scb) ||
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (p_scb->features & BTA_AG_FEAT_NOSCO))
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ring(p_scb, (tBTA_AG_DATA *) p_result);
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else open sco, send ring after sco opened */
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* HSPv1.2: AG shall not send RING if using in-band ring tone. */
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_scb->hsp_version >= HSP_VERSION_1_2)
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_scb->post_sco = BTA_AG_POST_SCO_NONE;
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_scb->post_sco = BTA_AG_POST_SCO_RING;
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IN_CALL_CONN_RES:
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_OUT_CALL_ORIG_RES:
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if incoming call connected stop ring timer */
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->result == BTA_AG_IN_CALL_CONN_RES)
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_stop_timer(&p_scb->act_timer);
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(p_scb->features & BTA_AG_FEAT_NOSCO))
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if audio connected to this scb open sco */
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb))
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* else if no audio at call close sco */
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE)
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_END_CALL_RES:
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop ring timer */
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_stop_timer(&p_scb->act_timer);
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* close sco */
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((bta_ag_sco_is_open(p_scb) || bta_ag_sco_is_opening(p_scb)) && !(p_scb->features & BTA_AG_FEAT_NOSCO))
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if av got suspended by this call, let it resume. */
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_INBAND_RING_RES:
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->inband_enabled = p_result->data.state;
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG1("inband_enabled set to %d", p_scb->inband_enabled);
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_UNAT_RES:
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.str[0] != 0)
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_result(p_scb, code, p_result->data.str, 0);
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ok(p_scb);
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* ignore all others */
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_hfp_result
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle API result for HFP connections.
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_hfp_result(tBTA_AG_SCB *p_scb, tBTA_AG_API_RESULT *p_result)
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 code = bta_ag_trans_result[p_result->result];
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    APPL_TRACE_DEBUG1("bta_ag_hfp_result : res = %d", p_result->result);
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(p_result->result)
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_SPK_RES:
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_MIC_RES:
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_result(p_scb, code, NULL, p_result->data.num);
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IN_CALL_RES:
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* tell sys to stop av if any */
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store caller id string.
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * append type info at the end.
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * make sure a valid type info is passed.
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * otherwise add 129 as default type */
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_result->data.num < BTA_AG_CLIP_TYPE_MIN) || (p_result->data.num > BTA_AG_CLIP_TYPE_MAX))
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.num != BTA_AG_CLIP_TYPE_VOIP)
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_result->data.num = BTA_AG_CLIP_TYPE_DEFAULT;
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG1("CLIP type :%d", p_result->data.num);
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->clip[0] = 0;
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.str[0] != 0)
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sprintf(p_scb->clip,"%s,%d", p_result->data.str, p_result->data.num);
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send callsetup indicator */
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END)
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Need to sent 2 callsetup IND's(Call End and Incoming call) after SCO close. */
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->post_sco = BTA_AG_POST_SCO_CALL_END_INCALL;
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_call_inds(p_scb, p_result->result);
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if sco already opened or no inband ring send ring now */
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (bta_ag_sco_is_open(p_scb) || !bta_ag_inband_enabled(p_scb) ||
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_scb->features & BTA_AG_FEAT_NOSCO))
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ring(p_scb, (tBTA_AG_DATA *) p_result);
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* else open sco, send ring after sco opened */
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_scb->post_sco = BTA_AG_POST_SCO_RING;
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IN_CALL_CONN_RES:
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop ring timer */
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_stop_timer(&p_scb->act_timer);
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if sco not opened and we need to open it, open sco first
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** then send indicators
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) &&
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                !bta_ag_sco_is_open(p_scb) && !(p_scb->features & BTA_AG_FEAT_NOSCO))
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->post_sco = BTA_AG_POST_SCO_CALL_CONN;
14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else if sco open and we need to close it, close sco first
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** then send indicators
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE &&
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bta_ag_sco_is_open(p_scb) && !(p_scb->features & BTA_AG_FEAT_NOSCO))
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->post_sco = BTA_AG_POST_SCO_CALL_CONN;
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else send indicators now */
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_call_inds(p_scb, p_result->result);
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IN_CALL_HELD_RES:
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop ring timer */
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_stop_timer(&p_scb->act_timer);
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_call_inds(p_scb, p_result->result);
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_OUT_CALL_ORIG_RES:
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if sco open and we need to close it, close sco first
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** then send indicators; else send indicators now
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE &&
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_is_open(p_scb) && !(p_scb->features & BTA_AG_FEAT_NOSCO))
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->post_sco = BTA_AG_POST_SCO_CALL_ORIG;
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_call_inds(p_scb, p_result->result);
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) &&
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    !(p_scb->features & BTA_AG_FEAT_NOSCO))
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_OUT_CALL_ALERT_RES:
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send indicators */
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_call_inds(p_scb, p_result->result);
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) &&
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                !(p_scb->features & BTA_AG_FEAT_NOSCO))
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_OUT_CALL_CONN_RES:
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send indicators */
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_call_inds(p_scb, p_result->result);
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* open or close sco */
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(p_scb->features & BTA_AG_FEAT_NOSCO))
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb))
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE)
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_CALL_CANCEL_RES:
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send indicators */
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_call_inds(p_scb, p_result->result);
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_END_CALL_RES:
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop ring timer */
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_stop_timer(&p_scb->act_timer);
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if sco open, close sco then send indicator values */
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((bta_ag_sco_is_open(p_scb) || bta_ag_sco_is_opening(p_scb)) && !(p_scb->features & BTA_AG_FEAT_NOSCO))
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->post_sco = BTA_AG_POST_SCO_CALL_END;
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END_INCALL)
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* sco closing for outgoing call because of incoming call */
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Send only callsetup end indicator after sco close */
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->post_sco = BTA_AG_POST_SCO_CALL_END;
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_call_inds(p_scb, p_result->result);
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if av got suspended by this call, let it resume. */
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_INBAND_RING_RES:
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->inband_enabled = p_result->data.state;
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG1("inband_enabled set to %d", p_scb->inband_enabled);
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_result(p_scb, code, NULL, p_result->data.state);
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_CIND_RES:
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store local values */
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->call_ind = p_result->data.str[0] - '0';
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->callsetup_ind = p_result->data.str[2] - '0';
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->service_ind = p_result->data.str[4] - '0';
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->signal_ind = p_result->data.str[6] - '0';
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->roam_ind = p_result->data.str[8] - '0';
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->battchg_ind = p_result->data.str[10] - '0';
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG2("cind call:%d callsetup:%d", p_scb->call_ind, p_scb->callsetup_ind);
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_result(p_scb, code, p_result->data.str, 0);
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_BINP_RES:
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_CNUM_RES:
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_CLCC_RES:
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_COPS_RES:
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.str[0] != 0)
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   bta_ag_send_result(p_scb, code, p_result->data.str, 0);
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ok(p_scb);
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, p_result->data.errcode);
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_UNAT_RES:
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.str[0] != 0)
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_process_unat_res(p_result->data.str);
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    APPL_TRACE_DEBUG1("BTA_AG_RES :%s",p_result->data.str);
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_result(p_scb, code, p_result->data.str, 0);
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ok(p_scb);
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, p_result->data.errcode);
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_CALL_WAIT_RES:
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->ccwa_enabled)
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_result(p_scb, code, p_result->data.str, 0);
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_call_inds(p_scb, p_result->result);
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IND_RES:
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ind(p_scb, p_result->data.ind.id, p_result->data.ind.value, FALSE);
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_BVRA_RES:
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_result(p_scb, code, NULL, p_result->data.state);
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_BTRH_RES:
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Don't respond to read if not in response & hold state */
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.num != BTA_AG_BTRH_NO_RESP)
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_result(p_scb, code, NULL, p_result->data.num);
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* In case of a response to a read request we need to send OK */
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ok(p_scb);
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, p_result->data.errcode);
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       default:
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_result
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle API result.
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_result(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->conn_service == BTA_AG_HSP)
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_hsp_result(p_scb, &p_data->api_result);
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_hfp_result(p_scb, &p_data->api_result);
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_setcodec
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle API SetCodec
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_setcodec(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE )
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_PEER_CODEC codec_type = p_data->api_setcodec.codec;
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if the requested codec type is valid */
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((codec_type != BTA_AG_CODEC_NONE) &&
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       (codec_type != BTA_AG_CODEC_CVSD) &&
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       (codec_type != BTA_AG_CODEC_MSBC))
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("bta_ag_setcodec error: unsupported codec type %d", codec_type);
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((p_scb->peer_codecs & codec_type) || (codec_type == BTA_AG_CODEC_NONE) || (codec_type == BTA_AG_CODEC_CVSD))
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->sco_codec = codec_type;
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->codec_updated = TRUE;
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_DEBUG1("bta_ag_setcodec: Updated codec type %d", codec_type);
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        APPL_TRACE_ERROR1("bta_ag_setcodec error: unsupported codec type %d", codec_type);
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE )
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_bcs
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send +BCS AT command to peer.
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_bcs(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 codec_uuid;
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->codec_fallback)
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        codec_uuid = UUID_CODEC_CVSD;
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(p_scb->sco_codec)
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTA_AG_CODEC_NONE:     codec_uuid = UUID_CODEC_CVSD;   break;
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTA_AG_CODEC_CVSD:     codec_uuid = UUID_CODEC_CVSD;   break;
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTA_AG_CODEC_MSBC:     codec_uuid = UUID_CODEC_MSBC;   break;
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_ERROR1("bta_ag_send_bcs: unknown codec %d, use CVSD", p_scb->sco_codec);
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                codec_uuid = UUID_CODEC_CVSD;
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send +BCS */
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_send_result(p_scb, BTA_AG_RES_BCS, NULL, codec_uuid);
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_ring
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send RING result code to peer.
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_ring(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AG_MULTI_RESULT_INCLUDED) && (BTA_AG_MULTI_RESULT_INCLUDED == TRUE)
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_MULTI_RESULT_CB m_res_cb;
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->conn_service == BTA_AG_HFP && p_scb->clip_enabled && p_scb->clip[0] != 0)
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(&m_res_cb, NULL, sizeof(tBTA_AG_MULTI_RESULT_CB));
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        m_res_cb.num_result = 2;
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AT_SET_RES_CB(m_res_cb.res_cb[0], BTA_AG_RES_RING, NULL, 0)
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        AT_SET_RES_CB(m_res_cb.res_cb[1], BTA_AG_RES_CLIP, p_scb->clip, 0)
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_send_multi_result(p_scb, &m_res_cb);
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* send RING ONLY */
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_send_result(p_scb, BTA_AG_RES_RING, NULL, 0);
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send RING */
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_send_result(p_scb, BTA_AG_RES_RING, NULL, 0);
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if HFP and clip enabled and clip data send CLIP */
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->conn_service == BTA_AG_HFP && p_scb->clip_enabled && p_scb->clip[0] != 0)
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_send_result(p_scb, BTA_AG_RES_CLIP, p_scb->clip, 0);
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* restart ring timer */
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_sys_start_timer(&p_scb->act_timer, BTA_AG_RING_TOUT_EVT, BTA_AG_RING_TOUT);
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1837