[feature]:add sms feature add bb

Change-Id: I5d7c9f3287b59065907a49ebd610cdf780fd954d
diff --git a/lib/liblynq-sms/LICENSE b/lib/liblynq-sms/LICENSE
new file mode 100755
index 0000000..77f59ed
--- /dev/null
+++ b/lib/liblynq-sms/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/lib/liblynq-sms/include/libsms/lynq_sms.h b/lib/liblynq-sms/include/libsms/lynq_sms.h
new file mode 100755
index 0000000..fe4b6f9
--- /dev/null
+++ b/lib/liblynq-sms/include/libsms/lynq_sms.h
@@ -0,0 +1,30 @@
+#ifndef YLNQ_SMS_H

+#define YLNQ_SMS_H 1

+#include <sys/types.h>

+#ifdef __cplusplus

+extern "C" {

+#endif

+#define MIN_MSM_PARAM_NUM 4

+#define MIN_IMS_MSM_PARAM_NUM 6

+#define MIN_WRITE_MSM_PARAM_NUM 5

+#define MSG_MAX_LEN 1024

+#define TELEPHONE_NUM_LEN 64

+#define STORAGE_SMS_MAX_SIZE 128

+#define SMSC_MAX_LEN 22

+#define SMS_NUM_MAX 255

+int lynq_sms_init(int uToken);

+int lynq_sms_deinit(void);

+int lynq_send_sms(char telephony_num[TELEPHONE_NUM_LEN], int charset, char *msg);

+int lynq_read_sms(int index,int *status,int *charset,char smsc[SMSC_MAX_LEN],int *smscLen,int *smslen,char message[MSG_MAX_LEN],char teleNum[TELEPHONE_NUM_LEN],int *numLen);

+int lynq_get_smsc_address(char service_num[SMSC_MAX_LEN]);

+int lynq_set_smsc_address(const char* service_num);

+int lynq_list_sms(char index_list[SMS_NUM_MAX]);

+int lynq_delete_sms(int index);

+int lynq_wait_receive_new_sms(int *handle);

+

+

+

+#ifdef __cplusplus

+}

+#endif

+#endif

diff --git a/lib/liblynq-sms/makefile b/lib/liblynq-sms/makefile
new file mode 100755
index 0000000..9daf449
--- /dev/null
+++ b/lib/liblynq-sms/makefile
@@ -0,0 +1,91 @@
+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/libsms \
+  -I$(ROOT)$(includedir)/vendor-ril \
+  -I$(ROOT)$(includedir)/liblog \
+
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -lpthread \
+    -lbinder \
+    -lutils \
+    -lcutils \
+    -llynq-log \
+
+SOURCES = $(wildcard *.c wildcard *.h src/*.cpp)
+
+EXECUTABLE = liblynq-sms.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/lib/liblynq-sms/src/lynq_sms.cpp b/lib/liblynq-sms/src/lynq_sms.cpp
new file mode 100755
index 0000000..15deb5f
--- /dev/null
+++ b/lib/liblynq-sms/src/lynq_sms.cpp
@@ -0,0 +1,427 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <string.h>

+#include <binder/Parcel.h>

+#include <sys/socket.h>

+#include <netdb.h>

+#include <arpa/inet.h>

+#include <string.h>

+#include <errno.h>

+#include <cutils/jstring.h>

+#include "lynq_sms.h"

+#include <vendor-ril/telephony/ril.h>

+#include <liblog/lynq_deflog.h>

+#include <sys/types.h>

+#define LYNQ_REQUEST_VENDOR_BASE 8000
+#define LYNQ_URC_VENDOR_BASE 9000
+#define LYNQ_AT_SNED (LYNQ_REQUEST_VENDOR_BASE +1)
+#define LYNQ_REQUEST_WRITE_SMS_TO_MEMORY (LYNQ_REQUEST_VENDOR_BASE +4)

+#define LYNQ_REQUEST_READ_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 5)

+#define LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 6)

+#define LYNQ_REQUEST_LIST_SMS_FROM_MEMORY (LYNQ_REQUEST_VENDOR_BASE + 7)

+using ::android::Parcel;

+

+#define SERVER_PORT     8088

+#define SERVER_URC_PORT 8086

+#define SERVER_IP    "127.0.0.1"

+#define USER_LOG_TAG "LYNQ_SMS"

+typedef struct{

+    int uToken;

+    int request;

+    int paramLen;

+    char param[1024*8];

+}lynq_client_t;

+

+typedef struct {

+    int sock_fd;

+    struct sockaddr_in addrto;

+    struct sockaddr_in addrfrom;

+}sms_instance_t;

+

+

+enum{

+    SMS_OK = 0,

+    SMS_FAIL,

+    SMS_PARAM_ERR

+};

+

+typedef struct

+{

+    int index;          /*the index of sms in memory,0-255 */

+    int status;         /* 0:read, 1:unread */

+    int charset;        /* 0:7bit, 1:8bit, 2:16bit(chinese) */

+    char smsc[SMSC_MAX_LEN];    /* smsc address */

+    int smscLen;                /* smsc string  length */

+    int smslen;                 /* the length of sms,the maximum length shall not exceed the length specified in 3GGP protocol(160/70) */

+    char message[MSG_MAX_LEN];  /* sms content */

+    char teleNum[TELEPHONE_NUM_LEN];    /* telephony number */

+    int numLen;                         /* telephony number strings length */

+}lynq_sms_msg_info_t;

