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>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.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{
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->p_cmd_buf != NULL)
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(p_cb->p_cmd_buf);
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->p_cmd_buf = NULL;
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->cmd_pos = 0;
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_process_at
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Parse AT commands.  This function will take the input
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  character string and parse it for AT commands according to
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the AT command table passed in the control block.
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_process_at(tBTA_AG_AT_CB *p_cb)
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16      idx;
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       arg_type;
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char        *p_arg;
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT16       int_arg = 0;
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* loop through at command table looking for match */
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (idx = 0; p_cb->p_at_tbl[idx].p_cmd[0] != 0; idx++)
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!utl_strucmp(p_cb->p_at_tbl[idx].p_cmd, p_cb->p_cmd_buf))
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if there is a match; verify argument type */
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->p_at_tbl[idx].p_cmd[0] != 0)
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start of argument is p + strlen matching command */
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_arg = p_cb->p_cmd_buf + strlen(p_cb->p_at_tbl[idx].p_cmd);
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if no argument */
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_arg[0] == 0)
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            arg_type = BTA_AG_AT_NONE;
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* else if arg is '?' and it is last character */
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_arg[0] == '?' && p_arg[1] == 0)
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* we have a read */
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            arg_type = BTA_AG_AT_READ;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* else if arg is '=' */
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_arg[0] == '=' && p_arg[1] != 0)
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_arg[1] == '?' && p_arg[2] == 0)
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* we have a test */
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                arg_type = BTA_AG_AT_TEST;
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* we have a set */
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                arg_type = BTA_AG_AT_SET;
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* skip past '=' */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_arg++;
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* else it is freeform argument */
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            arg_type = BTA_AG_AT_FREE;
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if arguments match command capabilities */
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((arg_type & p_cb->p_at_tbl[idx].arg_type) != 0)
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if it's a set integer check max, min range */
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (arg_type == BTA_AG_AT_SET &&
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->p_at_tbl[idx].fmt == BTA_AG_AT_INT)
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                int_arg = utl_str2int(p_arg);
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (int_arg < (INT16) p_cb->p_at_tbl[idx].min ||
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    int_arg > (INT16) p_cb->p_at_tbl[idx].max)
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* arg out of range; error */
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*p_cb->p_err_cback)(p_cb->p_user, FALSE, NULL);
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (*p_cb->p_cmd_cback)(p_cb->p_user, idx, arg_type, p_arg, int_arg);
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*p_cb->p_cmd_cback)(p_cb->p_user, idx, arg_type, p_arg, int_arg);
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* else error */
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_cb->p_err_cback)(p_cb->p_user, FALSE, NULL);
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* else no match call error callback */
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cb->p_err_cback)(p_cb->p_user, TRUE, p_cb->p_cmd_buf);
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_at_parse
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Parse AT commands.  This function will take the input
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  character string and parse it for AT commands according to
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the AT command table passed in the control block.
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_ag_at_parse(tBTA_AG_AT_CB *p_cb, char *p_buf, UINT16 len)
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int i = 0;
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char* p_save;
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->p_cmd_buf == NULL)
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->p_cmd_buf = (char *) GKI_getbuf(p_cb->cmd_max_len);
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->cmd_pos = 0;
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < len;)
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while (p_cb->cmd_pos < p_cb->cmd_max_len-1 && i < len)
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Skip null characters between AT commands. */
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_cb->cmd_pos == 0) && (p_buf[i] == 0))
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                i++;
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                continue;
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->p_cmd_buf[p_cb->cmd_pos] = p_buf[i++];
2115738f83aeb59361a0a2eda2460113f6dc919427The 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')
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->p_cmd_buf[p_cb->cmd_pos] = 0;
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_cb->cmd_pos > 2)                                      &&
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_cb->p_cmd_buf[0] == 'A' || p_cb->p_cmd_buf[0] == 'a') &&
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_cb->p_cmd_buf[1] == 'T' || p_cb->p_cmd_buf[1] == 't'))
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_save = p_cb->p_cmd_buf;
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cb->p_cmd_buf += 2;
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_ag_process_at(p_cb);
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_cb->p_cmd_buf = p_save;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->cmd_pos = 0;
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2275738f83aeb59361a0a2eda2460113f6dc919427The 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 )
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->p_cmd_buf[++p_cb->cmd_pos] = 0;
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*p_cb->p_err_cback)(p_cb->p_user, TRUE, p_cb->p_cmd_buf);
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cb->cmd_pos = 0;
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ++p_cb->cmd_pos;
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (i < len)
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->cmd_pos = 0;
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
244