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