|  | #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 "lynq_data.h" | 
|  | #include <cutils/jstring.h> | 
|  | #include <pthread.h> | 
|  | #include "liblog/lynq_deflog.h" | 
|  | #include <sys/time.h> | 
|  | #include <include/lynq_uci.h> | 
|  | #include <errno.h> | 
|  | #include <vector> | 
|  | #include "lynq_data_urc.h" | 
|  |  | 
|  | #define LYNQ_SERVICE_PORT 8088 | 
|  | #define LYNQ_REC_BUF 8192 | 
|  | #define LYNQ_REQUEST_PARAM_BUF 8192 | 
|  | #define LYQN_SEDN_BUF 1024*8+sizeof(int)*3 | 
|  | #define USER_LOG_TAG "LYNQ_DATA" | 
|  |  | 
|  | #define LYNQ_DATA_UCI_BUF 258 | 
|  |  | 
|  | #define LYNQ_ADDRESS "127.0.0.1" | 
|  |  | 
|  | using ::android::Parcel; | 
|  | typedef struct{ | 
|  | int uToken; | 
|  | int request; | 
|  | int paramLen; | 
|  | char param[LYNQ_REQUEST_PARAM_BUF]; | 
|  | }lynq_client_t; | 
|  | typedef enum{ | 
|  | LYNQ_E_CARDSTATE_ERROR=8000, | 
|  | /* The voice service state is out of service*/ | 
|  | LYNQ_E_STATE_OUT_OF_SERVICE=8001, | 
|  | /* The voice service state is EMERGENCY_ONLY*/ | 
|  | LYNQ_E_STATE_EMERGENCY_ONLY=8002, | 
|  | /* The radio power is power off*/ | 
|  | LYNQ_E_STATE_POWER_OFF=8003, | 
|  | LYNQ_E_TIME_OUT=8004, | 
|  | /*create or open sms DB fail */ | 
|  | LYNQ_E_SMS_DB_FAIL=8005, | 
|  | /*Failed to execute sql statement*/ | 
|  | LYNQ_E_SMS_SQL_FAIL = 8006, | 
|  | LYNQ_E_SMS_NOT_FIND = 8007, | 
|  | /* The logic conflict*/ | 
|  | LYNQ_E_CONFLICT=9000, | 
|  | /*Null anomaly*/ | 
|  | LYNQ_E_NULL_ANONALY=9001 | 
|  | }LYNQ_E; | 
|  |  | 
|  | int lynq_client_sockfd = 0; | 
|  | int Global_uToken = 0; | 
|  |  | 
|  | int lynq_data_call_change_id = -1; | 
|  | pthread_t lynq_data_tid =-1; | 
|  | static pthread_mutex_t s_data_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER; | 
|  | static pthread_cond_t s_data_call_state_change_cond = PTHREAD_COND_INITIALIZER; | 
|  |  | 
|  | static pthread_mutex_t s_lynq_apn_change_mutex = PTHREAD_MUTEX_INITIALIZER; | 
|  | static pthread_cond_t s_lynq_apn_change_cond = PTHREAD_COND_INITIALIZER; | 
|  | static pthread_mutex_t s_lynq_urc_vector_mutex = PTHREAD_MUTEX_INITIALIZER; | 
|  | static pthread_cond_t s_lynq_urc_vector_cond = PTHREAD_COND_INITIALIZER; | 
|  | /**g_lynq_data_sendto_mutex | 
|  | * @brief mark data send request mutex | 
|  | */ | 
|  | static pthread_mutex_t g_lynq_data_sendto_mutex; | 
|  | /*This value data the state of the wait*/ | 
|  | static int data_waiting_status = 0; | 
|  | /*The value indicates that 8085 error occurs in data*/ | 
|  | static int data_invaild_error = 0; | 
|  | /*This value ensure the data call timing is correct*/ | 
|  | static int data_timelimit = 0; | 
|  |  | 
|  | /**g_lynq_data_init_flag | 
|  | * @brief mark data initialization state | 
|  | * 0:deinit status | 
|  | * 1:init state | 
|  | */ | 
|  | static int g_lynq_data_init_flag = 0; | 
|  | /**g_lynq_apn_result | 
|  | * @brief temp of apn result info | 
|  | */ | 
|  | char g_lynq_apn_result[1024] = {}; | 
|  |  | 
|  | static std::vector<int> s_data_urc_wait_list; | 
|  |  | 
|  | typedef struct | 
|  | { | 
|  | char apn[LYNQ_APN_MAX_LEN]; | 
|  | char apnType[LYNQ_APN_TYPE_MAX_LEN]; | 
|  | char ifaceName[LYNQ_IFACE_NAME_MAX_LEN]; | 
|  | int hasUsed; | 
|  | int hasTimeout; | 
|  | }lynq_apn_t; | 
|  | lynq_apn_t lynq_apn_table[LYNQ_APN_CHANNEL_MAX] = {}; | 
|  | lynq_data_call_response_v11_t lynq_data_call_lists[LYNQ_APN_CHANNEL_MAX] = {}; | 
|  | int lynq_data_call = 0; | 
|  |  | 
|  | int getLynqApnID(char apnType[]) | 
|  | { | 
|  | int ret = 0; | 
|  | int len = 0; | 
|  | for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++) | 
|  | { | 
|  | len = strlen(lynq_apn_table[ret].apnType)<strlen(apnType) ? strlen(lynq_apn_table[ret].apnType):strlen(apnType); | 
|  | LYINFLOG("apn_table[%d].apnType:%s,input apntype:%s,len:%d",ret,lynq_apn_table[ret].apnType,apnType,len); | 
|  | if(strncmp(lynq_apn_table[ret].apnType,apnType,len)==0) | 
|  | { | 
|  | return ret; | 
|  | } | 
|  | } | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | void updateApnTable(lynq_apn_t *apn_table,char apn[],char apntype[],char ifaceName[]) | 
|  | { | 
|  | LYDBGLOG("[updateApnTable] apn:%s,apntype:%s,ifaceName:%s",apn,apntype,ifaceName); | 
|  | if(apn_table==NULL) | 
|  | { | 
|  | LYERRLOG("apn_table is null"); | 
|  | return; | 
|  | } | 
|  | memcpy(apn_table->apn,apn,strlen(apn)+1); | 
|  | memcpy(apn_table->apnType,apntype,strlen(apntype)+1); | 
|  | memcpy(apn_table->ifaceName,ifaceName,strlen(ifaceName)+1); | 
|  | apn_table->hasTimeout = 0; | 
|  | apn_table->hasUsed = 1; | 
|  | return; | 
|  | } | 
|  |  | 
|  | void cleanOnceApnTable(int apnId) | 
|  | { | 
|  | LYDBGLOG("apn id:%d",apnId); | 
|  | if((apnId < 0) || (apnId > LYNQ_APN_CHANNEL_MAX-1)) | 
|  | { | 
|  | LYERRLOG("apn id is invalid!!!"); | 
|  | return; | 
|  | } | 
|  | lynq_apn_table[apnId].hasTimeout = 0; | 
|  | lynq_apn_table[apnId].hasUsed = 0; | 
|  | bzero(lynq_apn_table[apnId].apn,LYNQ_APN_MAX_LEN); | 
|  | //bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN); | 
|  | bzero(lynq_apn_table[apnId].ifaceName,LYNQ_IFACE_NAME_MAX_LEN); | 
|  | return; | 
|  | } | 
|  | int getUnusedElement() | 
|  | { | 
|  | if (lynq_apn_table == NULL) | 
|  | { | 
|  | LYERRLOG("get UnusedElemnt apn_table is null"); | 
|  | return -1; | 
|  | } | 
|  | for(int i=0;i < LYNQ_APN_CHANNEL_MAX; i++) | 
|  | { | 
|  | if(lynq_apn_table[i].hasUsed!=1) | 
|  | { | 
|  | return i; | 
|  | } | 
|  | } | 
|  | LYERRLOG("None of get unused Element"); | 
|  | return -1; | 
|  | } | 
|  | int updateApn(char apnType[]) | 
|  | { | 
|  | int ret = 0; | 
|  | ret = getUnusedElement(); | 
|  | memcpy(lynq_apn_table[ret].apnType,apnType,strlen(apnType)+1); | 
|  | lynq_apn_table[ret].hasUsed = 1; | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | int handleCheck(int handle) | 
|  | { | 
|  | if (lynq_apn_table[handle].hasUsed == 1) | 
|  | { | 
|  | return 0; | 
|  | } | 
|  | else | 
|  | { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  | int waitApnResult() | 
|  | { | 
|  | int ret = 0; | 
|  | LYINFLOG("start wait apn result!!!"); | 
|  | int sec = 0; | 
|  | int usec = 0; | 
|  | struct timeval now; | 
|  | struct timespec timeout; | 
|  | gettimeofday(&now, NULL); | 
|  | sec = 20000 / 1000; | 
|  | usec = 20000 % 1000; | 
|  | timeout.tv_sec = now.tv_sec + sec; | 
|  | timeout.tv_nsec = now.tv_usec * 1000 + usec * 1000000; | 
|  | pthread_mutex_lock(&s_lynq_apn_change_mutex); | 
|  | ret = pthread_cond_timedwait(&s_lynq_apn_change_cond, &s_lynq_apn_change_mutex, &timeout); | 
|  | pthread_mutex_unlock(&s_lynq_apn_change_mutex); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | void sendSignalApnChange() | 
|  | { | 
|  | LYINFLOG("start send Signal Apn Change"); | 
|  | pthread_mutex_lock(&s_lynq_apn_change_mutex); | 
|  | pthread_cond_signal(&s_lynq_apn_change_cond); | 
|  | pthread_mutex_unlock(&s_lynq_apn_change_mutex); | 
|  | return; | 
|  | } | 
|  |  | 
|  | int waitPdnChange() | 
|  | { | 
|  | int ret = 0; | 
|  | pthread_mutex_lock(&s_lynq_urc_vector_mutex); | 
|  | ret = pthread_cond_wait(&s_lynq_urc_vector_cond,&s_lynq_urc_vector_mutex); | 
|  | pthread_mutex_unlock(&s_lynq_urc_vector_mutex); | 
|  | return ret; | 
|  | } | 
|  | int waitDataCallstateChange(int mtime) | 
|  | { | 
|  | int ret = 0; | 
|  | int sec = 0; | 
|  | int usec = 0; | 
|  | struct timeval now; | 
|  | struct timespec timeout; | 
|  | gettimeofday(&now,NULL); | 
|  | sec = mtime/1000; | 
|  | usec = mtime%1000; | 
|  | timeout.tv_sec = now.tv_sec+sec; | 
|  | timeout.tv_nsec = now.tv_usec*1000+usec*1000000; | 
|  | pthread_mutex_lock(&s_data_call_state_change_mutex); | 
|  | ret = pthread_cond_timedwait(&s_data_call_state_change_cond,&s_data_call_state_change_mutex,&timeout); | 
|  | pthread_mutex_unlock(&s_data_call_state_change_mutex); | 
|  | return ret; | 
|  | } | 
|  | void sendSignalDataCallStateChange() | 
|  | { | 
|  | pthread_mutex_lock(&s_data_call_state_change_mutex); | 
|  | pthread_cond_signal(&s_data_call_state_change_cond); | 
|  | pthread_mutex_unlock(&s_data_call_state_change_mutex); | 
|  | return; | 
|  | } | 
|  | void sendSignalPdnChange() | 
|  | { | 
|  | pthread_mutex_lock(&s_lynq_urc_vector_mutex); | 
|  | pthread_cond_signal(&s_lynq_urc_vector_cond); | 
|  | pthread_mutex_unlock(&s_lynq_urc_vector_mutex); | 
|  | return; | 
|  | } | 
|  |  | 
|  | int get_response(int sockfd,Parcel &p) | 
|  | { | 
|  | int len = 0; | 
|  | char recvline[LYNQ_REC_BUF]; | 
|  | bzero(recvline,LYNQ_REC_BUF); | 
|  | /* receive data from server */ | 
|  | len = read(sockfd, recvline, LYNQ_REC_BUF); | 
|  | if(len == -1) | 
|  | { | 
|  | LYERRLOG("read error"); | 
|  | return -1; | 
|  | } | 
|  | if (recvline != NULL) { | 
|  | p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen); | 
|  | p.setDataPosition(0); | 
|  | } | 
|  | return 0; | 
|  | } | 
|  | int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error) | 
|  | { | 
|  | if(p.dataAvail() > 0) | 
|  | { | 
|  | p.readInt32(resp_type); | 
|  | p.readInt32(request); | 
|  | p.readInt32(slot_id); | 
|  | p.readInt32(error); | 
|  | return 0; | 
|  | } | 
|  | else | 
|  | { | 
|  | return -1; | 
|  | } | 
|  | } | 
|  | int send_request(int sockfd,lynq_client_t *client_tmp) | 
|  | { | 
|  | int ret=0; | 
|  | ret = write(sockfd, client_tmp, LYQN_SEDN_BUF); | 
|  | if(ret==-1) | 
|  | { | 
|  | perror("write error"); | 
|  | return -1; | 
|  | } | 
|  | return 0; | 
|  | } | 
|  | static char *strdupReadString(Parcel &p) { | 
|  | size_t stringlen; | 
|  | const char16_t *s16; | 
|  | s16 = p.readString16Inplace(&stringlen); | 
|  | return strndup16to8(s16, stringlen); | 
|  | } | 
|  | static char *strdupReadString_p(Parcel *p) { | 
|  | size_t stringlen; | 
|  | const char16_t *s16; | 
|  | s16 = p->readString16Inplace(&stringlen); | 
|  | return strndup16to8(s16, stringlen); | 
|  | } | 
|  |  | 
|  | /*Warren add for T800 platform 2021/11/19 start*/ | 
|  | int lynq_socket_client_start() | 
|  | { | 
|  | struct sockaddr_in lynq_data_socket_server_addr; | 
|  | /* init lynq_socket_server_addr */ | 
|  | bzero(&lynq_data_socket_server_addr, sizeof(lynq_data_socket_server_addr)); | 
|  | lynq_data_socket_server_addr.sin_family = AF_INET; | 
|  | lynq_data_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT); | 
|  | lynq_data_socket_server_addr.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS); | 
|  | /* | 
|  | if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0) | 
|  | { | 
|  | printf("[%s] is not a valid IPaddress\n", argv[1]); | 
|  | exit(1); | 
|  | } | 
|  | */ | 
|  | lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0); | 
|  | struct timeval timeOut; | 
|  |  | 
|  | timeOut.tv_sec = 30; | 
|  | timeOut.tv_usec = 0; | 
|  |  | 
|  | if (setsockopt(lynq_client_sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0) | 
|  | { | 
|  | LYERRLOG("time out setting failed"); | 
|  | } | 
|  | if(connect(lynq_client_sockfd, (struct sockaddr *)&lynq_data_socket_server_addr, sizeof(lynq_data_socket_server_addr)) == -1) | 
|  | { | 
|  | perror("connect error"); | 
|  | return -1; | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | bool is_support_urc(int urc_id) | 
|  | { | 
|  | switch(urc_id) | 
|  | { | 
|  | case LYNQ_URC_DATA_CALL_STATUS_IND: | 
|  |  | 
|  | case LYNQ_URC_MODIFY_APNDB: | 
|  | case LYNQ_URC_RESET_APNDB: | 
|  | return true; | 
|  | default: | 
|  | return false; | 
|  | } | 
|  | } | 
|  |  | 
|  | int printf_apn_table() | 
|  | { | 
|  | int ret = 0; | 
|  | if (lynq_apn_table == NULL) | 
|  | { | 
|  | LYERRLOG("apn table is null"); | 
|  | return -1; | 
|  | } | 
|  | for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++) | 
|  | { | 
|  | LYINFLOG("[%s][%d] apn=%s ;apntype=%s ;ifname=%s ;hasTimeout = %d ; hasUsed = %d",__FUNCTION__,ret, \ | 
|  | lynq_apn_table[ret].apn,lynq_apn_table[ret].apnType,lynq_apn_table[ret].ifaceName, \ | 
|  | lynq_apn_table[ret].hasTimeout,lynq_apn_table[ret].hasUsed); | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | void printf_apn_table_debug(const char *fun,int line) | 
|  | { | 
|  | LYINFLOG("[%s][%d]apn_table msg",fun,line); | 
|  | printf_apn_table(); | 
|  | } | 
|  |  | 
|  | void urc_msg_process(Parcel *p) | 
|  | { | 
|  | int len; | 
|  | int resp_type; | 
|  | int urcid; | 
|  | int slot_id; | 
|  | int check_count = 0; | 
|  |  | 
|  | int pdnState = 0; | 
|  | char apn[LYNQ_APN_MAX_LEN]; | 
|  | char apnType[LYNQ_APN_TYPE_MAX_LEN]; | 
|  | char ifaceName[LYNQ_IFACE_NAME_MAX_LEN]; | 
|  | char *urc_msg = NULL; | 
|  |  | 
|  | int size = p->dataSize(); | 
|  | p->readInt32(&resp_type); | 
|  | p->readInt32(&urcid); | 
|  | p->readInt32(&slot_id); | 
|  | LYINFLOG("data lib recv urc:resp_type=%d,urcid=%d,slot_id=%d,size=%d\n",resp_type,urcid,slot_id,size); | 
|  | switch(urcid) | 
|  | { | 
|  | case LYNQ_URC_DATA_CALL_STATUS_IND: | 
|  | p->readInt32(&pdnState); | 
|  | bzero(apn,LYNQ_APN_MAX_LEN); | 
|  | bzero(apnType,LYNQ_APN_TYPE_MAX_LEN); | 
|  | bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN); | 
|  | if(pdnState!=4)//PDN_DISCONNECTED | 
|  | { | 
|  | urc_msg = strdupReadString_p(p); | 
|  | int len = strlen(urc_msg); | 
|  | if((len < LYNQ_APN_MAX_LEN-1) && (len > 0)) | 
|  | { | 
|  | memcpy(apn,urc_msg,len+1); | 
|  | } | 
|  | free(urc_msg); | 
|  | urc_msg = strdupReadString_p(p); | 
|  | len = strlen(urc_msg); | 
|  | if((len < LYNQ_APN_TYPE_MAX_LEN-1) && (len > 0)) | 
|  | { | 
|  | memcpy(apnType,urc_msg,len+1); | 
|  | } | 
|  | free(urc_msg); | 
|  | urc_msg = strdupReadString_p(p); | 
|  | len = strlen(urc_msg); | 
|  | if((len < LYNQ_IFACE_NAME_MAX_LEN-1) && (len > 0)) | 
|  | { | 
|  | memcpy(ifaceName,urc_msg,strlen(urc_msg)+1); | 
|  | } | 
|  | free(urc_msg); | 
|  | //sendSignalDataCallStateChange(); | 
|  | int apnId = getLynqApnID(apnType); | 
|  | LYINFLOG("URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",apnType,ifaceName,apn,pdnState,apnId); | 
|  | if(apnId >= 0) | 
|  | { | 
|  | if(lynq_apn_table[apnId].hasTimeout==1) | 
|  | { | 
|  | /*whether timeout?,real or not,*/ | 
|  | printf_apn_table(); | 
|  | LYERRLOG("apn:%s has time out,deacive this apn",lynq_apn_table[apnId].apn); | 
|  | if (NULL != lynq_apn_table[apnId].apn && NULL != lynq_apn_table[apnId].apnType && strlen(lynq_apn_table[apnId].apn)>0) | 
|  | { | 
|  | LYERRLOG("deactive this time out APN"); | 
|  | lynq_deactive_data_call(&apnId); | 
|  | } | 
|  | else | 
|  | { | 
|  | /*if apn lose,update apn and deactive all apn*/ | 
|  | LYERRLOG("this table is invalid update APN table"); | 
|  | } | 
|  | break; | 
|  | } | 
|  | updateApnTable(&lynq_apn_table[apnId],apn,apnType,ifaceName); | 
|  | printf_apn_table_debug(__FUNCTION__,__LINE__); | 
|  | } | 
|  | /*To be completed*/ | 
|  | else | 
|  | { | 
|  | data_invaild_error = 1; | 
|  | printf_apn_table(); | 
|  | LYERRLOG("invalid apnId:%d",apnId); | 
|  | break; | 
|  | } | 
|  | pthread_mutex_lock(&s_lynq_urc_vector_mutex); | 
|  | s_data_urc_wait_list.push_back(apnId); | 
|  | pthread_mutex_unlock(&s_lynq_urc_vector_mutex); | 
|  | lynq_data_call_change_id = apnId; | 
|  | sendSignalPdnChange(); | 
|  | LYDBGLOG("data call state:%d",lynq_data_call); | 
|  | if(lynq_data_call==1) | 
|  | { | 
|  | while (data_timelimit == 0) | 
|  | { | 
|  | LYINFLOG("client not ready to wait"); | 
|  | for (check_count = 0;check_count < 500;check_count++) | 
|  | { | 
|  | /*wait 10ms*/ | 
|  | usleep(10*1000); | 
|  | } | 
|  | LYERRLOG("client still without res"); | 
|  | break; | 
|  | } | 
|  | sendSignalDataCallStateChange(); | 
|  | lynq_data_call = 0; | 
|  | data_timelimit = 0; | 
|  | } | 
|  | printf_apn_table_debug(__FUNCTION__,__LINE__); | 
|  | } | 
|  | else | 
|  | { | 
|  | urc_msg = strdupReadString_p(p); | 
|  | free(urc_msg); | 
|  | urc_msg = strdupReadString_p(p); | 
|  | len = strlen(urc_msg); | 
|  | if(len < LYNQ_APN_TYPE_MAX_LEN-1) | 
|  | { | 
|  | memcpy(apnType,urc_msg,len+1); | 
|  | } | 
|  | free(urc_msg); | 
|  | LYDBGLOG("[data thread_urc_recv] apntype:%s",apnType); | 
|  | int apnId = getLynqApnID(apnType); | 
|  | LYINFLOG("URC apnType:%s,ifaceName:%s,apn:%s pdnState:%d,handle:%d",apnType,ifaceName,apn,pdnState,apnId); | 
|  | if(apnId >= 0) | 
|  | { | 
|  | lynq_data_call_change_id = apnId; | 
|  | bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);//async clean | 
|  | pthread_mutex_lock(&s_lynq_urc_vector_mutex); | 
|  | s_data_urc_wait_list.push_back(apnId); | 
|  | pthread_mutex_unlock(&s_lynq_urc_vector_mutex); | 
|  | sendSignalPdnChange(); | 
|  | } | 
|  | LYDBGLOG("data call state:%d",lynq_data_call); | 
|  | if(lynq_data_call==1) | 
|  | { | 
|  | while (data_timelimit == 0) | 
|  | { | 
|  | LYINFLOG("client not ready to wait"); | 
|  | for (check_count = 0;check_count < 500;check_count++) | 
|  | { | 
|  | /*wait 10ms*/ | 
|  | usleep(10*1000); | 
|  | } | 
|  | LYERRLOG("client still without res"); | 
|  | break; | 
|  | } | 
|  | sendSignalDataCallStateChange(); | 
|  | lynq_data_call = 0; | 
|  | data_timelimit = 0; | 
|  | } | 
|  | printf_apn_table_debug(__FUNCTION__,__LINE__); | 
|  | } | 
|  | break; | 
|  | case LYNQ_URC_MODIFY_APNDB: | 
|  | urc_msg = strdupReadString_p(p); | 
|  | if (NULL == urc_msg) | 
|  | { | 
|  | LYERRLOG("error apn msg"); | 
|  | } | 
|  | else | 
|  | { | 
|  | bzero(g_lynq_apn_result, 1024); | 
|  | strcpy(g_lynq_apn_result, urc_msg); | 
|  | sendSignalApnChange(); | 
|  | } | 
|  | free(urc_msg); | 
|  | break; | 
|  | case LYNQ_URC_RESET_APNDB: | 
|  | { | 
|  | urc_msg = strdupReadString_p(p); | 
|  | if (NULL == urc_msg) | 
|  | { | 
|  | LYERRLOG("error apn msg"); | 
|  | } | 
|  | else | 
|  | { | 
|  | bzero(g_lynq_apn_result, 1024); | 
|  | strcpy(g_lynq_apn_result, urc_msg); | 
|  | sendSignalApnChange(); | 
|  | } | 
|  | free(urc_msg); | 
|  | } | 
|  | default: | 
|  | break; | 
|  | } | 
|  |  | 
|  | } | 
|  |  | 
|  | int create_urc_vector_signal_thread() | 
|  | { | 
|  | int ret; | 
|  | pthread_mutex_init(&s_lynq_urc_vector_mutex,NULL); | 
|  | pthread_mutex_lock(&s_lynq_urc_vector_mutex); | 
|  | s_data_urc_wait_list.clear(); | 
|  | pthread_mutex_unlock(&s_lynq_urc_vector_mutex); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int lynq_init_data(int uToken) | 
|  | { | 
|  | if (g_lynq_data_init_flag == 1) | 
|  | { | 
|  | LYERRLOG("init twice is not allowed"); | 
|  | return -1; | 
|  | } | 
|  | g_lynq_data_init_flag = 1; | 
|  | int result = 0; | 
|  | Global_uToken = uToken; | 
|  | LYLOGSET(LOG_INFO); | 
|  | LYLOGEINIT(USER_LOG_TAG); | 
|  | result = lynq_socket_client_start(); | 
|  | pthread_mutex_init(&g_lynq_data_sendto_mutex, NULL); | 
|  | if(result!=0) | 
|  | { | 
|  | LYERRLOG("init socket client fail!!!"); | 
|  | return -1; | 
|  | } | 
|  | result = lynq_init_data_urc_thread(); | 
|  | if(result!=0) | 
|  | { | 
|  | LYERRLOG("init socket urc fail!!!"); | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | result = create_urc_vector_signal_thread(); | 
|  | if(result!=0) | 
|  | { | 
|  | LYERRLOG("init socket urc fail!!!"); | 
|  | return -1; | 
|  | } | 
|  | memset(lynq_apn_table,0,sizeof(lynq_apn_table)); | 
|  | LYDBGLOG("lynq init call success!!!"); | 
|  | return 0; | 
|  |  | 
|  | } | 
|  | int lynq_deinit_data() | 
|  | { | 
|  | int ret = -1; | 
|  | if (g_lynq_data_init_flag == 0) | 
|  | { | 
|  | LYERRLOG("deinit twice is not allowed"); | 
|  | return ret; | 
|  | } | 
|  | g_lynq_data_init_flag = 0; | 
|  | for(int i =0;i<LYNQ_APN_CHANNEL_MAX;i++) | 
|  | { | 
|  | if(strlen(lynq_apn_table[i].apnType)!=0) | 
|  | { | 
|  | lynq_deactive_data_call(&i); | 
|  | } | 
|  | } | 
|  | if(lynq_client_sockfd>0) | 
|  | { | 
|  | close(lynq_client_sockfd); | 
|  | } | 
|  | ret = lynq_deinit_data_urc_thread(); | 
|  | if (ret != 0) | 
|  | { | 
|  | LYERRLOG("lynq_deinit_data_urc_thread fail"); | 
|  | return ret; | 
|  | } | 
|  | pthread_mutex_lock(&s_lynq_urc_vector_mutex); | 
|  | s_data_urc_wait_list.clear(); | 
|  | pthread_mutex_unlock(&s_lynq_urc_vector_mutex); | 
|  | return 0; | 
|  | } | 
|  | int lynq_setup_data_call(int *handle) | 
|  | { | 
|  | int error = -1; | 
|  | #ifdef GSW_RIL_CFG  //becuase gsw not have connman,data can not be triggered by connman. | 
|  | LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__); | 
|  | error = lynq_setup_data_call_sp(handle,NULL,"default",NULL,NULL,NULL,NULL,NULL); | 
|  | #else | 
|  | Parcel p; | 
|  | lynq_client_t client; | 
|  | int resp_type = -1; | 
|  | int request = -1; | 
|  | int slot_id = -1; | 
|  | int lynq_data_call_id = 0; | 
|  | if(handle==NULL) | 
|  | { | 
|  | LYERRLOG("handle is null!!!"); | 
|  | return LYNQ_E_NULL_ANONALY; | 
|  | } | 
|  | client.uToken = Global_uToken; | 
|  | client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL | 
|  | client.paramLen = 0; | 
|  | bzero(client.param,LYNQ_REQUEST_PARAM_BUF); | 
|  | LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param); | 
|  | lynq_data_call_id = updateApn("default"); | 
|  | if (lynq_data_call_id < 0) | 
|  | { | 
|  | LYERRLOG("update apn table fail error id = %d",lynq_data_call_id); | 
|  | return -1; | 
|  | } | 
|  | lynq_data_call = 1; | 
|  | pthread_mutex_lock(&g_lynq_data_sendto_mutex); | 
|  | if(send_request(lynq_client_sockfd,&client)==-1) | 
|  | { | 
|  | LYERRLOG("send request fail"); | 
|  | perror("[LYNQ_DATA] send request fail:"); | 
|  | return -1; | 
|  | } | 
|  | get_response(lynq_client_sockfd,p); | 
|  | pthread_mutex_unlock(&g_lynq_data_sendto_mutex); | 
|  | JumpHeader(p,&resp_type,&request,&slot_id,&error); | 
|  | LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error); | 
|  | if(error==0) | 
|  | { | 
|  | data_timelimit = 1; | 
|  | if (waitDataCallstateChange(60000) == ETIMEDOUT) // 60s | 
|  | { | 
|  | error = LYNQ_E_TIME_OUT; | 
|  | LYERRLOG("timeout:wait data Call state fail!!!"); | 
|  | lynq_apn_table[lynq_data_call_id].hasTimeout = 1; | 
|  | if (data_invaild_error == 1) | 
|  | { | 
|  | data_invaild_error = 0; | 
|  | LYERRLOG("urc apn info error!!!"); | 
|  | return 8085; | 
|  | } | 
|  | printf_apn_table_debug(__FUNCTION__,__LINE__); | 
|  | return error; | 
|  | } | 
|  | *handle = lynq_data_call_id; | 
|  | } | 
|  | printf_apn_table_debug(__FUNCTION__,__LINE__); | 
|  | #endif //GSW_RIL_CFG | 
|  | return error; | 
|  | } | 
|  |  | 
|  | int lynq_deactive_data_call(int *handle) | 
|  | { | 
|  | Parcel p; | 
|  | lynq_client_t client; | 
|  | int resp_type = -1; | 
|  | int request = -1; | 
|  | int slot_id = -1; | 
|  | int error = -1; | 
|  | int lynq_data_call_id = -1; | 
|  | int ret = 0; | 
|  | if(handle==NULL) | 
|  | { | 
|  | LYERRLOG("handle is null!!!"); | 
|  | return -1; | 
|  | } | 
|  | ret = handleCheck(*handle); | 
|  | if (ret != 0) | 
|  | { | 
|  | LYERRLOG("incomming handle is invalid"); | 
|  | return -1; | 
|  | } | 
|  | lynq_data_call_id = *handle; | 
|  | client.uToken = Global_uToken; | 
|  | client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL | 
|  | client.paramLen = 0; | 
|  | bzero(client.param,LYNQ_REQUEST_PARAM_BUF); | 
|  | #ifdef GSW_RIL_CFG | 
|  | client.paramLen = 1; | 
|  | sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType); | 
|  | #else | 
|  | if(strcmp(lynq_apn_table[lynq_data_call_id].apnType,"default")!=0) | 
|  | { | 
|  | client.paramLen = 1; | 
|  | sprintf(client.param,"%s",lynq_apn_table[lynq_data_call_id].apnType); | 
|  | } | 
|  | #endif //GSW_RIL_CFG | 
|  | LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param); | 
|  | pthread_mutex_lock(&g_lynq_data_sendto_mutex); | 
|  | if(send_request(lynq_client_sockfd,&client)==-1) | 
|  | { | 
|  | LYERRLOG("send request fail"); | 
|  | perror("[LYNQ_DATA] send request fail:"); | 
|  | return -1; | 
|  | } | 
|  | get_response(lynq_client_sockfd,p); | 
|  | pthread_mutex_unlock(&g_lynq_data_sendto_mutex); | 
|  | JumpHeader(p,&resp_type,&request,&slot_id,&error); | 
|  | LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error); | 
|  | cleanOnceApnTable(lynq_data_call_id); | 
|  | printf_apn_table_debug(__FUNCTION__,__LINE__); | 
|  | return error; | 
|  | } | 
|  | int lynq_setup_data_call_sp(int *handle,char *apn,char *apnType,char *user,char *password,char *authType,char *normalProtocol,char *roamingProtocol) | 
|  | { | 
|  | Parcel p; | 
|  | lynq_client_t client; | 
|  | int resp_type = -1; | 
|  | int request = -1; | 
|  | int slot_id = -1; | 
|  | int error = -1; | 
|  | int lynq_data_call_id = -1; | 
|  | char *argv[10] = {}; | 
|  | #ifdef GSW_RIL_CFG | 
|  | LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__); | 
|  | if(handle==NULL||apnType==NULL) | 
|  | { | 
|  | LYERRLOG("handle or apntype is null!!!"); | 
|  | return -1; | 
|  | } | 
|  | #else | 
|  | if(handle==NULL||apn==NULL||apnType==NULL) | 
|  | { | 
|  | LYERRLOG("handle ,apn or apntype is null!!!"); | 
|  | return -1; | 
|  | } | 
|  | #endif //GSW_RIL_CFG | 
|  | if(user==NULL) | 
|  | { | 
|  | argv[1] = "null"; | 
|  | } | 
|  | else | 
|  | { | 
|  | argv[1] = user; | 
|  | } | 
|  | if(password==NULL) | 
|  | { | 
|  | argv[2] = "null"; | 
|  | } | 
|  | else | 
|  | { | 
|  | argv[2] = password; | 
|  | } | 
|  | if(authType==NULL) | 
|  | { | 
|  | argv[3] = "null"; | 
|  | } | 
|  | else | 
|  | { | 
|  | argv[3] = authType; | 
|  | } | 
|  | if(normalProtocol==NULL) | 
|  | { | 
|  | argv[4] = "null"; | 
|  | } | 
|  | else | 
|  | { | 
|  | argv[4] = normalProtocol; | 
|  | } | 
|  | if(roamingProtocol==NULL) | 
|  | { | 
|  | argv[5] = "null"; | 
|  | } | 
|  | else | 
|  | { | 
|  | argv[5] = roamingProtocol; | 
|  | } | 
|  | client.uToken = Global_uToken; | 
|  | client.request = 27;//RIL_REQUEST_SETUP_DATA_CALL | 
|  | client.paramLen = 7; | 
|  | bzero(client.param,LYNQ_REQUEST_PARAM_BUF); | 
|  | #ifdef GSW_RIL_CFG | 
|  | if(NULL == apn) | 
|  | { | 
|  | sprintf(client.param,"null %s %s %s %s %s %s",apnType,argv[1],argv[2],argv[3],argv[4],argv[5]); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]); | 
|  | } | 
|  | #else | 
|  | sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]); | 
|  | #endif  //GSW_RIL_CFG | 
|  | LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param); | 
|  | lynq_data_call_id = updateApn(apnType); | 
|  | if (lynq_data_call_id < 0) | 
|  | { | 
|  | LYERRLOG("update apn table fail error id = %d",lynq_data_call_id); | 
|  | return -1; | 
|  | } | 
|  | lynq_data_call = 1; | 
|  | pthread_mutex_lock(&g_lynq_data_sendto_mutex); | 
|  | if(send_request(lynq_client_sockfd,&client)==-1) | 
|  | { | 
|  | LYERRLOG("send request fail"); | 
|  | perror("[LYNQ_DATA] send request fail:"); | 
|  | return -1; | 
|  | } | 
|  | get_response(lynq_client_sockfd,p); | 
|  | pthread_mutex_unlock(&g_lynq_data_sendto_mutex); | 
|  | JumpHeader(p,&resp_type,&request,&slot_id,&error); | 
|  | LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error); | 
|  | if(error==0) | 
|  | { | 
|  | data_timelimit = 1; | 
|  | if(waitDataCallstateChange(60000)==ETIMEDOUT)//60s | 
|  | { | 
|  | error = LYNQ_E_TIME_OUT; | 
|  | LYERRLOG("timeout:wait data Call state fail!!!"); | 
|  | lynq_apn_table[lynq_data_call_id].hasTimeout = 1; | 
|  | if (data_invaild_error == 1) | 
|  | { | 
|  | data_invaild_error = 0; | 
|  | LYERRLOG("urc apn info error!!!"); | 
|  | return 8085; | 
|  | } | 
|  | printf_apn_table_debug(__FUNCTION__,__LINE__); | 
|  | return error; | 
|  | } | 
|  | *handle = lynq_data_call_id; | 
|  | } | 
|  | printf_apn_table_debug(__FUNCTION__,__LINE__); | 
|  | return error; | 
|  | } | 
|  | /* | 
|  | int lynq_deactive_data_call_sp(int *handle,char *apnType) | 
|  | { | 
|  | Parcel p; | 
|  | lynq_client_t client; | 
|  | int resp_type = -1; | 
|  | int request = -1; | 
|  | int slot_id = -1; | 
|  | int error = -1; | 
|  | if(handle==NULL||apnType==NULL) | 
|  | { | 
|  | LYERRLOG("handle is null!!!"); | 
|  | return -1; | 
|  | } | 
|  | client.uToken = Global_uToken; | 
|  | client.request = 41;//RIL_REQUEST_DEACTIVATE_DATA_CALL | 
|  | client.paramLen = 1; | 
|  | bzero(client.param,LYNQ_REQUEST_PARAM_BUF); | 
|  | sprintf(client.param,"%s",apnType); | 
|  | LYERRLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param); | 
|  | if(send_request(lynq_client_sockfd,&client)==-1) | 
|  | { | 
|  | LYERRLOG("send request fail"); | 
|  | perror("[LYNQ_DATA] send request fail:"); | 
|  | return -1; | 
|  | } | 
|  | get_response(lynq_client_sockfd,p); | 
|  | JumpHeader(p,&resp_type,&request,&slot_id,&error); | 
|  | LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error); | 
|  | return error; | 
|  | } | 
|  | */ | 
|  | int getDataCallLists(lynq_data_call_response_v11_t dataCallList[LYNQ_APN_CHANNEL_MAX],int *realNum) | 
|  | { | 
|  | Parcel p; | 
|  | lynq_client_t client; | 
|  | int resp_type = -1; | 
|  | int token; | 
|  | int request = -1; | 
|  | int slot_id = -1; | 
|  | int error = -1; | 
|  | int version =0; | 
|  | int num = 0; | 
|  | char *temp_char = NULL; | 
|  | if(dataCallList==NULL) | 
|  | { | 
|  | LYERRLOG("dataCallList is null!!!"); | 
|  | return -1; | 
|  | } | 
|  | client.uToken = Global_uToken; | 
|  | client.request = 57;//RIL_REQUEST_DATA_CALL_LIST | 
|  | client.paramLen = 0; | 
|  | bzero(client.param,LYNQ_REQUEST_PARAM_BUF); | 
|  | LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param); | 
|  | pthread_mutex_lock(&g_lynq_data_sendto_mutex); | 
|  | if(send_request(lynq_client_sockfd,&client)==-1) | 
|  | { | 
|  | LYERRLOG("send request fail"); | 
|  | perror("[LYNQ_DATA] send request fail:"); | 
|  | return -1; | 
|  | } | 
|  | get_response(lynq_client_sockfd,p); | 
|  | pthread_mutex_unlock(&g_lynq_data_sendto_mutex); | 
|  | if(p.dataAvail() > 0) | 
|  | { | 
|  | p.readInt32(&resp_type); | 
|  | p.readInt32(&token); | 
|  | p.readInt32(&request); | 
|  | p.readInt32(&slot_id); | 
|  | p.readInt32(&error); | 
|  | } | 
|  | else | 
|  | { | 
|  | return -1; | 
|  | } | 
|  | LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error); | 
|  | p.readInt32(&version); | 
|  | if(version==11) | 
|  | { | 
|  | p.readInt32(&num); | 
|  | *realNum = num; | 
|  | for (int i = 0; i < num; i++) | 
|  | { | 
|  | p.readInt32(&dataCallList[i].status); | 
|  | p.readInt32(&dataCallList[i].suggestedRetryTime); | 
|  | p.readInt32(&dataCallList[i].cid); | 
|  | p.readInt32(&dataCallList[i].active); | 
|  | temp_char = strdupReadString(p); | 
|  | LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char); | 
|  | if(temp_char) | 
|  | { | 
|  | memcpy(dataCallList[i].type,temp_char,strlen(temp_char)+1); | 
|  | free(temp_char); | 
|  | } | 
|  | temp_char = strdupReadString(p); | 
|  | LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char); | 
|  | if(temp_char) | 
|  | { | 
|  | memcpy(dataCallList[i].ifname,temp_char,strlen(temp_char)+1); | 
|  | free(temp_char); | 
|  | } | 
|  | temp_char = strdupReadString(p); | 
|  | LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char); | 
|  | if(temp_char) | 
|  | { | 
|  | memcpy(dataCallList[i].addresses,temp_char,strlen(temp_char)+1); | 
|  | free(temp_char); | 
|  | } | 
|  | temp_char = strdupReadString(p); | 
|  | LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char); | 
|  | if(temp_char) | 
|  | { | 
|  | memcpy(dataCallList[i].dnses,temp_char,strlen(temp_char)+1); | 
|  | free(temp_char); | 
|  | } | 
|  | temp_char = strdupReadString(p); | 
|  | LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char); | 
|  | if(temp_char) | 
|  | { | 
|  | memcpy(dataCallList[i].gateways,temp_char,strlen(temp_char)+1); | 
|  | free(temp_char); | 
|  | } | 
|  | temp_char = strdupReadString(p); | 
|  | LYINFLOG("[%s][%d]%s",__FUNCTION__,__LINE__,temp_char); | 
|  | if(temp_char) | 
|  | { | 
|  | memcpy(dataCallList[i].pcscf,temp_char,strlen(temp_char)+1); | 
|  | free(temp_char); | 
|  | } | 
|  | p.readInt32(&dataCallList[i].mtu); | 
|  | } | 
|  | } | 
|  | return error; | 
|  | } | 
|  | int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t *dataCallList) | 
|  | { | 
|  | lynq_data_call_response_v11_t interDataCallList[LYNQ_APN_CHANNEL_MAX]={}; | 
|  | int number = 0; | 
|  | int lynq_data_call_id = 0; | 
|  | int error = 0; | 
|  | lynq_data_call_id = *handle; | 
|  | if(handle==NULL) | 
|  | { | 
|  | LYERRLOG("handle is NULL"); | 
|  | return LYNQ_E_NULL_ANONALY; | 
|  | } | 
|  | if (*handle<0 && handle>8) | 
|  | { | 
|  | LYERRLOG("handle value error"); | 
|  | } | 
|  | LYINFLOG("incoming handle value: %d",*handle); | 
|  | memset(interDataCallList,0,sizeof(interDataCallList)); | 
|  | error = getDataCallLists(interDataCallList,&number); | 
|  | if(error == 0) | 
|  | { | 
|  | for(int i = 0;i < number;i++) | 
|  | { | 
|  | if(strcmp(interDataCallList[i].ifname,lynq_apn_table[lynq_data_call_id].ifaceName)==0) | 
|  | { | 
|  | dataCallList->active = interDataCallList[i].active; | 
|  | dataCallList->suggestedRetryTime = interDataCallList[i].suggestedRetryTime; | 
|  | dataCallList->cid = interDataCallList[i].cid; | 
|  | dataCallList->status = interDataCallList[i].status; | 
|  | dataCallList->mtu = interDataCallList[i].mtu; | 
|  | memcpy(dataCallList->addresses,interDataCallList[i].addresses,sizeof(interDataCallList[i].addresses)); | 
|  | memcpy(dataCallList->ifname,interDataCallList[i].ifname,sizeof(interDataCallList[i].ifname)); | 
|  | memcpy(dataCallList->dnses,interDataCallList[i].dnses,sizeof(interDataCallList[i].dnses)); | 
|  | memcpy(dataCallList->type,interDataCallList[i].type,sizeof(interDataCallList[i].type)); | 
|  | memcpy(dataCallList->gateways,interDataCallList[i].gateways,sizeof(interDataCallList[i].gateways)); | 
|  | memcpy(dataCallList->pcscf,interDataCallList[i].pcscf,sizeof(interDataCallList[i].pcscf)); | 
|  | LYDBGLOG("ifname:%s,addr:%s",dataCallList->ifname,dataCallList->addresses); | 
|  | } | 
|  | } | 
|  | } | 
|  | return error; | 
|  | } | 
|  | int lynq_wait_data_call_state_change(int *handle) | 
|  | { | 
|  | if (data_waiting_status == 1) | 
|  | { | 
|  | LYDBGLOG("some thread is waiting"); | 
|  | return -3; | 
|  | } | 
|  | LYDBGLOG("is empty :%d",s_data_urc_wait_list.empty()); | 
|  | if (s_data_urc_wait_list.empty()) | 
|  | { | 
|  | LYDBGLOG("start wait"); | 
|  | data_waiting_status = 1; | 
|  | waitPdnChange(); | 
|  | } | 
|  | data_waiting_status = 0; | 
|  | std::vector<int>::iterator iter; | 
|  |  | 
|  | pthread_mutex_lock(&s_lynq_urc_vector_mutex); | 
|  | iter = s_data_urc_wait_list.begin(); | 
|  | if (iter != s_data_urc_wait_list.end()) | 
|  | { | 
|  | *handle = *iter; | 
|  | } | 
|  | s_data_urc_wait_list.erase(iter); | 
|  | pthread_mutex_unlock(&s_lynq_urc_vector_mutex); | 
|  |  | 
|  | LYINFLOG("lynq data call id:%d",*handle); | 
|  | return 0; | 
|  | } | 
|  | /*Warren add for T800 platform 2021/11/19 end*/ | 
|  |  | 
|  | /*Typethree add for T800 platform 2022/04/21 start*/ | 
|  |  | 
|  | int insert_apn_char(char *agc, char *id,char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier) | 
|  | { | 
|  | char strtmp[10][32]; | 
|  | if (id == NULL) | 
|  | { | 
|  | sprintf(strtmp[0], "id=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[0], "id=%s;", id); | 
|  | } | 
|  | if (mcc == NULL) | 
|  | { | 
|  | sprintf(strtmp[1], "mcc=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[1], "mcc=%s;", mcc); | 
|  | } | 
|  | if (mnc == NULL) | 
|  | { | 
|  | sprintf(strtmp[2], "mnc=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[2], "mnc=%s;", mnc); | 
|  | } | 
|  | if (apn == NULL) | 
|  | { | 
|  | sprintf(strtmp[3], "apn=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[3], "apn=%s;", apn); | 
|  | } | 
|  | if (apntype == NULL) | 
|  | { | 
|  | sprintf(strtmp[4], "apntype=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[4], "apntype=%s;", apntype); | 
|  | } | 
|  | if (user == NULL) | 
|  | { | 
|  | sprintf(strtmp[5], "user=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[5], "user=%s;", user); | 
|  | } | 
|  | if (password == NULL) | 
|  | { | 
|  | sprintf(strtmp[6], "password=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[6], "password=%s;", password); | 
|  | } | 
|  | if (normalprotocol == NULL) | 
|  | { | 
|  | sprintf(strtmp[7], "normalprotocol=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol); | 
|  | } | 
|  | if (roamingprotocol == NULL) | 
|  | { | 
|  | sprintf(strtmp[8], "roamingprotocol=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol); | 
|  | } | 
|  | if (carrier == NULL) | 
|  | { | 
|  | sprintf(strtmp[9], "carrier=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[9], "carrier=%s;", carrier); | 
|  | } | 
|  | sprintf(agc, "%s%s%s%s%s%s%s%s%s%s",strtmp[0], strtmp[1], strtmp[2], strtmp[3], strtmp[4], strtmp[5], strtmp[6], strtmp[7], strtmp[8], strtmp[9]); | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int modify_apn_char(char *agc, char *id, char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier) | 
|  | { | 
|  | char strtmp[10][32]; | 
|  | if (id == NULL) | 
|  | { | 
|  | sprintf(strtmp[0], "id=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[0], "id=%s;", id); | 
|  | } | 
|  | if (mcc == NULL) | 
|  | { | 
|  | sprintf(strtmp[1], "mcc=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[1], "mcc=%s;", mcc); | 
|  | } | 
|  | if (mnc == NULL) | 
|  | { | 
|  | sprintf(strtmp[2], "mnc=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[2], "mnc=%s;", mnc); | 
|  | } | 
|  | if (apn == NULL) | 
|  | { | 
|  | sprintf(strtmp[3], "apn=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[3], "apn=%s;", apn); | 
|  | } | 
|  | if (apntype == NULL) | 
|  | { | 
|  | sprintf(strtmp[4], "apntype=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[4], "apntype=%s;", apntype); | 
|  | } | 
|  | if (user == NULL) | 
|  | { | 
|  | sprintf(strtmp[5], "user=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[5], "user=%s;", user); | 
|  | } | 
|  | if (password == NULL) | 
|  | { | 
|  | sprintf(strtmp[6], "password=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[6], "password=%s;", password); | 
|  | } | 
|  | if (normalprotocol == NULL) | 
|  | { | 
|  | sprintf(strtmp[7], "normalprotocol=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol); | 
|  | } | 
|  | if (roamingprotocol == NULL) | 
|  | { | 
|  | sprintf(strtmp[8], "roamingprotocol=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol); | 
|  | } | 
|  | if (carrier == NULL) | 
|  | { | 
|  | sprintf(strtmp[9], "carrier=;"); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[9], "carrier=%s;", carrier); | 
|  | } | 
|  | sprintf(agc, "%s%s%s%s%s%s%s%s%s%s", strtmp[0], strtmp[1], strtmp[2], strtmp[3], strtmp[4], strtmp[5], strtmp[6], strtmp[7], strtmp[8], strtmp[9]); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  |  | 
|  | int query_apn_char(char *agc, char *id, char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier) | 
|  | { | 
|  | char strtmp[10][32]; | 
|  | if (id == NULL) | 
|  | { | 
|  | sprintf(strtmp[0], ""); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[0], "id=%s;", id); | 
|  | } | 
|  | if (mcc == NULL) | 
|  | { | 
|  | sprintf(strtmp[1], ""); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[1], "mcc=%s;", mcc); | 
|  | } | 
|  | if (mnc == NULL) | 
|  | { | 
|  | sprintf(strtmp[2], ""); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[2], "mnc=%s;", mnc); | 
|  | } | 
|  | if (apn == NULL) | 
|  | { | 
|  | sprintf(strtmp[3], ""); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[3], "apn=%s;", apn); | 
|  | } | 
|  | if (apntype == NULL) | 
|  | { | 
|  | sprintf(strtmp[4], ""); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[4], "apntype=%s;", apntype); | 
|  | } | 
|  | if (user == NULL) | 
|  | { | 
|  | sprintf(strtmp[5], ""); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[5], "user=%s;", user); | 
|  | } | 
|  | if (password == NULL) | 
|  | { | 
|  | sprintf(strtmp[6], ""); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[6], "password=%s;", password); | 
|  | } | 
|  | if (normalprotocol == NULL) | 
|  | { | 
|  | sprintf(strtmp[7], ""); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol); | 
|  | } | 
|  | if (roamingprotocol == NULL) | 
|  | { | 
|  | sprintf(strtmp[8], ""); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol); | 
|  | } | 
|  | if (carrier == NULL) | 
|  | { | 
|  | sprintf(strtmp[9], ""); | 
|  | } | 
|  | else | 
|  | { | 
|  | sprintf(strtmp[9], "carrier=%s;", carrier); | 
|  | } | 
|  | sprintf(agc, "%s%s%s%s%s%s%s%s%s%s", strtmp[0], strtmp[1], strtmp[2], strtmp[3], strtmp[4], strtmp[5], strtmp[6], strtmp[7], strtmp[8], strtmp[9]); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static char *lynqStrdupReadString(Parcel &p) | 
|  | { | 
|  | size_t stringlen; | 
|  | const char16_t *s16; | 
|  |  | 
|  | s16 = p.readString16Inplace(&stringlen); | 
|  | return strndup16to8(s16, stringlen); | 
|  | } | 
|  |  | 
|  | int lynq_modify_apn_db(const int cmd, char *id, char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier, char *out) | 
|  | { | 
|  | if (NULL == id && NULL == mcc && NULL == mnc && NULL == apn && NULL == apntype && NULL == user && NULL == password && NULL == normalprotocol && NULL == roamingprotocol && NULL == carrier) | 
|  | { | 
|  | LYERRLOG("There are no valid parameters"); | 
|  | return -1; | 
|  | } | 
|  | lynq_client_t client; | 
|  | char argc[512]; | 
|  | int res = 0; | 
|  | Parcel p; | 
|  | if (cmd == 0) // insert apn db | 
|  | { | 
|  | res = insert_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier); | 
|  |  | 
|  | client.uToken = Global_uToken; | 
|  | client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN | 
|  | client.paramLen = 2; | 
|  | bzero(client.param, LYNQ_REQUEST_PARAM_BUF); | 
|  | sprintf(client.param, "%d %s", cmd, argc); | 
|  | } | 
|  | else if (cmd == 1) //delete apn db | 
|  | { | 
|  | if (NULL == id) | 
|  | { | 
|  | LYERRLOG("id is NULL!!!please input id: "); | 
|  | } | 
|  | sprintf(argc, "id=%s", id); | 
|  | client.uToken = Global_uToken; | 
|  | client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN | 
|  | client.paramLen = 2; | 
|  | bzero(client.param, LYNQ_REQUEST_PARAM_BUF); | 
|  | sprintf(client.param, "%d %s", cmd, argc); | 
|  | } | 
|  | else if (cmd == 2) //query apn db | 
|  | { | 
|  | query_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier); | 
|  | client.uToken = Global_uToken; | 
|  | client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN | 
|  | client.paramLen = 2; | 
|  | bzero(client.param, LYNQ_REQUEST_PARAM_BUF); | 
|  | sprintf(client.param, "%d %s", cmd, argc); | 
|  | } | 
|  | else if (cmd == 3)  //modify apn db | 
|  | { | 
|  | modify_apn_char(argc, id, mcc, mnc, apn, apntype, user, password, normalprotocol, roamingprotocol, carrier); | 
|  | client.uToken = Global_uToken; | 
|  | client.request = 2000 + 193; // RIL_REQUEST_MODIFY_APN | 
|  | client.paramLen = 2; | 
|  | bzero(client.param, LYNQ_REQUEST_PARAM_BUF); | 
|  | sprintf(client.param, "%d %s", cmd, argc); | 
|  | } | 
|  | else | 
|  | { | 
|  | LYERRLOG("incoming command is invalid"); | 
|  | return -1; | 
|  | } | 
|  | LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param); | 
|  | pthread_mutex_lock(&g_lynq_data_sendto_mutex); | 
|  | if(send_request(lynq_client_sockfd,&client)==-1) | 
|  | { | 
|  | LYERRLOG("send request fail"); | 
|  | return -1; | 
|  | } | 
|  | pthread_mutex_unlock(&g_lynq_data_sendto_mutex); | 
|  | waitApnResult(); | 
|  | strcpy(out, g_lynq_apn_result); | 
|  | LYINFLOG(">>>>>output info:%s",out); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int lynq_reset_apn(char *result) | 
|  | { | 
|  | Parcel p; | 
|  | lynq_client_t client; | 
|  | if (NULL == result) | 
|  | { | 
|  | LYERRLOG("incoming paramters error"); | 
|  | } | 
|  | client.uToken = Global_uToken; | 
|  | client.request = 2000 + 194; | 
|  | client.paramLen = 0; | 
|  | bzero(client.param, LYNQ_REQUEST_PARAM_BUF); | 
|  | LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s", client.uToken, client.request, client.paramLen, client.param); | 
|  | pthread_mutex_lock(&g_lynq_data_sendto_mutex); | 
|  | if (send_request(lynq_client_sockfd, &client) == -1) | 
|  | { | 
|  | LYERRLOG("send request fail"); | 
|  | return -1; | 
|  | } | 
|  | pthread_mutex_unlock(&g_lynq_data_sendto_mutex); | 
|  | waitApnResult(); | 
|  | strcpy(result, g_lynq_apn_result); | 
|  | LYINFLOG(">>>>>result:%s",result); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | /*Typethree add for T800 platform 2022/04/21 end*/ |