[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;
+ }
+}
+