[Feature][T8TSK-147][Sms]optimize synchronization

Change-Id: Icc94dcc95c836b81412ca0c1f89649edc77f7c3b
diff --git a/src/lynq/lib/liblynq-sms/lynq_sms.cpp b/src/lynq/lib/liblynq-sms/lynq_sms.cpp
new file mode 100755
index 0000000..46f2119
--- /dev/null
+++ b/src/lynq/lib/liblynq-sms/lynq_sms.cpp
@@ -0,0 +1,364 @@
+

+#include <stdio.h>

+#include <sys/types.h>

+#include <sys/socket.h>

+#include <arpa/inet.h>

+#include <fcntl.h>

+#include <string.h>

+#include <stdlib.h>

+#include <unistd.h>

+#include <binder/Parcel.h>

+#include <log/log.h>

+#include <cutils/jstring.h>

+#include <pthread.h>

+#include "liblog/lynq_deflog.h"

+#include <sys/time.h>

+#include <string.h>

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

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

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

+#include "lynq_sms.h"

+#include "lynq_module_common.h"

+#include "lynq_module_socket.h"

+

+#define CALL_OFF (0)

+#define CALL_ON  (1)

+#define USER_LOG_TAG "LYNQ_SMS"

+

+using ::android::Parcel;

+

+#define MAX_SMS_BUF 1024

+

+int sms_storage_index = 0;

+

+/**

+ * @brief mark call initialization state

+ * 0: deinit state

+ * 1: init state

+ */

+int g_module_init_flag = 0;

+

+//static lynq_call_list_e_t s_call_lists[LYNQ_CALL_MAX]={};

+//static bool s_call_list_loop = 0;

+//static pthread_t s_call_list_loop_tid = -1;

+static pthread_mutex_t s_notice_new_sms_mutex  = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_notice_new_sms_cond = PTHREAD_COND_INITIALIZER;

+

+//static int s_module_isDial = 0;

+//static pthread_mutex_t call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;

+//static pthread_cond_t call_state_change_cond = PTHREAD_COND_INITIALIZER;

+//static int s_CallId = 0;

+//static pthread_mutex_t s_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;

+//static pthread_cond_t s_call_state_change_cond = PTHREAD_COND_INITIALIZER;

+

+

+static char *strdupReadString(Parcel* &p) {

+    size_t stringlen;

+    const char16_t *s16;

+    s16 = p->readString16Inplace(&stringlen);

+    return strndup16to8(s16, stringlen);

+}

+

+void lynqNoticeGetModuleNewSms()

+{

+    pthread_mutex_lock(&s_notice_new_sms_mutex);

+    pthread_cond_signal(&s_notice_new_sms_cond);

+    pthread_mutex_unlock(&s_notice_new_sms_mutex);

+    

+}

+

+void lynqNoticeWaitModuleNewSms()

+{

+    pthread_mutex_lock(&s_notice_new_sms_mutex);

+    pthread_cond_wait(&s_notice_new_sms_cond, &s_notice_new_sms_mutex);

+    pthread_mutex_unlock(&s_notice_new_sms_mutex);

+}

+

+int lynq_sms_init(int uToken)

+{

+    if(g_module_init_flag != MODULE_CLOSED)

+    {

+        LYERRLOG("module state is %d",g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+    if(uToken <0){

+        LYERRLOG("uToken  is less than 0",uToken);      

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+    g_module_init_flag = MODULE_SWITCHING;

+

+    LYLOGSET(LOG_DEBUG);

+    LYLOGEINIT(USER_LOG_TAG);   

+

+    g_module_Global_uToken = uToken;

+

+    int ret = lynq_start_all_urc_socket_thread();

+    if(ret != RESULT_OK)

+    {

+        LYERRLOG("init socket urc fail!!!");

+        g_module_init_flag = MODULE_CLOSED;

+        return LYNQ_E_INNER_ERROR;

+    }

+

+    ret = lynq_start_all_rc_socket_thread();

+    if(ret !=RESULT_OK)

+    {

+        LYERRLOG("init socket client fail!!!");

+        lynq_close_all_urc_socket_thread();

+        g_module_init_flag = MODULE_CLOSED;

+        return LYNQ_E_INNER_ERROR;

+    }

+    g_module_init_flag = MODULE_RUNNING;

+    return RESULT_OK;

+}

+

+/*

+Converts an array to a hexadecimal string

+*/

+void ArrayToStr(unsigned char *Buff, unsigned int BuffLen, char *OutputStr)

+{

+    int i = 0;

+    char TempBuff[MAX_SMS_BUF] = {0};

+    char strBuff[MAX_SMS_BUF] = {0};

+    if(sizeof(Buff) < BuffLen)

+    {

+        LYERRLOG("BuffLen is error\n");

+        return;

+    }

+    for(i = 0; i<BuffLen;i++)

+    {

+        sprintf(TempBuff,"%02x",(unsigned char)Buff[i]);

+        strncat(strBuff,TempBuff,BuffLen*2);

+    }

+    strncpy(OutputStr, strBuff, BuffLen*2);

+    return;

+}

+

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

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+    Parcel* p=NULL;

+    if(charset == 1)//means 8 bit

+    {

+        char msg_e_b[msglen*2+1] = {0};// +1 for end of string.*2:A char array contains two elements of a string for each value

+        ArrayToStr(msg, msglen, msg_e_b);

+        int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SEND_SMS,3,"%s %d %s",telephony_num, charset, msg_e_b);

+        if(ret!=RESULT_OK)

+        {

+            LYERRLOG("%s  8bit send error %d",__func__,__LINE__);

+            return ret;

+        }

+        delete p;

+        return RESULT_OK;

+    }

+    else//other bit

+    {

+        int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SEND_SMS,3,"%s %d %s",telephony_num, charset, msg);

+        if(ret!=RESULT_OK)

+        {

+            LYERRLOG("%s  7bit send error %d",__func__,__LINE__);

+            return ret;

+        }

+        delete p;

+        return RESULT_OK;

+    }

+}