+

+typedef struct{

+    int index;              /*the index of sms in memory,0-255 */

+    int status;             /* 0:read, 1:unread */

+    uint64_t timestamp;     /* reciced message timestamp */

+    char telephone_num[TELEPHONE_NUM_LEN];    /* sender telephone number */

+}lynq_sms_info_t;

+

+typedef struct{

+    int num_msg;        /* numbers of messsage */

+    lynq_sms_info_t lynq_sms_info[STORAGE_SMS_MAX_SIZE];  /* message information */

+}lynq_sms_list_info_t;

+

+static sms_instance_t sms_instance;

+int urc_recive_status = 1;

+static pthread_mutex_t s_receive_sms_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_receive_sms_cond = PTHREAD_COND_INITIALIZER;

+

+int GuToken = 0;

+int sms_storage_index = 0;

+static char *strdupReadString(Parcel &p) {

+    size_t stringlen;

+    const char16_t *s16;

+

+    s16 = p.readString16Inplace(&stringlen);

+

+    return strndup16to8(s16, stringlen);

+}

+

+static int sms_server_init(void)

+{

+    int ret = SMS_OK;

+

+    bzero(&sms_instance, sizeof(sms_instance));

+    if ((sms_instance.sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){

+        LYERRLOG("socket error:%s\n", strerror(errno));

+        ret = SMS_FAIL;

+    }

+    sms_instance.addrto.sin_family=AF_INET;

+    sms_instance.addrto.sin_addr.s_addr = inet_addr(SERVER_IP);

+    sms_instance.addrto.sin_port=htons(SERVER_PORT);

+    sms_instance.addrfrom.sin_family=AF_INET;

+    sms_instance.addrfrom.sin_addr.s_addr = inet_addr(SERVER_IP);

+    sms_instance.addrfrom.sin_port=htons(SERVER_PORT);

+

+    return ret;

+}

+

+int send_buff_to_service(char *buff, int length)

+{

+    int addr_len = sizeof(sms_instance.addrto);

+    int ret = 0;

+    ret = sendto(sms_instance.sock_fd, buff, length, 0, (struct sockaddr *)&sms_instance.addrto, addr_len);

+

+    return ret;

+}

+int waitReceiveNewSms()

+{

+    int ret = 0;

+    pthread_mutex_lock(&s_receive_sms_mutex);

+    ret = pthread_cond_wait(&s_receive_sms_cond,&s_receive_sms_mutex);

+    pthread_mutex_unlock(&s_receive_sms_mutex);

+    return ret;

+}

+void sendSignalNewSms()

+{

+    pthread_mutex_lock(&s_receive_sms_mutex);

+    pthread_cond_signal(&s_receive_sms_cond);

+    pthread_mutex_unlock(&s_receive_sms_mutex);

+    return;

+}

+int lynq_wait_receive_new_sms(int *handle)

+{

+    if(handle==NULL)

+    {

+        LYERRLOG("handle is null!!!");

+        return -1;

+    }

+    waitReceiveNewSms();

+    *handle = sms_storage_index;

+    return 0;

+}

+int recvfrom_server(void *resp)

+{

+    char recv_buf[4096] = {0};

+    int recv_len = 0;

+    int len = sizeof(struct sockaddr_in);

+    Parcel resp_parcel; // = new Parcel();

+    int32_t resp_type = 0;

+    int32_t request = 0;

+    int32_t slot_id = 0;

+    int32_t error = 0;

+    recv_len = recvfrom(sms_instance.sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&sms_instance.addrfrom, (socklen_t*)&len);

+    LYDBGLOG("##################recv length:%d\n", recv_len);

+    if(recv_len <= 0){

+        LYERRLOG("recvform error: %s\n", strerror(errno));

+        return SMS_FAIL;

+    }

+    resp_parcel.setData((uint8_t *)recv_buf,recv_len);

+    resp_parcel.setDataPosition(0);

+    if(resp_parcel.dataAvail() > 0)

+    {

+        resp_parcel.readInt32(&resp_type);

+        resp_parcel.readInt32(&request);

+        resp_parcel.readInt32(&slot_id);

+        resp_parcel.readInt32(&error);

+    }

+    LYDBGLOG("resp data: %d,%d, %d,%d\n", resp_type, request, slot_id, error);

+    switch(request)

+    {

+        case RIL_REQUEST_SEND_SMS:

+        case RIL_REQUEST_SET_SMSC_ADDRESS:

+            if(0 != error)

+            {

+                LYDBGLOG("request:%d failure,Error code:%d",request,error);

+            }

+            break;

+

+        case RIL_REQUEST_GET_SMSC_ADDRESS:

+            if(0 != error)

+            {

+                LYDBGLOG("request:%d failure,Error code:%d",request,error);

+            }

+            else

+            {

+                char *temp = strdupReadString(resp_parcel);

+                memcpy(resp, temp, strlen(temp));

+            }

+            break;

+        case LYNQ_REQUEST_READ_SMS_FROM_MEMORY:

+            if(0 != error)

+            {

+                LYDBGLOG("request:%d failure,Error code:%d",request,error);

+            }

+            else

+            {

+                int index = 0;

+                int status = 0;

+                char *phone_num = NULL;

+                char *smsc = NULL;

+                char *msg = NULL;

+                int  charset = 0;

+                lynq_sms_msg_info_t * sms_info = (lynq_sms_msg_info_t *)resp;

+                resp_parcel.readInt32(&sms_info->index);

+                resp_parcel.readInt32(&sms_info->status);

+                resp_parcel.readInt32(&sms_info->charset);

+                phone_num = strdupReadString(resp_parcel);

+                smsc = strdupReadString(resp_parcel);

+                msg = strdupReadString(resp_parcel);

+                memcpy(sms_info->smsc, smsc, strlen(smsc));

+                memcpy(sms_info->message, msg, strlen(msg));

+                memcpy(sms_info->teleNum, phone_num, strlen(phone_num));

+                sms_info->smscLen = strlen(smsc);

+                sms_info->smslen = strlen(msg);

+                sms_info->numLen = strlen(phone_num);

+            }

+            break;

+

+        case LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY:

+            if(0 != error)

+            {

+                LYDBGLOG("request:%d failure,Error code:%d",request,error);

+            }

+            break;

+

+        case LYNQ_REQUEST_LIST_SMS_FROM_MEMORY:

+            if(0 != error)

+            {

+                LYDBGLOG("request:%d failure,Error code:%d",request,error);

+            }else{

+                int temp = 0;

+                char *chartemp = NULL;

+                chartemp = strdupReadString(resp_parcel);

+                temp = strlen(chartemp);

+                if((temp > 0) && (temp <= SMS_NUM_MAX))

+                {

+                    memcpy((char*)resp,chartemp,temp);

+                }

+            }

+            break;

+

+        default:

+            LYERRLOG("not support id: %d\n", request);

+            break;

+    }

+

+    return error;

+}

+

+void * handle_urc(void *p)

+{

+    int ret = SMS_OK;

+    int sock_fd = -1;

+    char recv_buf[8192] = {0};

+    Parcel resp;

+    int len = sizeof(struct sockaddr_in);

+    if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){

+        LYERRLOG("socket error:%s\n", strerror(errno));

+        ret = SMS_FAIL;

+    }

+    int opt = 1;

+    ret = setsockopt(sock_fd,SOL_SOCKET,SO_BROADCAST,&opt,sizeof(opt));

+    ret = setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

+

+    struct sockaddr_in server;

+    server.sin_family=AF_INET;

+    server.sin_addr.s_addr = htonl(INADDR_ANY);

+    server.sin_port=htons(SERVER_URC_PORT);

+    ret = bind(sock_fd ,(struct sockaddr*)&server, sizeof(server));

+    while(urc_recive_status)

+    {

+        int slot_id = 0;

+        char *phone_num = NULL;

+        char *smsc = NULL;

+        char *msg = NULL;

+        int  charset = 0;

+        int resp_type = 0;

+        int unsol = 0;

+        int index = 0;

+        ret = recvfrom(sock_fd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&server, (socklen_t*)&len);

+        LYDBGLOG("urc recv length: %d\n", ret);

+        if(ret <= 0)

+        {

+            LYERRLOG("recvform error: %s\n", strerror(errno));

+            continue;

+        }

+        resp.setData((uint8_t *)recv_buf,ret);

+        resp.setDataPosition(0);

+        if(resp.dataAvail() > 0) {

+            resp.readInt32(&resp_type);

+            resp.readInt32(&unsol);

+            resp.readInt32(&slot_id);

+        }

+        LYERRLOG("resp_type%d,unsol=%d,slot_id=%d",resp_type,unsol,slot_id);

+        if(RIL_UNSOL_RESPONSE_NEW_SMS == unsol)

+        {

+            msg = strdupReadString(resp);

+            resp.readInt32(&index);

+            sms_storage_index = index;

+            //sms_urc_callback(slot_id, phone_num, smsc, msg, charset);

+            sendSignalNewSms();

+        }

+    }

+}

