15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2004-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * BTA AG AT command interpreter. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 26258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_ag_at.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "utl.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_init 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initialize the AT command parser control block. 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_init(tBTA_AG_AT_CB *p_cb) 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf = NULL; 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_reinit 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Re-initialize the AT command parser control block. This 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function resets the AT command parser state and frees 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** any GKI buffer. 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_reinit(tBTA_AG_AT_CB *p_cb) 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 64abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free_and_reset((void **)&p_cb->p_cmd_buf); 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6720524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_process_at 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Parse AT commands. This function will take the input 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** character string and parse it for AT commands according to 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the AT command table passed in the control block. 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_process_at(tBTA_AG_AT_CB *p_cb) 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 idx; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 arg_type; 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char *p_arg; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT16 int_arg = 0; 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* loop through at command table looking for match */ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (idx = 0; p_cb->p_at_tbl[idx].p_cmd[0] != 0; idx++) 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!utl_strucmp(p_cb->p_at_tbl[idx].p_cmd, p_cb->p_cmd_buf)) 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if there is a match; verify argument type */ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->p_at_tbl[idx].p_cmd[0] != 0) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start of argument is p + strlen matching command */ 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_arg = p_cb->p_cmd_buf + strlen(p_cb->p_at_tbl[idx].p_cmd); 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no argument */ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_arg[0] == 0) 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project arg_type = BTA_AG_AT_NONE; 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else if arg is '?' and it is last character */ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_arg[0] == '?' && p_arg[1] == 0) 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we have a read */ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project arg_type = BTA_AG_AT_READ; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else if arg is '=' */ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_arg[0] == '=' && p_arg[1] != 0) 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_arg[1] == '?' && p_arg[2] == 0) 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we have a test */ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project arg_type = BTA_AG_AT_TEST; 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we have a set */ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project arg_type = BTA_AG_AT_SET; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* skip past '=' */ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_arg++; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else it is freeform argument */ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project arg_type = BTA_AG_AT_FREE; 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if arguments match command capabilities */ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((arg_type & p_cb->p_at_tbl[idx].arg_type) != 0) 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if it's a set integer check max, min range */ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (arg_type == BTA_AG_AT_SET && 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_at_tbl[idx].fmt == BTA_AG_AT_INT) 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int_arg = utl_str2int(p_arg); 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (int_arg < (INT16) p_cb->p_at_tbl[idx].min || 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int_arg > (INT16) p_cb->p_at_tbl[idx].max) 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* arg out of range; error */ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_err_cback)(p_cb->p_user, FALSE, NULL); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 152292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney (*p_cb->p_cmd_cback)(p_cb->p_user, idx, arg_type, p_arg, int_arg); 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 157292051c271cd1b2584ffdacd1913c6de13a0f6b6Tom Turney (*p_cb->p_cmd_cback)(p_cb->p_user, idx, arg_type, p_arg, int_arg); 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else error */ 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_err_cback)(p_cb->p_user, FALSE, NULL); 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else no match call error callback */ 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_err_cback)(p_cb->p_user, TRUE, p_cb->p_cmd_buf); 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_at_parse 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Parse AT commands. This function will take the input 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** character string and parse it for AT commands according to 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the AT command table passed in the control block. 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_parse(tBTA_AG_AT_CB *p_cb, char *p_buf, UINT16 len) 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i = 0; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project char* p_save; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1905fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (p_cb->p_cmd_buf == NULL) { 1915fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_cb->p_cmd_buf = (char *)osi_malloc(p_cb->cmd_max_len); 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < len;) 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (p_cb->cmd_pos < p_cb->cmd_max_len-1 && i < len) 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Skip null characters between AT commands. */ 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_cb->cmd_pos == 0) && (p_buf[i] == 0)) 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project i++; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project continue; 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf[p_cb->cmd_pos] = p_buf[i++]; 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( p_cb->p_cmd_buf[p_cb->cmd_pos] == '\r' || p_cb->p_cmd_buf[p_cb->cmd_pos] == '\n') 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf[p_cb->cmd_pos] = 0; 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_cb->cmd_pos > 2) && 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->p_cmd_buf[0] == 'A' || p_cb->p_cmd_buf[0] == 'a') && 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cb->p_cmd_buf[1] == 'T' || p_cb->p_cmd_buf[1] == 't')) 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_save = p_cb->p_cmd_buf; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf += 2; 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_ag_process_at(p_cb); 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf = p_save; 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if( p_cb->p_cmd_buf[p_cb->cmd_pos] == 0x1A || p_cb->p_cmd_buf[p_cb->cmd_pos] == 0x1B ) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->p_cmd_buf[++p_cb->cmd_pos] = 0; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_err_cback)(p_cb->p_user, TRUE, p_cb->p_cmd_buf); 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ++p_cb->cmd_pos; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (i < len) 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->cmd_pos = 0; 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 240