+

+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 *current,int *total)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_READ_SMS_FROM_MEMORY,1,"%d",index);

+    if(ret!=0)

+    {

+        return ret;

+    }

+    LYDBGLOG("LYNQ_REQUEST_READ_SMS_FROM_MEMORY SUCCESS!");

+    p->readInt32(&index);

+    p->readInt32(status);

+    p->readInt32(charset);

+    /*lei add for gws 2022/5/12*/

+    p->readInt32(current);

+    p->readInt32(total);

+    /*lei add for gws 2022/5/12*/

+    char *phone_num = NULL;

+    phone_num = strdupReadString(p);

+    *numLen = strlen(phone_num);

+    strcpy(teleNum, phone_num);

+    char *smscenter = NULL;

+    smscenter = strdupReadString(p);

+    *smscLen = strlen(smscenter);

+    strcpy(smsc,smscenter);

+    char *msg = NULL;

+    msg = strdupReadString(p);

+    *smslen = strlen(msg);

+    strcpy(message,msg);

+    free(phone_num);

+    free(smscenter);

+    free(msg);

+    delete p;

+    return RESULT_OK;

+}

+

+int lynq_get_smsc_address(char service_num[SMSC_MAX_LEN])

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_GET_SMSC_ADDRESS,0,"");

+    if(ret!=0)

+    {

+        return ret;

+    }

+    LYDBGLOG("lynq_get_smsc_address SUCCESS!");

+    char *temp = strdupReadString(p);

+    strcpy(service_num, temp);

+    free(temp);

+    delete p;

+    return RESULT_OK;

+}

+

+int lynq_wait_receive_new_sms(int *handle)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+    if(handle==NULL)

+    {

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

+        return LYNQ_E_NULL_ANONALY;

+    }

+    lynqNoticeWaitModuleNewSms();

+    *handle = sms_storage_index;

+    return RESULT_OK;

+}

+

+int lynq_set_smsc_address(const char* service_num)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_SMSC_ADDRESS,1,"%s", service_num);

+

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s  8bit send error %d",__func__,__LINE__);

+        return ret;

+    }

+    LYDBGLOG("lynq_set_smsc_address SUCCESS!");

+    delete p;

+    return RESULT_OK;

+}

+

+int lynq_list_sms(char index_list[SMS_NUM_MAX])

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_LIST_SMS_FROM_MEMORY,0,"");

+    if(ret!=0)

+    {

+        return ret;

+    }

+    LYDBGLOG("lynq_list_sms SUCCESS!");

+    char *temp = strdupReadString(p);

+    strcpy(index_list, temp);

+    free(temp);

+    delete p;

+    return RESULT_OK;

+}

+

+int lynq_delete_sms(int index)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

+        LYERRLOG("%s module state %d error",__func__,g_module_init_flag);

+        return LYNQ_E_CONFLICT;

+    }

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_DELETE_SMS_FROM_MEMORY,1,"%d", index);

+

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s  8bit send error %d",__func__,__LINE__);

+        return ret;

+    }

+    LYDBGLOG("lynq_delete_sms SUCCESS!");

+    delete p;

+    return RESULT_OK;

+}

+

+bool is_support_urc(int urc_id)

+{

+    switch(urc_id)

+    {

+        case RIL_UNSOL_RESPONSE_NEW_SMS:

+            return true;

+        default:

+            return false;

+    }

+}

+

+int lynq_sms_deinit(void)

+{

+    if (g_module_init_flag != MODULE_RUNNING)

+    {

+       LYERRLOG("module state is %d",g_module_init_flag);

+       return LYNQ_E_CONFLICT;

+    }

+    g_module_init_flag = MODULE_SWITCHING;

+    lynq_close_all_urc_socket_thread();

+    lynq_close_all_rc_socket_thread(); 

+    g_module_init_flag = MODULE_CLOSED;

+    return RESULT_OK;

+}

+

+void urc_msg_process(Parcel *p)

+{ 

+    int resp_type;

+    int urcid;

+    int slot_id;

+

+    int size=p->dataSize();

+    p->readInt32(&resp_type);

+    p->readInt32(&urcid);

+    p->readInt32(&slot_id);

+    LYINFLOG("%s urc id = %d, slot_id = %d, size is %d, msg is %s",__func__, urcid,slot_id,size,requestToString(urcid));

+    switch (urcid)

+    {

+        case RIL_UNSOL_RESPONSE_NEW_SMS://new sms received

+        {

+            LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);

+            char *msg = NULL;

+            int index = 0;

+            msg = strdupReadString(p);

+            p->readInt32(&index);

+            sms_storage_index = index;

+            lynqNoticeGetModuleNewSms();

+            free(msg);

+            break;

+        }

+        default:

+            break;

+    }

+}

+