+

+int lynq_sms_init(int uToken)

+{

+    int ret = sms_server_init();

+    pthread_t pid = 0;

+    GuToken = uToken;

+    LYLOGSET(LOG_INFO);

+    LYLOGEINIT(USER_LOG_TAG);

+    pthread_create(&pid, NULL, handle_urc, NULL);

+    LYDBGLOG("lynq_sms_init ret: %d\n", ret);

+    return ret;

+}

+

+int lynq_sms_deinit(void)

+{

+    close(sms_instance.sock_fd);

+    urc_recive_status = 0;

+    return 0;

+}

+

+int lynq_send_sms(char telephony_num[TELEPHONE_NUM_LEN], int charset, char *msg)

+{

+    lynq_client_t client;

+    int ret = SMS_OK;

+

+    client.request = RIL_REQUEST_SEND_SMS;

+    client.uToken = GuToken;

+    client.paramLen = 3;

+

+    sprintf(client.param, "%s %d %s\n", telephony_num, charset, msg);

+    ret = send_buff_to_service((char *)&client, sizeof(client));

+    ret = recvfrom_server(NULL);

+

+    return ret;

+}

+

+int lynq_read_sms(int index,int *status,int *charset,char smsc[SMSC_MAX_LEN],int *smscLen,int *smslen,char message[MSG_MAX_LEN],char teleNum[TELEPHONE_NUM_LEN],int *numLen)

