Fix mbtk from v1265 GSW

Change-Id: I5d8d395616f284bc74c8b9448cfa347164b5a668
diff --git a/mbtk/liblynq_lib/lynq_sim.c b/mbtk/liblynq_lib/lynq_sim.c
new file mode 100755
index 0000000..78af51b
--- /dev/null
+++ b/mbtk/liblynq_lib/lynq_sim.c
@@ -0,0 +1,746 @@
+#include "lynq_qser_sim.h"
+#include "mbtk_type.h"
+#include "mbtk_info_api.h"
+
+/****************************DEFINE***************************************/
+#define QSER_RESULT_SUCCESS 0
+#define QSER_RESULT_FAIL -1
+
+#define QSER_IMEI_SV_VERSION "01"
+
+/****************************DEFINE***************************************/
+
+/****************************VARIABLE***************************************/
+extern mbtk_info_handle_t* qser_info_handle;
+extern int qser_info_handle_num;
+static bool inited = FALSE;
+static uint qser_h_sim = 0x5F6F7F8F;
+static QSER_SIM_RxMsgHandlerFunc_t qser_sim_state_cb = NULL;
+static bool qser_sim_cb_state = false;
+/****************************VARIABLE***************************************/
+
+/******************************FUNC*****************************************/
+void qser_sim_state_change_cb(const void* data, int data_len)
+{
+    uint8 *ptr = (uint8*)data;
+    LOGE("[qser_sim] SIM state : %d\n", *ptr);
+    QSER_SIM_CARD_STATUS_INFO_T qser_sim_statue = {0};
+    if(*ptr == 0)
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_ABSENT;
+    }
+    else if(*ptr == 1)
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_PRESENT;
+    }
+    else if(*ptr == 18)
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_ABSENT;
+    }
+    else
+    {
+        qser_sim_statue.e_card_state = QSER_SIM_CARD_STATE_UNKNOWN;
+    }
+    if(qser_sim_state_cb != NULL)
+    {
+        qser_sim_state_cb(&qser_sim_statue);
+    }
+}
+
+/******************************FUNC*****************************************/
+
+/****************************API***************************************/
+int qser_sim_client_init(sim_client_handle_type *ph_sim)
+{
+    //UNUSED(ph_sim);
+    if(ph_sim == NULL)
+    {
+        LOGE("[qser_sim] ph_sim is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(!inited && qser_info_handle == NULL)
+    {
+        qser_info_handle = mbtk_info_handle_get();
+        if(qser_info_handle)
+        {
+            qser_info_handle_num++;
+            inited = TRUE;
+            //mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
+        } 
+        else
+        {
+            LOGE("[qser_sim] mbtk_info_handle_get() fail.");
+            return QSER_RESULT_FAIL;
+        }
+    }
+    else
+    {
+        if(!inited)
+        {
+            qser_info_handle_num++;
+            inited = TRUE;
+            //mbtk_pdp_state_change_cb_reg(qser_info_handle, qser_wan_net_state_change_cb);
+        }
+    }
+    *ph_sim = qser_h_sim;
+
+    LOGE("[qser_sim] mbtk_info_handle_get() success.");
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_getimsi(sim_client_handle_type h_sim, QSER_SIM_APP_ID_INFO_T *pt_info,char *imsi,size_t imsiLen)
+{
+    //UNUSED(h_sim);
+    UNUSED(pt_info);
+    //UNUSED(imsi);
+    //UNUSED(imsiLen);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(imsi == NULL || imsiLen < 15)
+    {
+        LOGE("[qser_sim] imsi is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    memset(imsi,0,imsiLen);
+    int err = mbtk_imsi_get(qser_info_handle, imsi);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_imsi_get is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(strlen(imsi) > imsiLen)
+    {
+        LOGE("[qser_sim] get datalength out of range.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_geticcid(sim_client_handle_type h_sim,QSER_SIM_SLOT_ID_TYPE_T simId,char *iccid, size_t iccidLen)
+{
+    //UNUSED(h_sim);
+    UNUSED(simId);
+    //UNUSED(iccid);
+    //UNUSED(iccidLen);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(iccid == NULL || iccidLen < QSER_SIM_ICCID_LEN_MAX)
+    {
+        LOGE("[qser_sim] iccid is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    memset(iccid, 0, iccidLen);
+    int err = mbtk_iccid_get(qser_info_handle, iccid);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_iccid_get is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(strlen(iccid) > iccidLen)
+    {
+        LOGE("[qser_sim] get datalength out of range.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_getphonenumber(sim_client_handle_type h_sim,QSER_SIM_APP_ID_INFO_T *pt_info, char*phone_num, size_t phoneLen)
+{
+    //UNUSED(h_sim);
+    UNUSED(pt_info);
+    //UNUSED(phone_num);
+    //UNUSED(phoneLen);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(phone_num == NULL || phoneLen < 11)
+    {
+        LOGE("[qser_sim] phone_num is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    memset(phone_num, 0, phoneLen);
+    int err = mbtk_phone_number_get(qser_info_handle, phone_num);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_phone_number_get is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(strlen(phone_num) > phoneLen)
+    {
+        LOGE("[qser_sim] get datalength out of range.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_verifypin(sim_client_handle_type h_sim,QSER_SIM_VERIFY_PIN_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(pt_info);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    int err = mbtk_verify_pin(qser_info_handle, pt_info->pin_value);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_verify_pin is fail.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_changepin(sim_client_handle_type h_sim,QSER_SIM_CHANGE_PIN_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(pt_info);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_change_pin_info pin_info = {0};
+    memcpy(pin_info.old_pin_value, pt_info->old_pin_value, pt_info->old_pin_value_len);
+    memcpy(pin_info.new_pin_value, pt_info->new_pin_value, pt_info->new_pin_value_len);
+    int err = mbtk_change_pin(qser_info_handle, &pin_info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_change_pin is fail.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_unblockpin(sim_client_handle_type h_sim, QSER_SIM_UNBLOCK_PIN_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(pt_info);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_unlock_pin_info puk_pin_info = {0};
+    memcpy(puk_pin_info.pin_value, pt_info->new_pin_value, pt_info->new_pin_value_len);
+    memcpy(puk_pin_info.puk_value, pt_info->puk_value, pt_info->puk_value_len);
+    int err = mbtk_unlock_pin(qser_info_handle, &puk_pin_info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_unlock_pin is fail.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_enablepin(sim_client_handle_type h_sim, QSER_SIM_ENABLE_PIN_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(pt_info);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_enable_pin_info pin_info = {0};
+    memcpy(pin_info.pin_value, pt_info->pin_value, pt_info->pin_value_len);
+    pin_info.enable = 1;
+    int err = mbtk_enable_pin(qser_info_handle, &pin_info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_enable_pin is fail.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_disablepin(sim_client_handle_type h_sim, QSER_SIM_DISABLE_PIN_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(pt_info);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_enable_pin_info pin_info = {0};
+    memcpy(pin_info.pin_value, pt_info->pin_value, pt_info->pin_value_len);
+    pin_info.enable = 0;
+    int err = mbtk_enable_pin(qser_info_handle, &pin_info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_enable_pin is fail.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_getcardstatus(sim_client_handle_type h_sim,QSER_SIM_SLOT_ID_TYPE_T simId,QSER_SIM_CARD_STATUS_INFO_T *pt_info)
+{
+    //UNUSED(h_sim);
+    //UNUSED(simId);
+    //UNUSED(pt_info);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(pt_info == NULL)
+    {
+        LOGE("[qser_sim] pt_info is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    mbtk_sim_state_enum sim;
+    mbtk_sim_card_type_enum sim_card_type;
+    mbtk_pin_puk_last_times qser_last_times = {0};
+    int err = mbtk_sim_state_get(qser_info_handle, &sim);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_sim_state_get fail [err = %d].", err);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        LOGE("[qser_sim] sim = %d.", sim);
+        memset(pt_info, 0x0, sizeof(QSER_SIM_CARD_STATUS_INFO_T));
+        switch (sim)
+        {
+            case 0:                     //ABSENT
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_ABSENT;
+                break;
+            case 1:                     //NOT READY
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_ABSENT;
+                break;
+            case 2:                     //READY
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_PRESENT;
+                break;
+            case 3:                     //SIM PIN
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_PRESENT;
+                break;
+            case 4:                     //SIM PUK
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_PRESENT;
+                break;
+            case 5:                     //NETWORK
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_ERROR_SIM_TECHNICAL_PROBLEMS;
+                break;
+            default:
+                pt_info->e_card_state = QSER_SIM_CARD_STATE_UNKNOWN;
+                break;
+        }
+    }
+    
+    err = mbtk_sim_card_type_get(qser_info_handle, &sim_card_type);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_sim_state_get fail [err = %d].", err);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        if(sim_card_type == 0 || sim_card_type == 2)
+            pt_info->e_card_type = QSER_SIM_CARD_TYPE_ICC;
+        else if(sim_card_type == 1 || sim_card_type == 3)
+            pt_info->e_card_type = QSER_SIM_CARD_TYPE_UICC;
+        else
+            pt_info->e_card_type = QSER_SIM_CARD_TYPE_UNKNOWN;
+    }
+    
+    err = mbtk_pin_last_num_get(qser_info_handle, &qser_last_times);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_sim_state_get fail [err = %d].", err);
+        return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        pt_info->card_app_info.app_3gpp.pin1_num_retries = qser_last_times.p1_retry;
+        pt_info->card_app_info.app_3gpp.pin2_num_retries = qser_last_times.p2_retry;
+        pt_info->card_app_info.app_3gpp.puk1_num_retries = qser_last_times.puk1_retry;
+        pt_info->card_app_info.app_3gpp.puk2_num_retries = qser_last_times.puk2_retry;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_getimei(sim_client_handle_type h_sim, char *imei)
+{
+    //UNUSED(h_sim);
+    //UNUSED(imei);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(imei == NULL)
+    {
+        LOGE("[qser_sim] imei is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    int err = mbtk_imei_get(qser_info_handle, imei);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_imei_get Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_get_imei_and_sv(sim_client_handle_type h_sim,char *imei, char*sv)
+{
+    //UNUSED(h_sim);
+    //UNUSED(imei);
+    //UNUSED(sv);
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(imei == NULL || sv == NULL)
+    {
+        LOGE("[qser_sim] param is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    int err = mbtk_imei_get(qser_info_handle, imei);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_imei_get Error: %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+
+    memcpy(sv, QSER_IMEI_SV_VERSION, strlen(QSER_IMEI_SV_VERSION));
+
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_reset_modem(sim_client_handle_type h_sim)
+{
+    //UNUSED(h_sim);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    for(int cid =0; cid < MBTK_APN_CID_MAX; cid++)
+    {
+        mbtk_data_call_stop(qser_info_handle, cid, 1);
+    }
+
+
+    //mbtk_system_reboot(0);
+    mbtk_modem_info_t info;
+    info.fun = MBTK_DEV_MODEM_MIN_FUN;
+    info.rst = 0;
+    int err = mbtk_set_modem_fun(qser_info_handle, &info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+
+    info.fun = MBTK_DEV_MODEM_FULL_FUN;
+    err = mbtk_set_modem_fun(qser_info_handle, &info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_get_version(sim_client_handle_type h_sim, char *buf)
+{
+    //UNUSED(h_sim);
+    //UNUSED(buf);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(buf == NULL)
+    {
+        LOGE("[qser_sim] buf is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    int err = mbtk_version_get(qser_info_handle, buf);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_version_get Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_reset_sim(sim_client_handle_type h_sim)
+{
+    //UNUSED(h_sim);
+
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    //mbtk_sim_power_set(0);
+    //sleep(1);
+    //mbtk_sim_power_set(1);
+    mbtk_modem_info_t info;
+    info.fun = MBTK_DEV_MODEM_DISABLE_SIM;
+    info.rst = 0;
+    int err = mbtk_set_modem_fun(qser_info_handle, &info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+
+    info.fun = MBTK_DEV_MODEM_FULL_FUN;
+    err = mbtk_set_modem_fun(qser_info_handle, &info);
+    if(err)
+    {
+        LOGE("[qser_sim] mbtk_set_modem_fun Error : %d\n", err);
+        return QSER_RESULT_FAIL;
+    }
+    return QSER_RESULT_SUCCESS;
+}
+
+int qser_sim_addrxmsghandler(QSER_SIM_RxMsgHandlerFunc_t handlerPtr)
+{
+    if(qser_info_handle == NULL)
+    {
+        LOGE("[qser_sim] handle is NULL.");
+        return QSER_RESULT_FAIL;
+    }
+
+    if(handlerPtr == NULL)
+    {
+        LOGE("[qser_sim] param is NULL.");
+        qser_sim_state_cb = NULL;
+        return QSER_RESULT_SUCCESS;
+    }
+
+    qser_sim_state_cb = handlerPtr;
+    if(!qser_sim_cb_state)
+    {
+        int ret = mbtk_sim_state_change_cb_reg(qser_info_handle, qser_sim_state_change_cb);
+        if(ret != 0)
+        {
+            LOGE("[qser_sim] set cb fail.");
+            qser_sim_state_cb = NULL;
+            return QSER_RESULT_FAIL;
+        }
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+
+
+int qser_sim_client_deinit(sim_client_handle_type h_sim)
+{
+    //UNUSED(h_sim);
+    if(h_sim != qser_h_sim)
+    {
+        LOGE("[qser_sim] h_sim is error.");
+        return QSER_RESULT_FAIL;
+    }
+    
+    if(qser_info_handle)
+    {
+        LOGE("[qser_sim] qser_info_handle_num = %d", qser_info_handle_num);
+        if(qser_info_handle_num == 1)
+        { // 最后一个引用,可释放。
+            int ret = mbtk_info_handle_free(&qser_info_handle);
+            if(ret)
+            {
+                LOGE("[qser_sim] mbtk_info_handle_free() fail.");
+                return QSER_RESULT_FAIL;
+            }
+            else
+            {
+                qser_info_handle_num = 0;
+                qser_info_handle = NULL;
+                qser_sim_state_cb = NULL;
+                inited = FALSE;
+            }
+        } 
+        else
+        {
+            qser_info_handle_num--;
+            qser_sim_state_cb = NULL;
+        }
+    }
+    else
+    {
+        LOGE("[qser_sim] handle not inited.");
+        return QSER_RESULT_FAIL;
+    }
+
+    return QSER_RESULT_SUCCESS;
+}
+/****************************API***************************************/
+