[Feature]liblynq-sim add

Change-Id: I80fcb4ab734917990ffa7d66a43d28d2d9009a7d
diff --git a/src/lynq/lib/liblynq-sim/LICENSE b/src/lynq/lib/liblynq-sim/LICENSE
new file mode 100755
index 0000000..77f59ed
--- /dev/null
+++ b/src/lynq/lib/liblynq-sim/LICENSE
@@ -0,0 +1,31 @@
+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) 2015. 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.
diff --git a/src/lynq/lib/liblynq-sim/include/lynq_sim.h b/src/lynq/lib/liblynq-sim/include/lynq_sim.h
new file mode 100755
index 0000000..9e55e69
--- /dev/null
+++ b/src/lynq/lib/liblynq-sim/include/lynq_sim.h
@@ -0,0 +1,38 @@
+/*============================================================================= 
+#     FileName: lynq_sim.cpp
+#     Desc: about SIMAPI
+#     Author: mobiletek 
+#     Version: V1.0
+#     LastChange: 2020-07-29 
+#     History: 
+# If you need to use any API under lynq_sim, you must first call the init_sim() function to initialize these functions.
+=============================================================================*/
+#ifndef __LYNQ_SIM__
+#define __LYNQ_SIM__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int lynq_get_sim_status(int *card_status);
+int lynq_get_imsi(char buf[]);
+
+/*add by lei*/
+int lynq_sim_init(int utoken);
+int lynq_sim_deinit(void);
+int lynq_enable_pin(char pin[]);
+int lynq_disable_pin(char pin[]);
+int lynq_get_iccid(char buf[]);
+int lynq_query_pin_lock(char *pin,int buf[]);
+int lynq_verify_pin(char *pin);
+int lynq_change_pin(char *old_pin, char *new_pin);
+int lynq_unlock_pin(char *puk, char *pin);
+int lynq_query_phone_number(char buf[]);
+/*add by lei*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/src/lynq/lib/liblynq-sim/makefile b/src/lynq/lib/liblynq-sim/makefile
new file mode 100755
index 0000000..f34e6b0
--- /dev/null
+++ b/src/lynq/lib/liblynq-sim/makefile
@@ -0,0 +1,93 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -std=gnu++14 \
+                -g -Os \
+                -flto \
+                -fPIC \
+                -fpermissive \
+
+$(warning ################# C2K support: $(RAT_CONFIG_C2K_SUPPORT))
+ifeq ($(strip $(RAT_CONFIG_C2K_SUPPORT)), yes)
+    LOCAL_CFLAGS += -DC2K_SUPPORT
+
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsds)
+    LOCAL_CFLAGS += -DANDROID_SIM_COUNT_2 \
+                     -DANDROID_MULTI_SIM \
+                     -DMODE_DSDS
+endif
+
+ifeq ($(strip $(MTK_MULTI_SIM_SUPPORT)), dsss)
+    LOCAL_CFLAGS += -DMODE_DSSS
+endif
+
+$(warning ################# TARGET_PLATFORM: $(TARGET_PLATFORM))
+ifeq ($(strip $(TARGET_PLATFORM)), mt2731)
+#$(warning #################add for debug $(ROOT), $(includedir))
+$(warning ################# TARGET_PLATFORM_MT2731)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2731 \
+                    -DMD_93_SUPPORT
+else ifeq ($(strip $(TARGET_PLATFORM)), mt2635)
+$(warning ################# TARGET_PLATFORM_MT2635)
+    LOCAL_CFLAGS += -DTARGET_PLATFORM_MT2635 \
+                    -DMD_90_SUPPORT
+endif
+
+$(warning ################# RITA ROOT: $(ROOT),includedir:$(includedir))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include \
+  -I$(ROOT)$(includedir)/vendor-ril \
+  -I$(ROOT)$(includedir)/logger \
+  -I$(ROOT)$(includedir)/liblog \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+	-lpthread \
+	-lbinder \
+	-lutils \
+	-lcutils \
+    -llog \
+    -llynq-log \
+
+SOURCES = $(wildcard *.c wildcard *.h src/*.cpp)
+
+EXECUTABLE = liblynq-sim.so
+
+OBJECTS=$(SOURCES:.c=.o)
+
+
+.PHONY: build clean install pack_rootfs 
+
+all: build
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $< 
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+
+install:
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+
+pack_rootfs:
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
diff --git a/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp b/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
new file mode 100755
index 0000000..16c2315
--- /dev/null
+++ b/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
@@ -0,0 +1,607 @@
+/*============================================================================= 
+#     FileName: lynq_sim.cpp
+#     Desc: about SIM API
+#     Author: mobiletek 
+#     Version: V1.0
+#     LastChange: 2021-12-29 
+#     History: 
+=============================================================================*/
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <unistd.h>
+#include <binder/Parcel.h>
+#include <log/log.h>
+#include <cutils/jstring.h>
+#include <pthread.h>
+#include "lynq_sim.h"
+#include <sys/socket.h>   
+#include <netinet/in.h>   
+#include <arpa/inet.h>
+#define MAX_BUF 20
+#define MAX_NUM 80
+#define RIL_REQUEST_GET_SIM_STATUS 1
+#define RIL_REQUEST_GET_IMSI 11
+#define RIL_REQUEST_QUERY_ICCID 2026
+#define RIL_REQUEST_SET_FACILITY_LOCK 43
+#define RIL_REQUEST_QUERY_FACILITY_LOCK 42
+#define RIL_REQUEST_ENTER_SIM_PIN 2
+#define RIL_REQUEST_ENTER_SIM_PUK 3
+#define RIL_REQUEST_CHANGE_SIM_PIN 6
+#define RIL_REQUEST_OEM_HOOK_RAW 59
+#define MAX_LEN 1024*8
+#define MAX_NUM 10
+#define LOG_TAG "LYNQ_SIM"
+#define FLAG_TESS 0
+using ::android::Parcel;
+#define DEST_PORT 8088
+#define DSET_IP_ADDRESS  "127.0.0.1"
+
+typedef struct{
+    int uToken;
+    int request;
+    int paramLen;
+    char param[MAX_LEN];
+}lynq_client_t;
+
+lynq_client_t client_t;
+/* socket文件描述符 */ 
+int len_addr_serv;
+struct sockaddr_in addr_serv;
+static int sock_fd = 0;
+int Global_uToken = 0; 
+int resp_type = -1;
+int request = -1;
+int slot_id = -1;
+int error1 = -1;
+
+int lynq_sim_init(int utoken){
+    if(utoken < 0){
+        return -1;
+    }
+    // LYLOGSET(LOG_INFO);
+    // LYLOGEINIT(USER_LOG_TAG);
+    Global_uToken = utoken;
+    sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+	if (-1 == sock_fd)
+	{
+		return sock_fd;
+	}
+    /* 设置address */  
+    memset(&addr_serv, 0, sizeof(addr_serv));  
+    addr_serv.sin_family = AF_INET;  
+    addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);  
+    addr_serv.sin_port = htons(DEST_PORT);  
+    len_addr_serv = sizeof(addr_serv);  
+    /*test*/
+    return 0;
+}
+
+int lynq_sim_deinit(void){
+    close(sock_fd);
+    return 0;
+}
+
+static char * lynqStrdupReadString(Parcel &p) {
+    size_t stringlen;
+    const char16_t *s16;
+
+    s16 = p.readString16Inplace(&stringlen);
+    return strndup16to8(s16, stringlen);
+}
+
+/*If you need to use any API under lynq_sim, you mustfirst call the init_sim() function to initialize these functions.*/
+int lynq_get_sim_status(int *card_status)
+{   
+    int ret = -1;
+    if(card_status == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    int len = 0;
+    lynq_client_t client_t1;
+    memset(&client_t1, 0, sizeof(client_t1) );
+    client_t1.request = RIL_REQUEST_GET_SIM_STATUS;
+    client_t1.paramLen = 0;
+    client_t1.uToken = Global_uToken;
+    char res_data[MAX_LEN] = {0};
+    int len1 = sizeof(client_t1.param);
+    memset(client_t1.param, 0, sizeof(char)*MAX_LEN);
+    send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return send_num;
+    }
+    //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        p.readInt32(card_status);
+    }
+    return error1;
+}
+/*AT> AT+CIMI     AT< IMSI*/
+int lynq_get_imsi(char buf[])
+{   
+    int ret = -1;
+    if(buf == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    int len = 0;
+    lynq_client_t client_t1;
+    memset(&client_t1, 0, sizeof(client_t1) );
+    client_t1.request = RIL_REQUEST_GET_IMSI;
+    client_t1.paramLen = 0;
+    client_t1.uToken = Global_uToken;
+    char res_data[MAX_LEN] = {0};
+    memset(client_t1.param, 0, sizeof(client_t1.param));
+    send_num = sendto(sock_fd, &client_t1, sizeof(client_t1), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return send_num;
+    }
+    //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        if(!error1){
+            char * test = lynqStrdupReadString(p);
+            memcpy(buf, test, strlen(test));
+        }
+    }
+    return error1;
+}
+
+
+/*add by lei*/
+
+int lynq_get_iccid(char buf[]){
+    int ret = -1;
+    if(buf == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    int len = 0; 
+    client_t.request = RIL_REQUEST_QUERY_ICCID;
+    client_t.paramLen = 0;
+    client_t.uToken = Global_uToken;
+    char res_data[MAX_LEN] = {0};
+    memset(client_t.param, 0, sizeof(client_t.param));
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return send_num;
+    }
+    //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        if(!error1){
+            char * test = lynqStrdupReadString(p);
+            memcpy(buf, test, strlen(test));
+        }
+    }
+    return error1;
+}
+
+int lynq_enable_pin(char *pin){
+    int ret = -1;
+    if(pin == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;  
+    char res_data[MAX_LEN] = {0};
+    client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
+    client_t.paramLen = 4;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "1");
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return send_num;
+    }
+
+    //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+    }
+    return error1;
+}
+
+int lynq_disable_pin(char *pin){
+    int ret = -1;
+    if(pin == NULL)
+        return ret;
+    int send_num = 0;  
+    int recv_num = 0;
+    char res_data[MAX_LEN] = {0};
+    client_t.request = RIL_REQUEST_SET_FACILITY_LOCK;
+    client_t.paramLen = 4;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s %s %s %s\n", "SC", pin, "11", "0");
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return send_num;
+    }
+    //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+    }
+    return error1;
+}
+
+int lynq_query_pin_lock(char *pin,int buf[]){
+    int ret = -1;
+    if(pin == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    int len = 0; 
+    client_t.request = RIL_REQUEST_QUERY_FACILITY_LOCK;
+    client_t.paramLen = 3;
+    client_t.uToken = Global_uToken;
+    char res_data[MAX_LEN] = {0};
+    sprintf(client_t.param, "%s %s %s\n", "SC", pin, "11");
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return send_num;
+    }
+    //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    int num = -1;
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        p.readInt32(&num);
+        if(num > 0){
+            int *test = (int *)calloc(1, sizeof(int)*num);
+            for(int i =0; i <num; i++){
+                p.readInt32(&test[i]);
+                buf[i] = test[i];
+            }
+            free(test);
+        }
+    }
+    return error1;
+}
+
+int lynq_verify_pin(char *pin){
+    int ret = -1;
+    if(pin == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    char res_data[MAX_LEN] = {0};
+    int len = 0; 
+    client_t.request = RIL_REQUEST_ENTER_SIM_PIN;
+    client_t.paramLen = 1;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s\n", pin);
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return send_num;
+    }
+   //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+    }
+    return error1;
+}
+
+int lynq_change_pin(char *old_pin, char *new_pin){
+    int ret = -1;
+    if(old_pin == NULL || new_pin == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    char res_data[MAX_LEN] = {0};
+    int len = 0; 
+    client_t.request = RIL_REQUEST_CHANGE_SIM_PIN;
+    client_t.paramLen = 2;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s %s\n", old_pin, new_pin);
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return send_num;
+    }
+    //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+    }
+    return error1;
+}
+
+int lynq_unlock_pin(char *puk, char *pin){
+    int ret = -1;
+    if(puk == NULL || pin == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    char res_data[MAX_LEN] = {0};
+    int len = 0; 
+    client_t.request = RIL_REQUEST_ENTER_SIM_PUK;
+    client_t.paramLen = 2;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s %s\n", puk, pin);
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return send_num;
+    }
+    //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+    }
+    return error1;
+}
+
+static void delete_char(char str[],char target){
+    if(str == NULL){
+        return;
+    }
+    int i,j;
+    for(i=j=0;str[i]!='\0';i++){
+        if(str[i]!=target){
+            str[j++]=str[i];
+        }
+    }
+    str[j]='\0';
+} 
+
+static int parse_param(char *cmd, char **argv, char buf[]){
+    if(cmd == NULL || argv == NULL || buf == NULL){
+        return 0;
+    }
+    if(strstr(cmd,"ERROR")){
+        //char *test = strchr(cmd, ':')+1;
+        int len = strlen(cmd);
+        memcpy(buf, cmd, len);
+        buf[len] = '\0';
+        return 3;
+    }
+    else{
+        int argc = 0;
+        char *token;
+        token = strtok(cmd, ",");
+        if(strstr(token, "CNUM")){
+            char *string;
+            while (token != NULL)
+            {  
+                string = token;
+                argv[argc++] = string;
+                token = strtok(NULL, ",");
+            }
+            int lengh = strlen(argv[1]);
+            memcpy(buf, argv[1], lengh);
+            buf[lengh] = '\0';
+            delete_char(buf, '"');
+        }
+    }
+    return 0;
+}
+
+int lynq_query_phone_number(char buf[]){
+    int ret = -1;
+    if(buf == NULL)
+        return ret;
+    int send_num = 0;
+    int recv_num = 0;
+    int len = 0;
+    char res_data[MAX_LEN] = {0};
+    client_t.request = RIL_REQUEST_OEM_HOOK_RAW;
+    client_t.paramLen = 1;
+    client_t.uToken = Global_uToken;
+    sprintf(client_t.param, "%s\n", "AT+CNUM");
+    send_num = sendto(sock_fd, &client_t, sizeof(client_t), 0, (struct sockaddr *)&addr_serv, len_addr_serv);
+    if(send_num < 0)  
+    {  
+        RLOGD("sendto error:");  
+        return ret;
+    }
+     //get data msg
+    recv_num = recvfrom(sock_fd,res_data,sizeof(char)*MAX_LEN,0,(struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
+    if(recv_num < 0 || recv_num == 0)
+    {
+        RLOGD("recvfrom step2 fail:");
+        return recv_num;
+    }
+    Parcel p;
+    p.setData((uint8_t *)res_data,sizeof(char)*recv_num); // p.setData((uint8_t *) buffer, buflen);
+    p.setDataPosition(0);
+    int num = -1;
+    if(p.dataAvail() > 0)
+    {   
+        char test[30] = {0};
+        char *argv[5] = {0};
+        p.readInt32(&resp_type);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error1);
+        p.readInt32(&num);
+        if(num == -1){
+        }else{
+            p.read(test, num);
+            parse_param(test, argv, buf);
+        }
+    }
+    return error1;
+}
+#if FLAG_TESS
+int lynq_query_operator(char buf[]){
+    int32_t token = -1;
+    if(buf == NULL)
+        return token;
+    char msg_imsi[20] = {0};
+    memset(msg_imsi,0,sizeof(msg_imsi));
+    token = lynq_get_imsi(msg_imsi);
+    if(strlen(msg_imsi) != 0){
+        FindOperator *ope_command = NULL;
+        ope_command = find_ope_command(msg_imsi, findOperator);
+        if(ope_command){
+            memcpy(buf, ope_command->buf, strlen(ope_command->buf));
+            buf[strlen(ope_command->buf)] = '\0';
+        }
+        else{
+            /*more*/
+            char mccmnc[5] = {0};
+            memcpy(buf, msg_imsi, 5);
+            buf[5] = '\0';
+            /*more*/
+        }
+        return token;
+    }
+    else{
+        //msg->base.e = err;
+        const char *test = "please insert sim card";
+        memcpy(buf, test, strlen(test));
+        return token;
+    }
+}
+FindOperator findOperator[] = {
+#include "operator.h"
+};
+
+static FindOperator*find_ope_command (char *name,FindOperator *Class){
+    if(name == NULL || Class == NULL){
+        return ((FindOperator *)NULL);
+    }
+    register int i;
+    for (i = 0; Class[i].MCCMCN; i++)
+        if (strncmp (name, Class[i].MCCMCN, 5) == 0)
+            return (&Class[i]);
+    return ((FindOperator *)NULL);
+}
+
+#endif
+
+
+
+