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
1983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach#define LOG_TAG "bta_ag_cmd"
2083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach
21549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include <ctype.h>
22549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include <stdio.h>
23549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include <string.h>
24549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou
25ffa5c93d455f33af1be3b04d39520413dc24afd5Zhihai Xu#include "bt_target.h"
26ffa5c93d455f33af1be3b04d39520413dc24afd5Zhihai Xu#include "bt_types.h"
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_api.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_at.h"
29549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include "bta_ag_int.h"
30549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include "bta_api.h"
31549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou#include "bta_sys.h"
32258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
3383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach#include "osi/include/log.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "port_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h"
36c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Constants
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/* Ring timeout */
4378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTA_AG_RING_TIMEOUT_MS  (5 * 1000)      /* 5 seconds */
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CMD_MAX_VAL      32767  /* Maximum value is signed 16-bit value */
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB/* Invalid Chld command */
48c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB#define BTA_AG_INVALID_CHLD        255
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* clip type constants */
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_MIN        128
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_MAX        175
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_DEFAULT    129
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AG_CLIP_TYPE_VOIP       255
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach#define COLON_IDX_4_VGSVGM    4
57292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney
5883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach/* Local events which will not trigger a higher layer callback */
59292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turneyenum
60292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney{
6183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_EVT_FIRST = 0x100,
6283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_EVT_CCWA,
6383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_EVT_CLIP,
6483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_EVT_CMER,
6583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_EVT_BRSF,
6683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_EVT_CMEE,
6783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_EVT_BIA,
6883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_EVT_BCC,
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT command interpreter table for HSP */
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD bta_ag_hsp_cmd[] =
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CKPD", BTA_AG_AT_CKPD_EVT, BTA_AG_AT_SET,   BTA_AG_AT_INT, 200, 200},
7583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+VGS",  BTA_AG_SPK_EVT,     BTA_AG_AT_SET,   BTA_AG_AT_INT,   0,  15},
7683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+VGM",  BTA_AG_MIC_EVT,     BTA_AG_AT_SET,   BTA_AG_AT_INT,   0,  15},
7783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    /* End-of-table marker used to stop lookup iteration */
7883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"", 0, 0, 0, 0, 0}
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT command interpreter table for HFP */
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD bta_ag_hfp_cmd[] =
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"A",     BTA_AG_AT_A_EVT,    BTA_AG_AT_NONE, BTA_AG_AT_STR,   0,   0},
8583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"D",     BTA_AG_AT_D_EVT,    BTA_AG_AT_NONE | BTA_AG_AT_FREE, BTA_AG_AT_STR, 0, 0},
8683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+VGS",  BTA_AG_SPK_EVT,     BTA_AG_AT_SET,  BTA_AG_AT_INT,   0,  15},
8783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+VGM",  BTA_AG_MIC_EVT,     BTA_AG_AT_SET,  BTA_AG_AT_INT,   0,  15},
8883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CCWA", BTA_AG_LOCAL_EVT_CCWA, BTA_AG_AT_SET,  BTA_AG_AT_INT,   0,   1},
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Consider CHLD as str to take care of indexes for ECC */
9083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CHLD", BTA_AG_AT_CHLD_EVT, BTA_AG_AT_SET | BTA_AG_AT_TEST, BTA_AG_AT_STR, 0, 4},
9183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CHUP", BTA_AG_AT_CHUP_EVT, BTA_AG_AT_NONE, BTA_AG_AT_STR,   0,   0},
9283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CIND", BTA_AG_AT_CIND_EVT, BTA_AG_AT_READ | BTA_AG_AT_TEST, BTA_AG_AT_STR, 0, 0},
9383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CLIP", BTA_AG_LOCAL_EVT_CLIP, BTA_AG_AT_SET,  BTA_AG_AT_INT,   0,   1},
9483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CMER", BTA_AG_LOCAL_EVT_CMER, BTA_AG_AT_SET,  BTA_AG_AT_STR,   0,   0},
9583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+VTS",  BTA_AG_AT_VTS_EVT,  BTA_AG_AT_SET,  BTA_AG_AT_STR,   0,   0},
9683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BINP", BTA_AG_AT_BINP_EVT, BTA_AG_AT_SET,  BTA_AG_AT_INT,   1,   1},
9783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BLDN", BTA_AG_AT_BLDN_EVT, BTA_AG_AT_NONE, BTA_AG_AT_STR,   0,   0},
9883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BVRA", BTA_AG_AT_BVRA_EVT, BTA_AG_AT_SET,  BTA_AG_AT_INT,   0,   1},
9983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BRSF", BTA_AG_LOCAL_EVT_BRSF, BTA_AG_AT_SET,  BTA_AG_AT_INT,   0,   BTA_AG_CMD_MAX_VAL},
10083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+NREC", BTA_AG_AT_NREC_EVT, BTA_AG_AT_SET,  BTA_AG_AT_INT,   0,   0},
10183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CNUM", BTA_AG_AT_CNUM_EVT, BTA_AG_AT_NONE, BTA_AG_AT_STR,   0,   0},
10283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BTRH", BTA_AG_AT_BTRH_EVT, BTA_AG_AT_READ | BTA_AG_AT_SET, BTA_AG_AT_INT, 0, 2},
10383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CLCC", BTA_AG_AT_CLCC_EVT, BTA_AG_AT_NONE, BTA_AG_AT_STR,   0,   0},
10483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+COPS", BTA_AG_AT_COPS_EVT, BTA_AG_AT_READ | BTA_AG_AT_SET, BTA_AG_AT_STR, 0, 0},
10583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CMEE", BTA_AG_LOCAL_EVT_CMEE, BTA_AG_AT_SET,  BTA_AG_AT_INT,   0,   1},
10683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BIA",  BTA_AG_LOCAL_EVT_BIA,  BTA_AG_AT_SET,  BTA_AG_AT_STR,   0,  20},
10783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CBC",  BTA_AG_AT_CBC_EVT,  BTA_AG_AT_SET,  BTA_AG_AT_INT,   0, 100},
10883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BCC",  BTA_AG_LOCAL_EVT_BCC,  BTA_AG_AT_NONE, BTA_AG_AT_STR,   0,   0},
10983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BCS",  BTA_AG_AT_BCS_EVT,  BTA_AG_AT_SET,  BTA_AG_AT_INT,   0, BTA_AG_CMD_MAX_VAL},
11083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BIND", BTA_AG_AT_BIND_EVT, BTA_AG_AT_SET | BTA_AG_AT_READ | BTA_AG_AT_TEST, BTA_AG_AT_STR, 0, 0},
11183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BIEV", BTA_AG_AT_BIEV_EVT, BTA_AG_AT_SET,  BTA_AG_AT_STR,   0,   0},
11283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BAC",  BTA_AG_AT_BAC_EVT,  BTA_AG_AT_SET,  BTA_AG_AT_STR,   0,   0},
11383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    /* End-of-table marker used to stop lookup iteration */
11483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"", 0, 0, 0, 0, 0}
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT result code table element */
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    const char  *result_string;       /* AT result string */
12183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    size_t      result_id;            /* Local or BTA result id */
12283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    UINT8       arg_type;             /* whether argument is int or string */
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AG_RESULT;
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* AT result code argument types */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_FMT_NONE,       /* no argument */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_FMT_INT,        /* integer argument */
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTA_AG_RES_FMT_STR         /* string argument */
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach/* Local AT command result codes not defined in bta_ag_api.h */
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_RES_FIRST = 0x0100,
13783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_RES_OK,
13883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_RES_ERROR,
13983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_RES_RING,
14083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_RES_CLIP,
14183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_RES_BRSF,
14283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_RES_CMEE,
14383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    BTA_AG_LOCAL_RES_BCS
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach/* AT result code constant table */
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_RESULT bta_ag_result_tbl[] =
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"OK",      BTA_AG_LOCAL_RES_OK,    BTA_AG_RES_FMT_NONE},
15083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"ERROR",   BTA_AG_LOCAL_RES_ERROR, BTA_AG_RES_FMT_NONE},
15183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"RING",    BTA_AG_LOCAL_RES_RING,  BTA_AG_RES_FMT_NONE},
15283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+VGS: ",  BTA_AG_SPK_RES,         BTA_AG_RES_FMT_INT},
15383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+VGM: ",  BTA_AG_MIC_RES,         BTA_AG_RES_FMT_INT},
15483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CCWA: ", BTA_AG_CALL_WAIT_RES,   BTA_AG_RES_FMT_STR},
15583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CHLD: ", BTA_AG_IN_CALL_HELD_RES,BTA_AG_RES_FMT_STR},
15683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CIND: ", BTA_AG_CIND_RES,        BTA_AG_RES_FMT_STR},
15783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CLIP: ", BTA_AG_LOCAL_RES_CLIP,  BTA_AG_RES_FMT_STR},
15883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CIEV: ", BTA_AG_IND_RES,         BTA_AG_RES_FMT_STR},
15983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BINP: ", BTA_AG_BINP_RES,        BTA_AG_RES_FMT_STR},
16083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BVRA: ", BTA_AG_BVRA_RES,        BTA_AG_RES_FMT_INT},
16183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BRSF: ", BTA_AG_LOCAL_RES_BRSF,  BTA_AG_RES_FMT_INT},
16283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BSIR: ", BTA_AG_INBAND_RING_RES, BTA_AG_RES_FMT_INT},
16383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CNUM: ", BTA_AG_CNUM_RES,        BTA_AG_RES_FMT_STR},
16483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BTRH: ", BTA_AG_BTRH_RES,        BTA_AG_RES_FMT_INT},
16583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CLCC: ", BTA_AG_CLCC_RES,        BTA_AG_RES_FMT_STR},
16683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+COPS: ", BTA_AG_COPS_RES,        BTA_AG_RES_FMT_STR},
16783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+CME ERROR: ", BTA_AG_LOCAL_RES_CMEE, BTA_AG_RES_FMT_INT},
16883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BCS: ",  BTA_AG_LOCAL_RES_BCS,   BTA_AG_RES_FMT_INT},
16983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"+BIND: ", BTA_AG_BIND_RES,        BTA_AG_RES_FMT_STR},
17083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {"",        BTA_AG_UNAT_RES,        BTA_AG_RES_FMT_STR}
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachstatic const tBTA_AG_RESULT* bta_ag_result_by_code(size_t code)
17483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach{
17583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    for (size_t i = 0; i != sizeof(bta_ag_result_tbl) /
17683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach      sizeof(bta_ag_result_tbl[0]); ++i)
17783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {
17883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        if (code == bta_ag_result_tbl[i].result_id)
17983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach            return &bta_ag_result_tbl[i];
18083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    }
18183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    return 0;
18283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach}
18383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tBTA_AG_AT_CMD *bta_ag_at_tbl[BTA_AG_NUM_IDX] =
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_hsp_cmd,
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_hfp_cmd
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachtypedef struct
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    size_t result_code;
19383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    size_t indicator;
19483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach} tBTA_AG_INDICATOR_MAP;
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach/* callsetup indicator value lookup table */
19783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachconst tBTA_AG_INDICATOR_MAP callsetup_indicator_map[] =
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {BTA_AG_IN_CALL_RES,        BTA_AG_CALLSETUP_INCOMING},
20083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {BTA_AG_CALL_WAIT_RES,      BTA_AG_CALLSETUP_INCOMING},
20183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {BTA_AG_OUT_CALL_ORIG_RES,  BTA_AG_CALLSETUP_OUTGOING},
20283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {BTA_AG_OUT_CALL_ALERT_RES, BTA_AG_CALLSETUP_ALERTING}
203292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney};
204292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney
20583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachstatic size_t bta_ag_indicator_by_result_code(size_t code)
206292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney{
20783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    for (size_t i = 0; i != sizeof(callsetup_indicator_map) /
20883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach      sizeof(callsetup_indicator_map[0]); ++i)
20983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {
21083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        if (code == callsetup_indicator_map[i].result_code)
21183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach            return callsetup_indicator_map[i].indicator;
21283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    }
21383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    return BTA_AG_CALLSETUP_NONE;
21483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach}
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_result
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send an AT result code.
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
22683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachstatic void bta_ag_send_result(tBTA_AG_SCB *p_scb, size_t code, char *p_arg,
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               INT16 int_arg)
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
22983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    const tBTA_AG_RESULT *result = bta_ag_result_by_code(code);
23083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    if (result == 0)
23183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    {
23283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        LOG_ERROR(LOG_TAG, "%s Unable to lookup result for code %zu", __func__, code);
23383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        return;
23483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    }
23583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach
23683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    char buf[BTA_AG_AT_MAX_LEN + 16];
23783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    char *p = buf;
23883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    memset(buf, 0, sizeof(buf));
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* init with \r\n */
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p++ = '\r';
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p++ = '\n';
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* copy result code string */
24583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    strlcpy(p, result->result_string, sizeof(buf) - 2);
24683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach
24783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    if (p_scb->conn_service == BTA_AG_HSP)
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If HSP then ":"symbol should be changed as "=" for HSP compatibility */
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(code)
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
25283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_SPK_RES:
25383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_MIC_RES:
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(*(p+COLON_IDX_4_VGSVGM) == ':')
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *(p+COLON_IDX_4_VGSVGM) = '=';
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach
26283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    p += strlen(result->result_string);
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* copy argument if any */
26583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    if (result->arg_type == BTA_AG_RES_FMT_INT)
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += utl_itoa((UINT16) int_arg, p);
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    else if (result->arg_type == BTA_AG_RES_FMT_STR)
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27166209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strcpy(p, p_arg);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += strlen(p_arg);
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* finish with \r\n */
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p++ = '\r';
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p++ = '\n';
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send to RFCOMM */
28083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    UINT16 len = 0;
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    PORT_WriteData(p_scb->conn_handle, buf, (UINT16) (p - buf), &len);
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_ok
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send an OK result code.
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_ok(tBTA_AG_SCB *p_scb)
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_OK, NULL, 0);
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_error
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send an ERROR result code.
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      errcode - used to send verbose errocode
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_send_error(tBTA_AG_SCB *p_scb, INT16 errcode)
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If HFP and extended audio gateway error codes are enabled */
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->conn_service == BTA_AG_HFP && p_scb->cmee_enabled)
31483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_CMEE, NULL, errcode);
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
31683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_ERROR, NULL, 0);
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_ind
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send an indicator CIEV 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_ind(tBTA_AG_SCB *p_scb, UINT16 id, UINT16 value, BOOLEAN on_demand)
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    str[12];
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    *p = str;
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the indicator is masked out, just return */
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Mandatory indicators can not be masked out. */
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_scb->bia_masked_out & ((UINT32)1 << id)) &&
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ((id != BTA_AG_IND_CALL) && (id != BTA_AG_IND_CALLSETUP) && (id != BTA_AG_IND_CALLHELD)))
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ensure we do not send duplicate indicators if not requested by app */
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If it was requested by app, transmit CIEV even if it is duplicate. */
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (id == BTA_AG_IND_CALL)
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((value == p_scb->call_ind) && (on_demand == FALSE))
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->call_ind = (UINT8)value;
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_CALLSETUP) && (on_demand == FALSE))
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (value == p_scb->callsetup_ind)
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->callsetup_ind = (UINT8)value;
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_SERVICE) && (on_demand == FALSE))
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (value == p_scb->service_ind)
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->service_ind = (UINT8)value;
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_SIGNAL) && (on_demand == FALSE))
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (value == p_scb->signal_ind)
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->signal_ind = (UINT8)value;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_ROAM) && (on_demand == FALSE))
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (value == p_scb->roam_ind)
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->roam_ind = (UINT8)value;
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_BATTCHG) && (on_demand == FALSE))
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (value == p_scb->battchg_ind)
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->battchg_ind = (UINT8)value;
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((id == BTA_AG_IND_CALLHELD) && (on_demand == FALSE))
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* call swap could result in sending callheld=1 multiple times */
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((value != 1) && (value == p_scb->callheld_ind))
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_scb->callheld_ind = (UINT8)value;
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->cmer_enabled)
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += utl_itoa(id, p);
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = ',';
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        utl_itoa(value, p);
40183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        bta_ag_send_result(p_scb, BTA_AG_IND_RES, str, 0);
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_parse_cmer
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Parse AT+CMER parameter string.
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if parsed ok, FALSE otherwise.
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_ag_parse_cmer(char *p_s, BOOLEAN *p_enabled)
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT16   n[4] = {-1, -1, -1, -1};
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     i;
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    *p;
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < 4; i++)
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* skip to comma delimiter */
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (p = p_s; *p != ',' && *p != 0; p++);
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get integer value */
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p = 0;
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        n[i] = utl_str2int(p_s);
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_s = p + 1;
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_s == 0)
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* process values */
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (n[0] < 0 || n[3] < 0)
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((n[0] == 3) && ((n[3] == 1) || (n[3] == 0)))
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_enabled = (BOOLEAN) n[3];
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_parse_chld
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Parse AT+CHLD parameter string.
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
457c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB** Returns          Returns idx (1-7), 0 if ECC not enabled or BTA_AG_INVALID_CHLD
458c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB                    if idx doesn't exist/1st character of argument is not a digit
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 bta_ag_parse_chld(tBTA_AG_SCB *p_scb, char *p_s)
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   retval = 0;
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT16   idx = -1;
4655cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_scb);
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
467c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB    if (!isdigit(p_s[0]))
468c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB    {
469c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB        return BTA_AG_INVALID_CHLD;
470c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB    }
471c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_s[1] != 0)
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* p_idxstr++;  point to beginning of call number */
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        idx = utl_str2int(&p_s[1]);
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (idx != -1 && idx < 255)
477c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB        {
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            retval = (UINT8)idx;
479c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB        }
480c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB        else
481c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB        {
482c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB            retval = BTA_AG_INVALID_CHLD;
483c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB        }
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (retval);
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE )
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_parse_bac
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Parse AT+BAC parameter string.
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Returns bitmap of supported codecs.
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_AG_PEER_CODEC bta_ag_parse_bac(tBTA_AG_SCB *p_scb, char *p_s)
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_PEER_CODEC  retval = BTA_AG_CODEC_NONE;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  uuid_codec;
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN cont = FALSE;       /* Continue processing */
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *p;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(p_s)
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* skip to comma delimiter */
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for(p = p_s; *p != ',' && *p != 0; p++);
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* get integre value */
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (*p != 0)
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p = 0;
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cont = TRUE;
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cont = FALSE;
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        uuid_codec = utl_str2int(p_s);
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(uuid_codec)
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case UUID_CODEC_CVSD:   retval |= BTA_AG_CODEC_CVSD;     break;
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case UUID_CODEC_MSBC:   retval |= BTA_AG_CODEC_MSBC;     break;
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
526e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_ERROR("Unknown Codec UUID(%d) received", uuid_codec);
527f95c12a8e7c3f264b03a51644368ca4232cc3cc4Satish Kodishala                break;
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (cont)
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_s = p + 1;
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (retval);
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_process_unat_res
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process the unat response data and remove extra carriage return
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  and line feed
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_ag_process_unat_res(char *unat_result)
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   str_leng;
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i = 0;
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   j = 0;
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   pairs_of_nl_cr;
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    trim_data[BTA_AG_AT_MAX_LEN];
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    str_leng = strlen(unat_result);
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If no extra CR and LF, just return */
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(str_leng < 4)
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Remove the carriage return and left feed */
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while(unat_result[0] =='\r' && unat_result[1] =='\n'
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        && unat_result[str_leng-2] =='\r' && unat_result[str_leng-1] =='\n')
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pairs_of_nl_cr = 1;
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i=0;i<(str_leng-4*pairs_of_nl_cr);i++)
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            trim_data[j++] = unat_result[i+pairs_of_nl_cr*2];
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Add EOF */
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        trim_data[j] = '\0';
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        str_leng = str_leng - 4;
58066209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strlcpy(unat_result, trim_data, str_leng+1);
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        i=0;
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        j=0;
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(str_leng <4)
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_inband_enabled
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Determine whether in-band ring can be used.
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_ag_inband_enabled(tBTA_AG_SCB *p_scb)
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if feature is enabled and no other scbs connected */
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->inband_enabled && !bta_ag_other_scb_open(p_scb))
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_call_inds
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send call and callsetup indicators.
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_call_inds(tBTA_AG_SCB *p_scb, tBTA_AG_RES result)
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 call = p_scb->call_ind;
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set new call and callsetup values based on BTA_AgResult */
63183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    size_t callsetup = bta_ag_indicator_by_result_code(result);
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (result == BTA_AG_END_CALL_RES)
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        call = BTA_AG_CALL_INACTIVE;
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (result == BTA_AG_IN_CALL_CONN_RES || result == BTA_AG_OUT_CALL_CONN_RES
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             || result == BTA_AG_IN_CALL_HELD_RES)
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        call = BTA_AG_CALL_ACTIVE;
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        call = p_scb->call_ind;
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send indicator function tracks if the values have actually changed */
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_send_ind(p_scb, BTA_AG_IND_CALL, call, FALSE);
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_send_ind(p_scb, BTA_AG_IND_CALLSETUP, callsetup, FALSE);
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_at_hsp_cback
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      AT command processing callback for HSP.
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
66283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbachvoid bta_ag_at_hsp_cback(tBTA_AG_SCB *p_scb, UINT16 command_id, UINT8 arg_type,
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                char *p_arg, INT16 int_arg)
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
66583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    APPL_TRACE_DEBUG("AT cmd:%d arg_type:%d arg:%d arg:%s", command_id, arg_type,
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      int_arg, p_arg);
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_ag_send_ok(p_scb);
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
67083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    tBTA_AG_VAL val;
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.hdr.handle = bta_ag_scb_to_idx(p_scb);
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.hdr.app_id = p_scb->app_id;
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.num = (UINT16) int_arg;
67466209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach    strlcpy(val.str, p_arg, BTA_AG_AT_MAX_LEN);
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* call callback with event */
67783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    (*bta_ag_cb.p_cback)(command_id, (tBTA_AG *) &val);
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
682e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Function         bta_ag_find_empty_hf_ind)
683e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
684e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Description      This function returns the index of an empty HF indicator
685e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**                  structure.
686e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
687e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Returns          int : index of the empty HF indicator structure or
688e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**                            -1 if no empty indicator
689e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**                            is available.
690e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
691e5bed64926d6ae45501617052f90932287da135bMudumba Ananth*******************************************************************************/
692e5bed64926d6ae45501617052f90932287da135bMudumba Ananthstatic int bta_ag_find_empty_hf_ind(tBTA_AG_SCB *p_scb)
693e5bed64926d6ae45501617052f90932287da135bMudumba Ananth{
694e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    for (int index = 0; index < BTA_AG_MAX_NUM_PEER_HF_IND; index++)
695e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    {
696e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        if (p_scb->peer_hf_indicators[index].ind_id == 0)
697e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            return index;
698e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    }
699e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
700e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    return -1;
701e5bed64926d6ae45501617052f90932287da135bMudumba Ananth}
702e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
703e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
704e5bed64926d6ae45501617052f90932287da135bMudumba Ananth/*******************************************************************************
705e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
706e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Function         bta_ag_find_hf_ind_by_id
707e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
708e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Description      This function returns the index of the HF indicator
709e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**                  structure by the indicator id
710e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
711e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Returns          int : index of the HF indicator structure
712e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**                            -1 if the indicator
713e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**                            was not found.
714e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
715e5bed64926d6ae45501617052f90932287da135bMudumba Ananth*******************************************************************************/
716e5bed64926d6ae45501617052f90932287da135bMudumba Ananthstatic int bta_ag_find_hf_ind_by_id(tBTA_AG_HF_IND *p_hf_ind, int size, uint32_t ind_id)
717e5bed64926d6ae45501617052f90932287da135bMudumba Ananth{
718e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    for (int index = 0; index < size; index++)
719e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    {
720e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        if (p_hf_ind[index].ind_id == ind_id)
721e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            return index;
722e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    }
723e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
724e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    return -1;
725e5bed64926d6ae45501617052f90932287da135bMudumba Ananth}
726e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
727e5bed64926d6ae45501617052f90932287da135bMudumba Ananth/*******************************************************************************
728e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
729e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Function         bta_ag_parse_bind_set
730e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
731e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Description      Parse AT+BIND set command and save the indicators
732e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
733e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Returns          true if successful
734e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
735e5bed64926d6ae45501617052f90932287da135bMudumba Ananth*******************************************************************************/
736e5bed64926d6ae45501617052f90932287da135bMudumba Ananthstatic bool bta_ag_parse_bind_set(tBTA_AG_SCB *p_scb, tBTA_AG_VAL val)
737e5bed64926d6ae45501617052f90932287da135bMudumba Ananth{
738e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    char *p_token = strtok(val.str, ",");
739e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    if (p_token == NULL)
740e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        return false;
741e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
742e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    while (p_token != NULL)
743e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    {
744e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        uint16_t rcv_ind_id = atoi(p_token);
745e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        int index = bta_ag_find_empty_hf_ind(p_scb);
746e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        if (index == -1)
747e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        {
748e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            APPL_TRACE_WARNING("%s Can't save more indicators", __func__);
749e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            return false;
750e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        }
751e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
752e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        p_scb->peer_hf_indicators[index].ind_id = rcv_ind_id;
753e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        APPL_TRACE_DEBUG("%s peer_hf_ind[%d] = %d", __func__, index, rcv_ind_id);
754e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
755e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        p_token = strtok(NULL, ",");
756e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    }
757e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
758e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    return true;
759e5bed64926d6ae45501617052f90932287da135bMudumba Ananth}
760e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
761e5bed64926d6ae45501617052f90932287da135bMudumba Ananth/*******************************************************************************
762e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
763e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Function         bta_ag_bind_response
764e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
765e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Description      Send response for the AT+BIND command (HFP 1.7) received
766e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**                  from the headset based on the argument types.
767e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
768e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Returns          Void
769e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
770e5bed64926d6ae45501617052f90932287da135bMudumba Ananth*******************************************************************************/
771e5bed64926d6ae45501617052f90932287da135bMudumba Ananthstatic void bta_ag_bind_response(tBTA_AG_SCB *p_scb, uint8_t arg_type)
772e5bed64926d6ae45501617052f90932287da135bMudumba Ananth{
773e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    char buffer[BTA_AG_AT_MAX_LEN];
774e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    memset(buffer, 0, BTA_AG_AT_MAX_LEN);
775e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
776e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    if (arg_type == BTA_AG_AT_TEST)
777e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    {
778e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        int index = 0;
779e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        buffer[index++] = '(';
780e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
781e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        for (uint32_t i = 0; i < bta_ag_local_hf_ind_cfg[0].ind_id; i++)
782e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        {
783e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            if (bta_ag_local_hf_ind_cfg[i+1].is_supported == true)
784e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            {
785e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                /* Add ',' from second indicator */
786e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                if (index > 1)
787e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    buffer[index++] = ',';
788e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                sprintf(&buffer[index++], "%d", bta_ag_local_hf_ind_cfg[i+1].ind_id);
789e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            }
790e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        }
791e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
792e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        buffer[index++] = ')';
793e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
79483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        bta_ag_send_result(p_scb, BTA_AG_BIND_RES, buffer, 0);
795e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        bta_ag_send_ok(p_scb);
796e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    }
797e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    else if (arg_type == BTA_AG_AT_READ)
798e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    {
799e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        char *p = buffer;
800e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
801e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        /* bta_ag_local_hf_ind_cfg[0].ind_id is used as BTA_AG_NUM_LOCAL_HF_IND */
802e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        for (uint32_t i = 0; i < bta_ag_local_hf_ind_cfg[0].ind_id; i++)
803e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        {
804e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            if (i == BTA_AG_MAX_NUM_LOCAL_HF_IND)
805e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            {
806e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                APPL_TRACE_WARNING("%s No space for more HF indicators", __func__);
807e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                break;
808e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            }
809e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
810e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            p_scb->local_hf_indicators[i].ind_id = bta_ag_local_hf_ind_cfg[i+1].ind_id;
811e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            p_scb->local_hf_indicators[i].is_supported = bta_ag_local_hf_ind_cfg[i+1].is_supported;
812e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            p_scb->local_hf_indicators[i].is_enable = bta_ag_local_hf_ind_cfg[i+1].is_enable;
813e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
814e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            int peer_index = bta_ag_find_hf_ind_by_id(p_scb->peer_hf_indicators,
815e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                                                    BTA_AG_MAX_NUM_PEER_HF_IND,
816e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                                                    p_scb->local_hf_indicators[i].ind_id);
817e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
818e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            /* Check whether local and peer sides support this indicator */
819e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            if (p_scb->local_hf_indicators[i].is_supported == true && peer_index != -1)
820e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            {
821e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                /* In the format of ind, state */
822e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                p += utl_itoa((uint16_t) p_scb->local_hf_indicators[i].ind_id, p);
823e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                *p++ = ',';
824e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                p += utl_itoa((uint16_t) p_scb->local_hf_indicators[i].is_enable, p);
825e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
82683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                bta_ag_send_result(p_scb, BTA_AG_BIND_RES, buffer, 0);
827e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
828e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                memset(buffer, 0, sizeof(buffer));
829e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                p = buffer;
830e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            } else {
831e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                /* If indicator is not supported, also set it to disable */
832e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                p_scb->local_hf_indicators[i].is_enable = false;
833e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            }
834e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        }
835e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
836e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        bta_ag_send_ok(p_scb);
837e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
838e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        /* If the service level connection wan't already open, now it's open */
839e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        if (!p_scb->svc_conn)
840e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            bta_ag_svc_conn_open(p_scb, NULL);
841e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    }
842e5bed64926d6ae45501617052f90932287da135bMudumba Ananth}
843e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
844e5bed64926d6ae45501617052f90932287da135bMudumba Ananth/*******************************************************************************
845e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
846e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Function         bta_ag_parse_biev_response
847e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
848e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Description      Send response for AT+BIEV command (HFP 1.7) received from
849e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**                  the headset based on the argument types.
850e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
851e5bed64926d6ae45501617052f90932287da135bMudumba Ananth** Returns          true if the response was parsed successfully
852e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
853e5bed64926d6ae45501617052f90932287da135bMudumba Ananth*******************************************************************************/
854e5bed64926d6ae45501617052f90932287da135bMudumba Ananthstatic bool bta_ag_parse_biev_response(tBTA_AG_SCB *p_scb, tBTA_AG_VAL *val)
855e5bed64926d6ae45501617052f90932287da135bMudumba Ananth{
856e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    char *p_token = strtok(val->str, ",");
857e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    uint16_t rcv_ind_id = atoi(p_token);
858e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
859e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    p_token = strtok(NULL, ",");
860e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    uint16_t rcv_ind_val = atoi(p_token);
861e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
862e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    APPL_TRACE_DEBUG("%s BIEV indicator id %d, value %d", __func__, rcv_ind_id, rcv_ind_val);
863e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
864e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    /* Check whether indicator ID is valid or not */
865e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    if (rcv_ind_id > BTA_AG_NUM_LOCAL_HF_IND)
866e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    {
867e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        APPL_TRACE_WARNING("%s received invalid indicator id %d", __func__, rcv_ind_id);
868e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        return false;
869e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    }
870e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
871e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    /* Check this indicator is support or not and enabled or not */
872e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    int local_index = bta_ag_find_hf_ind_by_id(p_scb->local_hf_indicators,
873e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                                BTA_AG_MAX_NUM_LOCAL_HF_IND, rcv_ind_id);
874e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    if (local_index == -1 ||
875e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        p_scb->local_hf_indicators[local_index].is_supported != true ||
876e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        p_scb->local_hf_indicators[local_index].is_enable != true)
877e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    {
878e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        APPL_TRACE_WARNING("%s indicator id %d not supported or disabled", __func__, rcv_ind_id);
879e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        return false;
880e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    }
881e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
882e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    /* For each indicator ID, check whether the indicator value is in range */
883e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    if (rcv_ind_val < bta_ag_local_hf_ind_cfg[rcv_ind_id].ind_min_val ||
884e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        rcv_ind_val > bta_ag_local_hf_ind_cfg[rcv_ind_id].ind_max_val)
885e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    {
886e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        APPL_TRACE_WARNING("%s invalid ind_val %d", __func__, rcv_ind_val);
887e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        return false;
888e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    }
889e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
890e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    val->lidx = rcv_ind_id;
891e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    val->num = rcv_ind_val;
892e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
893e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    return true;
894e5bed64926d6ae45501617052f90932287da135bMudumba Ananth}
895e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
896e5bed64926d6ae45501617052f90932287da135bMudumba Ananth/*******************************************************************************
897e5bed64926d6ae45501617052f90932287da135bMudumba Ananth**
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_at_hfp_cback
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      AT command processing callback for HFP.
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_hfp_cback(tBTA_AG_SCB *p_scb, UINT16 cmd, UINT8 arg_type,
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                char *p_arg, INT16 int_arg)
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_VAL     val;
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_SCB     *ag_scb;
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32          i, ind_id;
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32          bia_masked_out;
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE )
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_PEER_CODEC  codec_type, codec_sent;
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
91646d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB    if (p_arg == NULL)
91746d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB    {
91846d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB        APPL_TRACE_ERROR("%s: p_arg is null, send error and return", __func__);
91946d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB        bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
92046d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB        return;
92146d706a9849dcd027d562200a0a43e6e9156acebMallikarjuna GB    }
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
923e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("HFP AT cmd:%d arg_type:%d arg:%d arg:%s", cmd, arg_type,
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      int_arg, p_arg);
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9261b3e27469d7288b7696a1556b516e8f91c9d6a0fDevin Kim    memset(&val, 0, sizeof(tBTA_AG_VAL));
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.hdr.handle = bta_ag_scb_to_idx(p_scb);
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.hdr.app_id = p_scb->app_id;
929e5bed64926d6ae45501617052f90932287da135bMudumba Ananth    val.hdr.status = BTA_AG_SUCCESS;
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    val.num = int_arg;
9312cb90bc58fc075ec2f814ada5ae8f728380566c1Nitin Srivastava    bdcpy(val.bd_addr, p_scb->peer_addr);
93266209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach    strlcpy(val.str, p_arg, BTA_AG_AT_MAX_LEN);
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
93483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    /**
93583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach     * Unless this this is a local event, by default we'll forward
93683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach     * the event code to the application.
93783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach     * If |event| is 0 at the end of this function, the application
93883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach     * callback is NOT invoked.
93983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach     */
94083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    tBTA_AG_EVT event = 0;
94183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    if (cmd < BTA_AG_LOCAL_EVT_FIRST)
94283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        event = cmd;
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (cmd)
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
94683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_A_EVT:
94783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_SPK_EVT:
94883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_MIC_EVT:
94983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_CHUP_EVT:
95083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_CBC_EVT:
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send OK */
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
95583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_BLDN_EVT:
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Do not send OK, App will send error or OK depending on
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** last dial number enabled or not */
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
96083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_D_EVT:
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Do not send OK for Dial cmds
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Let application decide whether to send OK or ERROR*/
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if mem dial cmd, make sure string contains only digits */
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_arg[0] == '>')
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(!utl_isintstr(p_arg+1))
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    event = 0;
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_DSTR);
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (p_arg[0] == 'V')   /* ATDV : Dial VoIP Call */
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* We do not check string. Code will be added later if needed. */
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(!((p_scb->peer_features & BTA_AG_PEER_FEAT_VOIP) && (p_scb->features & BTA_AG_FEAT_VOIP)))
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    event = 0;
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If dial cmd, make sure string contains only dial digits
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ** Dial digits are 0-9, A-C, *, #, + */
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(!utl_isdialstr(p_arg))
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    event = 0;
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_DSTR);
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
99483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_LOCAL_EVT_CCWA:
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store setting */
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->ccwa_enabled = (BOOLEAN) int_arg;
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send OK */
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
100283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_CHLD_EVT:
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (arg_type == BTA_AG_AT_TEST)
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* don't call callback */
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send CHLD string */
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Form string based on supported 1.5 feature */
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_scb->peer_version >= HFP_VERSION_1_5) &&
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_scb->features & BTA_AG_FEAT_ECC) &&
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_scb->peer_features & BTA_AG_PEER_FEAT_ECC))
101383a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                    bta_ag_send_result(p_scb, BTA_AG_IN_CALL_HELD_RES,
101483a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                                       p_bta_ag_cfg->chld_val_ecc, 0);
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
101683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                    bta_ag_send_result(p_scb, BTA_AG_IN_CALL_HELD_RES,
101783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                                       p_bta_ag_cfg->chld_val, 0);
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send OK */
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if service level conn. not already open, now it's open */
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_svc_conn_open(p_scb, NULL);
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                val.idx = bta_ag_parse_chld(p_scb, val.str);
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1029c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB                if (val.idx == BTA_AG_INVALID_CHLD)
1030c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB                {
1031c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB                    event = 0;
1032c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB                    bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
1033c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB                    break;
1034c380680cf4bdfd7cd4befea57f81407fccb88752Mallikarjuna GB                }
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(val.idx && !((p_scb->features & BTA_AG_FEAT_ECC) && (p_scb->peer_features & BTA_AG_PEER_FEAT_ECC)))
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* we do not support ECC, but HF is sending us a CHLD with call index*/
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    event = 0;
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* If it is swap between calls, set call held indicator to 3(out of valid 0-2)
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ** Application will set it back to 1
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ** callheld indicator will be sent across to the peer. */
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(val.str[0] == '2')
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++)
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if (ag_scb->in_use)
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            if((ag_scb->call_ind == BTA_AG_CALL_ACTIVE)
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                && (ag_scb->callsetup_ind == BTA_AG_CALLSETUP_NONE))
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                ag_scb->callheld_ind = BTA_AG_CALLHELD_NOACTIVE + 1;
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Do not send OK. Let app decide after parsing the val str */
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* bta_ag_send_ok(p_scb); */
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
106783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_BIND_EVT:
106883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach            APPL_TRACE_DEBUG("%s BTA_AG_AT_BIND_EVT arg_type: %d", __func__, arg_type);
1069e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            if (arg_type == BTA_AG_AT_SET)
1070e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            {
1071e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                if (bta_ag_parse_bind_set(p_scb, val))
1072e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                {
1073e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    bta_ag_send_ok(p_scb);
1074e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                } else {
1075e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    event = 0;/* don't call callback */
1076e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    bta_ag_send_error(p_scb, BTA_AG_ERR_INVALID_INDEX);
1077e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                }
1078e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            } else {
1079e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                bta_ag_bind_response(p_scb, arg_type);
1080e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
1081e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                /* Need not pass this command beyond BTIF.*/
1082e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                /* Stack handles it internally */
1083e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                event = 0;/* don't call callback */
1084e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            }
1085e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            break;
1086e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
108783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_BIEV_EVT:
1088e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            if (bta_ag_parse_biev_response(p_scb, &val))
1089e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            {
1090e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                bta_ag_send_ok(p_scb);
1091e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            } else {
1092e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                bta_ag_send_error(p_scb, BTA_AG_ERR_INVALID_INDEX);
1093e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                /* don't call callback receiving invalid indicator */
1094e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                event = 0;
1095e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            }
1096e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            break;
1097e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
109883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_CIND_EVT:
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (arg_type == BTA_AG_AT_TEST)
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* don't call callback */
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send CIND string, send OK */
110583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                bta_ag_send_result(p_scb, BTA_AG_CIND_RES, p_bta_ag_cfg->cind_info, 0);
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
111083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_LOCAL_EVT_CLIP:
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store setting, send OK */
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->clip_enabled = (BOOLEAN) int_arg;
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
111683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_LOCAL_EVT_CMER:
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if parsed ok store setting, send OK */
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_ag_parse_cmer(p_arg, &p_scb->cmer_enabled))
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if service level conn. not already open and our features and
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ** peer features do not have 3-way, service level conn. now open
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                */
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (!p_scb->svc_conn &&
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    !((p_scb->features & BTA_AG_FEAT_3WAY) && (p_scb->peer_features & BTA_AG_PEER_FEAT_3WAY)))
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_svc_conn_open(p_scb, NULL);
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
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_INV_CHAR_IN_TSTR);
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
113783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_VTS_EVT:
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check argument */
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (strlen(p_arg) == 1)
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
115083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_BINP_EVT:
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if feature not set don't call callback, send ERROR */
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(p_scb->features & BTA_AG_FEAT_VTAG))
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
115983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_BVRA_EVT:
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if feature not supported don't call callback, send ERROR. App will send OK */
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(p_scb->features & BTA_AG_FEAT_VREC))
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
116883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_LOCAL_EVT_BRSF:
1169ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach        {
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store peer features */
1171e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            p_scb->peer_features = (uint16_t) int_arg;
1172ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach
1173ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach            tBTA_AG_FEAT features = p_scb->features;
1174ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach            if (p_scb->peer_version < HFP_VERSION_1_7)
1175ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach            {
1176ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach                features &= HFP_1_6_FEAT_MASK;
1177ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach            }
1178ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach
1179e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            APPL_TRACE_DEBUG("%s BRSF HF: 0x%x, phone: 0x%x", __func__,
1180ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach                p_scb->peer_features, features);
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send BRSF, send OK */
118395ac90b5e8f9b003f15c49d6bd5be5399ffa30c3Andre Eisenbach            bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_BRSF, NULL, (int16_t) features);
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1186ebba3ef2ea5061a48aa0de49ebfdb98df64d803fAndre Eisenbach        }
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
118883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_NREC_EVT:
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if feature send OK, else don't call callback, send ERROR */
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->features & BTA_AG_FEAT_ECNR)
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
120183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_BTRH_EVT:
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if feature send BTRH, send OK:, else don't call callback, send ERROR */
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->features & BTA_AG_FEAT_BTRH)
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* If set command; send response and notify app */
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (arg_type == BTA_AG_AT_SET)
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    for (i = 0, ag_scb = &bta_ag_cb.scb[0]; i < BTA_AG_NUM_SCB; i++, ag_scb++)
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    {
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        if (ag_scb->in_use)
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        {
121283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                            bta_ag_send_result(ag_scb, BTA_AG_BTRH_RES, NULL, int_arg);
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        }
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    }
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ok(p_scb);
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else /* Read Command */
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    val.num = BTA_AG_BTRH_READ;
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
122983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_COPS_EVT:
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (arg_type == BTA_AG_AT_SET)
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* don't call callback */
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send OK */
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
124083a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_LOCAL_EVT_CMEE:
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->features & BTA_AG_FEAT_EXTERR)
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* store setting */
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->cmee_enabled = (BOOLEAN) int_arg;
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* send OK */
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok(p_scb);
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* don't call callback */
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            event = 0;
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
125783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_LOCAL_EVT_BIA:
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* don't call callback */
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            event = 0;
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bia_masked_out = p_scb->bia_masked_out;
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Parse the indicator mask */
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i = 0, ind_id = 1; (val.str[i] != 0) && (ind_id <= 20); i++, ind_id++)
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (val.str[i] == ',')
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    continue;
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (val.str[i] == '0')
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bia_masked_out |= ((UINT32)1 << ind_id);
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (val.str[i] == '1')
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bia_masked_out &= ~((UINT32)1 << ind_id);
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                i++;
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( (val.str[i] != 0) && (val.str[i] != ',') )
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (val.str[i] == 0)
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->bia_masked_out = bia_masked_out;
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ok (p_scb);
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error (p_scb, BTA_AG_ERR_INVALID_INDEX);
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
128983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_CNUM_EVT:
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
129183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach
129283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_CLCC_EVT:
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!(p_scb->features & BTA_AG_FEAT_ECS))
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                event = 0;
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE )
130183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_BAC_EVT:
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store available codecs from the peer */
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if((p_scb->peer_features & BTA_AG_PEER_FEAT_CODEC) && (p_scb->features & BTA_AG_FEAT_CODEC))
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->peer_codecs = bta_ag_parse_bac(p_scb, p_arg);
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->codec_updated = TRUE;
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_scb->peer_codecs & BTA_AG_CODEC_MSBC)
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_scb->sco_codec = UUID_CODEC_MSBC;
1313e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_DEBUG("Received AT+BAC, updating sco codec to MSBC");
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_scb->sco_codec = UUID_CODEC_CVSD;
1318e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_DEBUG("Received AT+BAC, updating sco codec to CVSD");
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
132066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie                /* The above logic sets the stack preferred codec based on local and peer codec
132166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie                capabilities. This can be overridden by the application depending on its preference
132266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie                using the bta_ag_setcodec API. We send the peer_codecs to the application. */
132366432dcffe211e317d35978283a04a96d5620bdfMatthew Xie                val.num = p_scb->peer_codecs;
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Received BAC while in codec negotiation. */
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((bta_ag_cb.sco.state == BTA_AG_SCO_CODEC_ST) && (bta_ag_cb.sco.p_curr_scb == p_scb))
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_codec_negotiate (p_scb);
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
133265e9c8251cd9f70153861aabe09f8767b82ce434Satish Kodishala                p_scb->peer_codecs = BTA_AG_CODEC_CVSD;
1333e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_ERROR("Unexpected CMD:AT+BAC, Codec Negotiation is not supported");
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
133783a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_AT_BCS_EVT:
133866432dcffe211e317d35978283a04a96d5620bdfMatthew Xie            bta_ag_send_ok(p_scb);
133978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_cancel(p_scb->codec_negotiation_timer);
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            switch(int_arg)
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                case UUID_CODEC_CVSD:   codec_type = BTA_AG_CODEC_CVSD;     break;
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                case UUID_CODEC_MSBC:   codec_type = BTA_AG_CODEC_MSBC;     break;
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                default:
1346e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_ERROR("Unknown codec_uuid %d", int_arg);
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    codec_type = 0xFFFF;
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->codec_fallback)
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                codec_sent = BTA_AG_CODEC_CVSD;
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                codec_sent = p_scb->sco_codec;
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(codec_type == codec_sent)
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_codec_nego(p_scb, TRUE);
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_codec_nego(p_scb, FALSE);
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
136166432dcffe211e317d35978283a04a96d5620bdfMatthew Xie            /* send final codec info to callback */
136266432dcffe211e317d35978283a04a96d5620bdfMatthew Xie            val.num = codec_sent;
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
136583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        case BTA_AG_LOCAL_EVT_BCC:
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_sco_open(p_scb, NULL);
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
13720856d9c0a662d78ab0f68e6e0df1721ab43dbb45Sunny Kapdi            bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* call callback */
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (event != 0)
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_ag_cb.p_cback)(event, (tBTA_AG *) &val);
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_at_err_cback
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      AT command parser error callback.
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_err_cback(tBTA_AG_SCB *p_scb, BOOLEAN unknown, char *p_arg)
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_AG_VAL     val;
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(unknown && (!strlen(p_arg)))
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1399e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("Empty AT cmd string received");
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_send_ok(p_scb);
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if unknown AT command and configured to pass these to app */
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (unknown && (p_scb->features & BTA_AG_FEAT_UNAT))
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        val.hdr.handle = bta_ag_scb_to_idx(p_scb);
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        val.hdr.app_id = p_scb->app_id;
1409e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        val.hdr.status = BTA_AG_SUCCESS;
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        val.num = 0;
141166209db61f94128f19ec09891ed99b1d10e4ebfbAndre Eisenbach        strlcpy(val.str, p_arg, BTA_AG_AT_MAX_LEN);
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*bta_ag_cb.p_cback)(BTA_AG_AT_UNAT_EVT, (tBTA_AG *) &val);
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_send_error(p_scb, BTA_AG_ERR_OP_NOT_SUPPORTED);
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_hsp_result
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle API result for HSP connections.
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_hsp_result(tBTA_AG_SCB *p_scb, tBTA_AG_API_RESULT *p_result)
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1432e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_ag_hsp_result : res = %d", p_result->result);
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(p_result->result)
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_SPK_RES:
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_MIC_RES:
143883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach            bta_ag_send_result(p_scb, p_result->result, NULL, p_result->data.num);
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IN_CALL_RES:
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* tell sys to stop av if any */
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if sco already opened or no inband ring send ring now */
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (bta_ag_sco_is_open(p_scb) || !bta_ag_inband_enabled(p_scb) ||
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (p_scb->features & BTA_AG_FEAT_NOSCO))
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_ring(p_scb, (tBTA_AG_DATA *) p_result);
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* else open sco, send ring after sco opened */
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* HSPv1.2: AG shall not send RING if using in-band ring tone. */
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_scb->hsp_version >= HSP_VERSION_1_2)
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_scb->post_sco = BTA_AG_POST_SCO_NONE;
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_scb->post_sco = BTA_AG_POST_SCO_RING;
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IN_CALL_CONN_RES:
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_OUT_CALL_ORIG_RES:
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if incoming call connected stop ring timer */
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->result == BTA_AG_IN_CALL_CONN_RES)
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
146978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                alarm_cancel(p_scb->ring_timer);
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(p_scb->features & BTA_AG_FEAT_NOSCO))
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if audio connected to this scb open sco */
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb))
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* else if no audio at call close sco */
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE)
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_END_CALL_RES:
148878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_cancel(p_scb->ring_timer);
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* close sco */
14915738f83aeb59361a0a2eda2460113f6dc919427The 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))
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if av got suspended by this call, let it resume. */
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_INBAND_RING_RES:
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->inband_enabled = p_result->data.state;
1504e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("inband_enabled set to %d", p_scb->inband_enabled);
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_UNAT_RES:
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.str[0] != 0)
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
151283a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                    bta_ag_send_result(p_scb, p_result->result, p_result->data.str, 0);
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ok(p_scb);
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, BTA_AG_ERR_INV_CHAR_IN_TSTR);
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* ignore all others */
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_hfp_result
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle API result for HFP connections.
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_hfp_result(tBTA_AG_SCB *p_scb, tBTA_AG_API_RESULT *p_result)
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1542e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_ag_hfp_result : res = %d", p_result->result);
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(p_result->result)
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_SPK_RES:
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_MIC_RES:
154883a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach            bta_ag_send_result(p_scb, p_result->result, NULL, p_result->data.num);
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IN_CALL_RES:
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* tell sys to stop av if any */
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_sys_sco_use(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store caller id string.
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * append type info at the end.
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * make sure a valid type info is passed.
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * otherwise add 129 as default type */
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_result->data.num < BTA_AG_CLIP_TYPE_MIN) || (p_result->data.num > BTA_AG_CLIP_TYPE_MAX))
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.num != BTA_AG_CLIP_TYPE_VOIP)
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_result->data.num = BTA_AG_CLIP_TYPE_DEFAULT;
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1565e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("CLIP type :%d", p_result->data.num);
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->clip[0] = 0;
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.str[0] != 0)
1568549c64d1eb96f8096915a39c2a3447190c851bceMiao Chou                snprintf(p_scb->clip, sizeof(p_scb->clip), "%s,%d", p_result->data.str, p_result->data.num);
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send callsetup indicator */
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END)
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Need to sent 2 callsetup IND's(Call End and Incoming call) after SCO close. */
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->post_sco = BTA_AG_POST_SCO_CALL_END_INCALL;
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_call_inds(p_scb, p_result->result);
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if sco already opened or no inband ring send ring now */
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (bta_ag_sco_is_open(p_scb) || !bta_ag_inband_enabled(p_scb) ||
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_scb->features & BTA_AG_FEAT_NOSCO))
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ring(p_scb, (tBTA_AG_DATA *) p_result);
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* else open sco, send ring after sco opened */
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_scb->post_sco = BTA_AG_POST_SCO_RING;
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IN_CALL_CONN_RES:
159678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_cancel(p_scb->ring_timer);
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15987b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB            /* if sco not opened and we need to open it, send indicators first
15997b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB            ** then  open sco.
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
16017b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB            bta_ag_send_call_inds(p_scb, p_result->result);
16027b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB
16037b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB            if (!(p_scb->features & BTA_AG_FEAT_NOSCO))
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16057b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB                if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb))
16067b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB                {
16077b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
16087b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB                }
16097b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB                else if ((p_result->data.audio_handle == BTA_AG_HANDLE_NONE) &&
16107b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB                        bta_ag_sco_is_open(p_scb))
16117b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB                {
16127b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB                    bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
16137b0bfd32833a8da08069b60e6568aace90778b62Mallikarjuna GB                }
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IN_CALL_HELD_RES:
161878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_cancel(p_scb->ring_timer);
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_call_inds(p_scb, p_result->result);
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_OUT_CALL_ORIG_RES:
16252d0d790ca98b6c46be085e1e0a3e6d16ebd8cddfMallikarjuna GB            bta_ag_send_call_inds(p_scb, p_result->result);
16262d0d790ca98b6c46be085e1e0a3e6d16ebd8cddfMallikarjuna GB            if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) &&
16272d0d790ca98b6c46be085e1e0a3e6d16ebd8cddfMallikarjuna GB                !(p_scb->features & BTA_AG_FEAT_NOSCO))
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16292d0d790ca98b6c46be085e1e0a3e6d16ebd8cddfMallikarjuna GB                bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_OUT_CALL_ALERT_RES:
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send indicators */
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_call_inds(p_scb, p_result->result);
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb) &&
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                !(p_scb->features & BTA_AG_FEAT_NOSCO))
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1643d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB        case BTA_AG_MULTI_CALL_RES:
1644d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB            /* open SCO at SLC for this three way call */
1645d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB            APPL_TRACE_DEBUG("Headset Connected in three way call");
1646d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB            if (!(p_scb->features & BTA_AG_FEAT_NOSCO))
1647d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB            {
1648d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB                if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb))
1649d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
1650d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB                else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE)
1651d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB                    bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
1652d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB            }
1653d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB            break;
1654d345bb208fe35923b60bca6af76b0a6e023fc56fMallikarjuna GB
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_OUT_CALL_CONN_RES:
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send indicators */
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_call_inds(p_scb, p_result->result);
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* open or close sco */
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(p_scb->features & BTA_AG_FEAT_NOSCO))
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.audio_handle == bta_ag_scb_to_idx(p_scb))
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_open(p_scb, (tBTA_AG_DATA *) p_result);
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (p_result->data.audio_handle == BTA_AG_HANDLE_NONE)
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_CALL_CANCEL_RES:
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send indicators */
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_call_inds(p_scb, p_result->result);
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_END_CALL_RES:
167978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_cancel(p_scb->ring_timer);
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if sco open, close sco then send indicator values */
16825738f83aeb59361a0a2eda2460113f6dc919427The 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))
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->post_sco = BTA_AG_POST_SCO_CALL_END;
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_sco_close(p_scb, (tBTA_AG_DATA *) p_result);
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (p_scb->post_sco == BTA_AG_POST_SCO_CALL_END_INCALL)
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* sco closing for outgoing call because of incoming call */
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Send only callsetup end indicator after sco close */
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_scb->post_sco = BTA_AG_POST_SCO_CALL_END;
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_call_inds(p_scb, p_result->result);
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if av got suspended by this call, let it resume. */
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_sys_sco_unuse(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_INBAND_RING_RES:
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->inband_enabled = p_result->data.state;
1704e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("inband_enabled set to %d", p_scb->inband_enabled);
170583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach            bta_ag_send_result(p_scb, p_result->result, NULL, p_result->data.state);
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_CIND_RES:
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* store local values */
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->call_ind = p_result->data.str[0] - '0';
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->callsetup_ind = p_result->data.str[2] - '0';
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->service_ind = p_result->data.str[4] - '0';
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->signal_ind = p_result->data.str[6] - '0';
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->roam_ind = p_result->data.str[8] - '0';
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_scb->battchg_ind = p_result->data.str[10] - '0';
1716a7ce13feaa2a84ff329f2bbd4ab964f0f6d54f0aMallikarjuna GB            p_scb->callheld_ind = p_result->data.str[12] - '0';
1717e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("cind call:%d callsetup:%d", p_scb->call_ind, p_scb->callsetup_ind);
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
171983a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach            bta_ag_send_result(p_scb, p_result->result, p_result->data.str, 0);
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ok(p_scb);
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_BINP_RES:
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_CNUM_RES:
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_CLCC_RES:
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_COPS_RES:
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.str[0] != 0)
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
173183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                   bta_ag_send_result(p_scb, p_result->result, p_result->data.str, 0);
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ok(p_scb);
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, p_result->data.errcode);
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_UNAT_RES:
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.str[0] != 0)
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_process_unat_res(p_result->data.str);
1750e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_DEBUG("BTA_AG_RES :%s",p_result->data.str);
175183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                    bta_ag_send_result(p_scb, p_result->result, p_result->data.str, 0);
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ok(p_scb);
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, p_result->data.errcode);
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_CALL_WAIT_RES:
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_scb->ccwa_enabled)
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
176683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                bta_ag_send_result(p_scb, p_result->result, p_result->data.str, 0);
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_call_inds(p_scb, p_result->result);
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_IND_RES:
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_ag_send_ind(p_scb, p_result->data.ind.id, p_result->data.ind.value, FALSE);
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_BVRA_RES:
177683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach            bta_ag_send_result(p_scb, p_result->result, NULL, p_result->data.state);
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AG_BTRH_RES:
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_result->data.ok_flag != BTA_AG_OK_ERROR)
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Don't respond to read if not in response & hold state */
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.num != BTA_AG_BTRH_NO_RESP)
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
178583a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                    bta_ag_send_result(p_scb, p_result->result, NULL, p_result->data.num);
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* In case of a response to a read request we need to send OK */
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_result->data.ok_flag == BTA_AG_OK_DONE)
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_send_ok(p_scb);
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_ag_send_error(p_scb, p_result->data.errcode);
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1798e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        case BTA_AG_BIND_RES:
1799e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        {
1800e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            /* Find whether ind_id is supported by local device or not */
1801e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            int local_index = bta_ag_find_hf_ind_by_id(p_scb->local_hf_indicators,
1802e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                                      BTA_AG_MAX_NUM_LOCAL_HF_IND, p_result->data.ind.id);
1803e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            if (local_index == -1)
1804e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            {
1805e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                APPL_TRACE_WARNING("%s Invalid HF Indicator ID %d", __func__,
1806e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    p_result->data.ind.id);
1807e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                return;
1808e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            }
1809e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
1810e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            /* Find whether ind_id is supported by peer device or not */
1811e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            int peer_index = bta_ag_find_hf_ind_by_id(p_scb->peer_hf_indicators,
1812e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                                      BTA_AG_MAX_NUM_PEER_HF_IND, p_result->data.ind.id);
1813e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            if (peer_index == -1)
1814e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            {
1815e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                APPL_TRACE_WARNING("%s Invalid HF Indicator ID %d", __func__,
1816e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    p_result->data.ind.id);
1817e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                return;
1818e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            } else {
1819e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                /* If the current state is different from the one upper layer request
1820e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                   change current state and send out the result */
1821e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                if (p_scb->local_hf_indicators[local_index].is_enable != p_result->data.ind.on_demand)
1822e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                {
1823e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    char buffer[BTA_AG_AT_MAX_LEN] = {0};
1824e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    char *p = buffer;
1825e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
1826e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    p_scb->local_hf_indicators[local_index].is_enable = p_result->data.ind.on_demand;
1827e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    p += utl_itoa(p_result->data.ind.id, p);
1828e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    *p++ = ',';
1829e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    p += utl_itoa(p_scb->local_hf_indicators[local_index].is_enable, p);
1830e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
183183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach                    bta_ag_send_result(p_scb, p_result->result, buffer, 0);
1832e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                } else {
1833e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                    APPL_TRACE_DEBUG("%s HF Indicator %d already %s", p_result->data.ind.id,
1834e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                        (p_result->data.ind.on_demand == true) ? "Enabled" : "Disabled");
1835e5bed64926d6ae45501617052f90932287da135bMudumba Ananth                }
1836e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            }
1837e5bed64926d6ae45501617052f90932287da135bMudumba Ananth            break;
1838e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        }
1839e5bed64926d6ae45501617052f90932287da135bMudumba Ananth
1840e5bed64926d6ae45501617052f90932287da135bMudumba Ananth        default:
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_result
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Handle API result.
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_result(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->conn_service == BTA_AG_HSP)
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_hsp_result(p_scb, &p_data->api_result);
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_ag_hfp_result(p_scb, &p_data->api_result);
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_WBS_INCLUDED == TRUE )
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_bcs
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send +BCS AT command to peer.
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_bcs(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 codec_uuid;
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->codec_fallback)
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        codec_uuid = UUID_CODEC_CVSD;
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch(p_scb->sco_codec)
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTA_AG_CODEC_NONE:     codec_uuid = UUID_CODEC_CVSD;   break;
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTA_AG_CODEC_CVSD:     codec_uuid = UUID_CODEC_CVSD;   break;
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTA_AG_CODEC_MSBC:     codec_uuid = UUID_CODEC_MSBC;   break;
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
1893e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_ERROR("bta_ag_send_bcs: unknown codec %d, use CVSD", p_scb->sco_codec);
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                codec_uuid = UUID_CODEC_CVSD;
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send +BCS */
190066432dcffe211e317d35978283a04a96d5620bdfMatthew Xie    APPL_TRACE_DEBUG("send +BCS codec is %d", codec_uuid);
190183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_BCS, NULL, codec_uuid);
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_send_ring
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Send RING result code to peer.
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_send_ring(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19185cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_data);
19195cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send RING */
192183a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach    bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_RING, NULL, 0);
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if HFP and clip enabled and clip data send CLIP */
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_scb->conn_service == BTA_AG_HFP && p_scb->clip_enabled && p_scb->clip[0] != 0)
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
192683a376cdc46388cd9af47eb8d8a810f7b194b8aaAndre Eisenbach        bta_ag_send_result(p_scb, BTA_AG_LOCAL_RES_CLIP, p_scb->clip, 0);
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
192978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    bta_sys_start_timer(p_scb->ring_timer, BTA_AG_RING_TIMEOUT_MS,
193078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                        BTA_AG_RING_TIMEOUT_EVT, bta_ag_scb_to_idx(p_scb));
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1932