+{

+    lynq_client_t client;

+    lynq_sms_msg_info_t sms_msg_info;

+    int lenTemp = -1;

+    int ret = SMS_OK;

+    client.request = LYNQ_REQUEST_READ_SMS_FROM_MEMORY;

+    client.uToken = GuToken;

+    client.paramLen = 1;

+    sprintf(client.param, "%d", index);

+    ret = send_buff_to_service((char *)&client, sizeof(client));

+    ret = recvfrom_server((void *)&sms_msg_info);

+    if(ret == 0)

+    {

+        *charset = sms_msg_info.charset;

+        *status = sms_msg_info.status;

+        *smslen = sms_msg_info.smslen;

+        *smscLen = sms_msg_info.smscLen;

+        *numLen = sms_msg_info.numLen;

+        if((*smscLen > 0) && (*smscLen < SMSC_MAX_LEN))

+        {

+            memcpy(smsc,sms_msg_info.smsc,*smscLen);

+        }

+        if((*smslen > 0) && (*smslen < MSG_MAX_LEN))

+        {

+            memcpy(message,sms_msg_info.message,*smslen);

+        }

+        if((*numLen > 0) && (*numLen < TELEPHONE_NUM_LEN))

+        {

+            memcpy(teleNum,sms_msg_info.teleNum,*numLen);

+        }

+    }

+    return ret;

+}

+

+int lynq_get_smsc_address(char service_num[SMSC_MAX_LEN])

+{

+    int ret = SMS_OK;

+    lynq_client_t client;

+

+    client.request = RIL_REQUEST_GET_SMSC_ADDRESS;

+    client.uToken = GuToken;

+    client.paramLen = 0;

+    ret = send_buff_to_service((char *)&client, sizeof(client));

+    ret = recvfrom_server(service_num);

+

+    return ret;

+}

+

+int lynq_set_smsc_address(const char* service_num)

+{

+    lynq_client_t client;

+    int ret = SMS_OK;

+

+    client.request = RIL_REQUEST_SET_SMSC_ADDRESS;

+    client.uToken = GuToken;

+    client.paramLen = 1;

+    sprintf(client.param, "%s", service_num);

+    send_buff_to_service((char *)&client, sizeof(client));

+    ret = recvfrom_server(NULL);

+

+    return ret;

+}

+

+int lynq_list_sms(char index_list[SMS_NUM_MAX])

+{

+    lynq_client_t client;

+    int ret = SMS_OK;

+    client.request = LYNQ_REQUEST_LIST_SMS_FROM_MEMORY;

+    client.uToken = GuToken;

+    client.paramLen = 0;

+    ret = send_buff_to_service((char *)&client, sizeof(client));

+    ret = recvfrom_server((void *)index_list);

+    return ret;

+}

+

+int lynq_delete_sms(int index)

+{

+    lynq_client_t client;

+    int ret = SMS_OK;

+    client.request = LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY;

+    client.uToken = GuToken;

+    client.paramLen = 1;

+    sprintf(client.param, "%d", index);

+    ret = send_buff_to_service((char *)&client, sizeof(client));

+    ret = recvfrom_server(NULL);

+    return ret;

+}
\ No newline at end of file