[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/lynq/lib/liblynq-tele-ril/lynq-riltel/util/AtLine.cpp b/src/lynq/lib/liblynq-tele-ril/lynq-riltel/util/AtLine.cpp
new file mode 100644
index 0000000..7abba8a
--- /dev/null
+++ b/src/lynq/lib/liblynq-tele-ril/lynq-riltel/util/AtLine.cpp
@@ -0,0 +1,441 @@
+/* Copyright Statement:
+ *
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein
+ * is confidential and proprietary to MediaTek Inc. and/or its licensors.
+ * Without the prior written permission of MediaTek inc. and/or its licensors,
+ * any reproduction, modification, use or disclosure of MediaTek Software,
+ * and information contained herein, in whole or in part, shall be strictly prohibited.
+ *
+ * MediaTek Inc. (C) 2016. All rights reserved.
+ *
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
+ * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+ * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+ * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+ * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
+ * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
+ * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
+ * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
+ * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
+ * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+ * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+ * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
+ * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ *
+ * The following software/firmware and/or related documentation ("MediaTek Software")
+ * have been modified by MediaTek Inc. All revisions are subject to any receiver's
+ * applicable license agreements with MediaTek Inc.
+ */
+
+#include "../util/AtLine.h"
+
+#include <assert.h>
+
+#include "../util/Misc.h"
+
+#define RFX_LOG_TAG "RfxAtLine"
+
+static const char *s_finalResponsesSuccess[] = { "OK", "CONNECT" /* some stacks start up data on another channel */
+};
+
+/**
+ * returns 1 if line is a final response indicating error
+ * See 27.007 annex B
+ * WARNING: NO CARRIER and others are sometimes unsolicited
+ */
+static const char *s_finalResponsesError[] = { "ERROR", "+CMS ERROR:",
+        "+CME ERROR:", "NO CARRIER", /* sometimes! */
+        "NO ANSWER", "NO DIALTONE", "+C2K ERROR:", "+EC2KCME ERROR", /* for distinguish CME error between MD1 and MD3 */
+};
+
+/**
+ * returns 1 if line is a intermediate response
+ * Such as
+ * AT+CMGW <CR>
+ * >XXXXXX  <CTRL+Z> or <ESC>
+ * OK
+ * WARNING: NO CARRIER and others are sometimes unsolicited
+ */
+static const char *s_IntermediatePattern[] = { "> ", };
+
+static const char *s_finalResponsesSuccessInNumeric[] = { "0", "1", };
+
+static const char *s_finalResponsesErrorInNumeric[] = { "2", "3", "4", "6", "7",
+        "8", "+CMS ERROR:", "+CME ERROR:", "+C2K ERROR:", };
+
+static const char *s_ackResponse[] = { "ACK" };
+
+AtLine::AtLine(const AtLine &other) {
+    // Only copy THIS node
+    assert(other.m_pNext == NULL);
+
+    m_line = (char *) calloc(strlen(other.m_line) + 1, sizeof(char));
+    if (m_line == NULL) {
+        //RFX_LOG_E(RFX_LOG_TAG, "OOM");
+        m_pNext = NULL;
+        m_pCur = NULL;
+        return;
+    }
+    memcpy(m_line, other.m_line, strlen(other.m_line));
+    m_line[strlen(other.m_line)] = '\0';
+    m_pNext = NULL;
+
+    // initialize p_cur
+    m_pCur = m_line;
+}
+
+AtLine::AtLine(const char* line, AtLine* next) {
+    m_line = (char *) calloc(strlen(line) + 1, sizeof(char));
+    if (m_line == NULL) {
+        //RFX_LOG_E(RFX_LOG_TAG, "OOM");
+        m_pNext = NULL;
+        m_pCur = NULL;
+        return;
+    }
+    memcpy(m_line, line, strlen(line));
+    m_line[strlen(line)] = '\0';
+    m_pNext = next;
+
+    // initialize p_cur
+    m_pCur = m_line;
+}
+
+AtLine::~AtLine() {
+    if (m_pNext) {
+        delete (m_pNext);
+    }
+
+    m_pCur = NULL;
+    if (m_line) {
+        free(m_line);
+    }
+}
+
+/**
+ * Starts tokenizing an AT response string
+ * Set err to -1 if this is not a valid response string, 0 on success.
+ * updates m_pCur with current position
+ */
+void AtLine::atTokStart(int *err) {
+    *err = 0;
+    m_pCur = m_line;
+    if (m_pCur == NULL) {
+        *err = -1;
+        return;
+    }
+
+    // skip prefix
+    // consume "^[^:]:"
+
+    m_pCur = strchr(m_pCur, ':');
+
+    if (m_pCur == NULL) {
+        *err = -1;
+        return;
+    }
+
+    m_pCur++;
+}
+
+char* AtLine::atTokChar(int *err) {
+    *err = 0;
+    if (m_pCur == NULL) {
+        *err = -1;
+        return NULL;
+    }
+    m_pCur = strchr(m_pCur, '(');
+
+    if (m_pCur == NULL) {
+        *err = -1;
+        return NULL;
+    }
+
+    return (m_pCur++);
+}
+
+void AtLine::skipWhiteSpace() {
+    if (m_pCur == NULL)
+        return;
+
+    while (*m_pCur != '\0' && isspace(*m_pCur)) {
+        m_pCur++;
+    }
+}
+
+void AtLine::skipNextComma() {
+    if (m_pCur == NULL)
+        return;
+
+    while (*m_pCur != '\0' && *m_pCur != ',') {
+        m_pCur++;
+    }
+
+    if (*m_pCur == ',') {
+        m_pCur++;
+    }
+}
+
+char* AtLine::nextTok() {
+    char *ret;
+
+    skipWhiteSpace();
+
+    if (m_pCur == NULL) {
+        ret = NULL;
+    } else if (*m_pCur == '"') {
+        m_pCur++;
+        ret = strsep(&m_pCur, "\"");
+        skipNextComma();
+    } else if (*m_pCur == '(' && *(m_pCur + 1) == '"') {
+        m_pCur = m_pCur + 2;
+        ret = strsep(&m_pCur, "\"");
+        skipNextComma();
+    } else {
+        ret = strsep(&m_pCur, ",");
+    }
+
+    return ret;
+}
+
+/**
+ * Parses the next integer in the AT response line and places it in *p_out
+ * Set err to 0 on success and -1 on fail
+ * updates m_pCur
+ * "base" is the same as the base param in strtol
+ */
+
+int AtLine::atTokNextintBase(int base, int uns, int *err) {
+    int out;
+    char *ret;
+    *err = 0;
+
+    if (m_pCur == NULL) {
+        *err = -1;
+        return 0;
+    }
+
+    ret = nextTok();
+
+    if (ret == NULL) {
+        *err = -1;
+        return 0;
+    } else {
+        long l;
+        char *end;
+
+        if (uns)
+            l = strtoul(ret, &end, base);
+        else
+            l = strtol(ret, &end, base);
+
+        out = (int) l;
+
+        if (end == ret) {
+            *err = -1;
+            return 0;
+        }
+        return out;
+    }
+}
+
+/**
+ * Parses the next base 10 integer in the AT response line
+ * and places it in *p_out
+ * Set err to 0 on success and -1 on fail
+ * updates m_pCur
+ */
+int AtLine::atTokNextint(int *err) {
+    return atTokNextintBase(10, 0, err);
+}
+
+/**
+ * Parses the next base 16 integer in the AT response line
+ * and places it in *p_out
+ * Set err to 0 on success and -1 on fail
+ * updates m_pCur
+ */
+int AtLine::atTokNexthexint(int *err) {
+    return atTokNextintBase(16, 1, err);
+}
+
+bool AtLine::atTokNextbool(int *err) {
+    int result;
+
+    result = atTokNextint(err);
+
+    if (*err < 0) {
+        *err = -1;
+        return false;
+    }
+
+    // booleans should be 0 or 1
+    if (!(result == 0 || result == 1)) {
+        *err = -1;
+        return false;
+    }
+
+    return result ? true : false;
+}
+
+char* AtLine::atTokNextstr(int *err) {
+    *err = 0;
+    if (m_pCur == NULL) {
+        *err = -1;
+        return NULL;
+    }
+
+    return nextTok();
+}
+
+/** returns 1 on "has more tokens" and 0 if no */
+int AtLine::atTokHasmore() {
+    return !(m_pCur == NULL || *m_pCur == '\0');
+}
+
+/// M: eMBMS feature
+void AtLine::atTokEqual(int *err) {
+    *err = 0;
+    m_pCur = m_line;
+    if (m_pCur == NULL) {
+        *err = -1;
+        return;
+    }
+
+    // skip prefix
+    // consume "^[^=]:"
+
+    m_pCur = strchr(m_pCur, '=');
+
+    if (m_pCur == NULL) {
+        *err = -1;
+        return;
+    }
+
+    m_pCur++;
+}
+
+/**
+ * Parses the next long long in the AT response line and places it in *p_out
+ * Set err to 0 on success and -1 on fail
+ * updates m_pCur
+ * "base" is the same as the base param in strtoll
+ */
+
+long long AtLine::atTokNextlonglongBase(int base, int uns, int *err) {
+    char *ret;
+    long long out;
+    *err = 0;
+
+    if (m_pCur == NULL) {
+        *err = -1;
+        return 0;
+    }
+
+    ret = nextTok();
+
+    if (ret == NULL) {
+        *err = -1;
+        return 0;
+    } else {
+        long long ll;
+        char *end;
+
+        if (uns)
+            ll = strtoull(ret, &end, base);
+        else
+            ll = strtoll(ret, &end, base);
+
+        out = ll;
+
+        if (end == ret) {
+            *err = -1;
+            return 0;
+        }
+    }
+
+    return out;
+}
+
+/**
+ * Parse the next base 10 long long in the AT response line
+ * and places it in *p_out
+ * Set err to 0 on success and -1 on fail
+ * updates m_pCur
+ */
+long long AtLine::atTokNextlonglong(int *err) {
+    return atTokNextlonglongBase(10, 0, err);
+}
+
+int AtLine::isFinalResponseSuccess() {
+    for (size_t i = 0; i < NUM_ELEMS(s_finalResponsesSuccess); i++) {
+        if (Misc::strStartsWith(m_line, s_finalResponsesSuccess[i])) {
+            return 1;
+        }
+    }
+
+    return 0;
+}
+
+int AtLine::isFinalResponseErrorEx(int channel_id) {
+    size_t i;
+
+//    int j=0;
+//    for(j=0; j<RfxRilUtils::getSimCount(); j++){
+//        if( (channel_id == (int)(RIL_URC+j*RIL_CHANNEL_OFFSET)) &&
+//                (RfxMisc::strStartsWith(m_line, "NO CARRIER")) ){
+//            // [ALPS01225455]NO CARRIER in URC channel is URC, not final response for mediatek modem
+//            return 0;
+//        }
+//    }
+
+    for (i = 0; i < NUM_ELEMS(s_finalResponsesError); i++) {
+        if (Misc::strStartsWith(m_line, s_finalResponsesError[i])) {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+int AtLine::isIntermediatePattern() {
+    size_t i;
+    for (i = 0; i < NUM_ELEMS(s_IntermediatePattern); i++) {
+        if (!strcmp(m_line, s_IntermediatePattern[i])) {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+bool AtLine::isFinalResponseSuccessInNumeric() {
+    for (size_t i = 0; i < NUM_ELEMS(s_finalResponsesSuccessInNumeric); i++) {
+        if (!strcmp(m_line, s_finalResponsesSuccessInNumeric[i])) {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+bool AtLine::isFinalResponseErrorInNumeric() {
+    for (size_t i = 0; i < NUM_ELEMS(s_finalResponsesErrorInNumeric); i++) {
+        if (!strncmp(m_line, s_finalResponsesErrorInNumeric[i],
+                strlen(s_finalResponsesErrorInNumeric[i]))) {
+            return 1;
+        }
+    }
+    return 0;
+}
+
+bool AtLine::isAckResponse() {
+    for (size_t i = 0; i < NUM_ELEMS(s_ackResponse); i++) {
+        if (!strncmp(m_line, s_ackResponse[i], strlen(s_ackResponse[i]))) {
+            return true;
+        }
+    }
+    return false;
+}