[Feature]add MT2731_MP2_MR2_SVN388 baseline version

Change-Id: Ief04314834b31e27effab435d3ca8ba33b499059
diff --git a/src/lynq/lib/liblynq-tele-ril/lynq-riltel/util/utils.cpp b/src/lynq/lib/liblynq-tele-ril/lynq-riltel/util/utils.cpp
new file mode 100644
index 0000000..a430d10
--- /dev/null
+++ b/src/lynq/lib/liblynq-tele-ril/lynq-riltel/util/utils.cpp
@@ -0,0 +1,316 @@
+ /*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <cstdarg>
+#include <cstdio>
+#include <string>
+#include <algorithm>
+#include <cutils/properties.h>
+#include <errno.h>
+#include <inttypes.h>
+
+#include "utils.h"
+#include "log_extra.h"
+
+#undef LOG_TAG
+#define LOG_TAG "DEMO_UTILS"
+
+constexpr int utils::MODEM_UNKNOWN;
+constexpr int utils::MODEM_GSM;
+constexpr int utils::MODEM_TDSCDMA;
+constexpr int utils::MODEM_WCDMA;
+constexpr int utils::MODEM_LTE_TDD;
+constexpr int utils::MODEM_LTE_FDD;
+constexpr int utils::MODEM_CDMA_EVDO;
+constexpr int utils::MODEM_CDMA_1X;
+
+utils::utils() {
+    // TODO Auto-generated constructor stub
+
+}
+
+utils::~utils() {
+    // TODO Auto-generated destructor stub
+}
+
+bool utils::is93Modem() {
+#ifdef MD_93_SUPPORT
+    return true;
+#else
+    return false;
+#endif
+}
+
+bool utils::is90Modem() {
+#ifdef MD_90_SUPPORT
+    return true;
+#else
+    return false;
+#endif
+}
+
+bool utils::isC2KSupport() {
+#ifdef C2K_SUPPORT
+    return true;
+#else
+    return false;
+#endif
+}
+
+
+bool utils::isMt2635() {
+#ifdef TARGET_PLATFORM_MT2635
+    return true;
+#else
+    return false;
+#endif
+}
+
+bool utils::isMt2731(){
+#ifdef TARGET_PLATFORM_MT2731
+    return true;
+#else
+    return false;
+#endif
+}
+
+bool utils::is_support_dsds(){
+#ifdef MODE_DSDS
+    return true;
+#else
+    return false;
+#endif
+}
+
+bool utils::is_suppport_dsss(){
+#ifdef MODE_DSSS
+    return true;
+#else
+    return false;
+#endif
+}
+
+/*
+ * Get property
+ */
+int utils::mtk_property_get(const char *key, char *value, const char *default_value)
+{
+    int ali_pro_res = property_get(key, value, default_value);
+    LOG_D(LOG_TAG, "get key is %s, value is %s, result: %d", key, value, ali_pro_res);
+    return ali_pro_res;
+}
+
+/*
+ * Set property
+ */
+int utils::mtk_property_set(const char *key, const char *value)
+{
+    int ret_val = property_set(key, value);
+    LOG_D(LOG_TAG, "set key is %s, value is %s,result: %d", key, value, ret_val);
+    return ret_val;
+}
+
+bool utils::mtk_property_get_bool(const char *key, bool default_value) {
+    if (!key) {
+        return default_value;
+    }
+
+    bool result = default_value;
+    char buf[PROPERTY_VALUE_MAX] = {'\0',};
+
+    int len = property_get(key, buf, "");
+    if (len == 1) {
+        char ch = buf[0];
+        if (ch == '0' || ch == 'n') {
+            result = false;
+        } else if (ch == '1' || ch == 'y') {
+            result = true;
+        }
+    } else if (len > 1) {
+         if (!strcmp(buf, "no") || !strcmp(buf, "false") || !strcmp(buf, "off")) {
+            result = false;
+        } else if (!strcmp(buf, "yes") || !strcmp(buf, "true") || !strcmp(buf, "on")) {
+            result = true;
+        }
+    }
+
+    return result;
+}
+
+intmax_t utils::property_get_imax(const char *key, intmax_t lower_bound, intmax_t upper_bound,
+        intmax_t default_value) {
+    if (!key) {
+        return default_value;
+    }
+
+    intmax_t result = default_value;
+    char buf[PROPERTY_VALUE_MAX] = {'\0',};
+    char *end = NULL;
+
+    int len = property_get(key, buf, "");
+    if (len > 0) {
+        int tmp = errno;
+        errno = 0;
+
+        // Infer base automatically
+        result = strtoimax(buf, &end, /*base*/0);
+        if ((result == INTMAX_MIN || result == INTMAX_MAX) && errno == ERANGE) {
+            // Over or underflow
+            result = default_value;
+            ALOGV("%s(%s,%" PRIdMAX ") - overflow", __FUNCTION__, key, default_value);
+        } else if (result < lower_bound || result > upper_bound) {
+            // Out of range of requested bounds
+            result = default_value;
+            ALOGV("%s(%s,%" PRIdMAX ") - out of range", __FUNCTION__, key, default_value);
+        } else if (end == buf) {
+            // Numeric conversion failed
+            result = default_value;
+            ALOGV("%s(%s,%" PRIdMAX ") - numeric conversion failed",
+                    __FUNCTION__, key, default_value);
+        }
+
+        errno = tmp;
+    }
+
+    return result;
+}
+
+int64_t utils::mtk_property_get_int64(const char *key, int64_t default_value){
+    return (int64_t)property_get_imax(key, INT64_MIN, INT64_MAX, default_value);
+}
+
+int32_t utils::mtk_property_get_int32(const char *key, int32_t default_value) {
+    return (int32_t)property_get_imax(key, INT32_MIN, INT32_MAX, default_value);
+}
+
+int utils::find_index(std::vector<std::string> v, std::string &str) {
+    auto is_find = std::find(v.begin(), v.end(), str);
+    int index = -1;
+    if(is_find != v.end()) {
+        index = std::distance(v.begin(), is_find);
+        LOG_D(LOG_TAG,"find_index: %d, band: %s", index, str.c_str());
+    }
+    return index;
+}
+
+std::string utils::format(const std::string& format, ...) {
+    va_list args;
+    va_start (args, format);
+    size_t len = std::vsnprintf(NULL, 0, format.c_str(), args);
+    va_end(args);
+    std::vector<char> vec(len + 1);
+    va_start(args, format);
+    std::vsnprintf(&vec[0], len + 1, format.c_str(), args);
+    va_end(args);
+    return &vec[0];
+}
+
+void utils::tokenize(std::string const &str, const char delim, std::vector<std::string> &out){
+    std::stringstream ss(str);
+    std::string s;
+    while(std::getline(ss, s ,delim)) {
+        out.push_back(s);
+    }
+}
+
+void utils::tokenize(std::string const &str, const char* delim, std::vector<std::string> &out){
+    char* token = strtok(const_cast<char*>(str.c_str()), delim);
+    while (token != nullptr) {
+        out.push_back(std::string(token));
+        token = strtok(nullptr, delim);
+    }
+}
+
+void utils::setMSimProperty(int phoneId, char *pPropertyName, char *pUpdateValue) {
+    #define MAX_PHONE_NUM 10
+    #define MIN(a,b) ((a)<(b) ? (a) : (b))
+
+    char oldItemValue[PROPERTY_VALUE_MAX] = {0};
+    char newPropertyValue[PROPERTY_VALUE_MAX] = {0};
+    int i = 0;
+    int strLen = 0;
+
+    for (i = 0; i < MAX_PHONE_NUM; i++) {
+        if (i == phoneId) {
+            // use new value
+            strncat(newPropertyValue, pUpdateValue, PROPERTY_VALUE_MAX - strlen(newPropertyValue));
+        } else {
+            getMSimProperty(i, pPropertyName, oldItemValue);
+            strncat(newPropertyValue, oldItemValue, PROPERTY_VALUE_MAX - strlen(newPropertyValue));
+        }
+        if (i != MAX_PHONE_NUM-1) {
+            strncat(newPropertyValue, ",", 1);
+        }
+        memset(oldItemValue, 0, PROPERTY_VALUE_MAX);
+    }
+    LOG_D(LOG_TAG,"setMSimProperty phoneId=%d, newPropertyValue=%s", phoneId, newPropertyValue);
+    // remove no use ','
+    strLen = strlen(newPropertyValue);
+    for (i = (strLen-1); i >= 0; i--) {
+        if (newPropertyValue[i] == ',') {
+            // remove
+            newPropertyValue[i] = '\0';
+        } else {
+            break;
+        }
+    }
+    LOG_D(LOG_TAG,"newPropertyValue %s\n", newPropertyValue);
+    mtk_property_set(pPropertyName, newPropertyValue);
+}
+
+void utils::getMSimProperty(int phoneId, char *pPropertyName,char *pPropertyValue) {
+    char prop[PROPERTY_VALUE_MAX] = {0};
+    char value[PROPERTY_VALUE_MAX] = {0};
+    int count= 0;
+    int propLen = 0;
+    int i = 0;
+    int j = 0;
+
+    mtk_property_get(pPropertyName, prop, "");
+    LOG_D(LOG_TAG,"getMSimProperty pPropertyName=%s, prop=%s", pPropertyName, prop);
+    propLen = strlen(prop);
+    for (i = 0; i < propLen; i++) {
+        if(prop[i] == ',') {
+            count++;
+            if((count-1) == phoneId) {
+                // return current buffer
+                LOG_D(LOG_TAG,"getMSimProperty found! phoneId=%d, value =%s", phoneId, value);
+                strncpy(pPropertyValue, value, strlen(value));
+                return;
+            } else {
+                // clear current buffer
+                j = 0;
+                memset(value, 0, sizeof(char) * PROPERTY_VALUE_MAX);
+            }
+        } else {
+            value[j] = prop[i];
+            j++;
+        }
+    }
+    if (count == phoneId) {
+        strncpy(pPropertyValue, value, strlen(value));
+        LOG_D(LOG_TAG,"getMSimProperty found at end! phoneId=%d, value =%s", phoneId, value);
+    }
+}
+
+bool utils::is_number(const std::string& s) {
+    std::string::const_iterator it = s.begin();
+    while(it != s.end() && std::isdigit(*it))
+    {
+        ++it;
+    }
+    return !s.empty() && it == s.end();
+}