[Bugfix][API-597][call] lib call\network wait service response Architecture Refactoring

Change-Id: I0ab6f59d468f3ec4ffebe01944fea3548977fc96
diff --git a/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h b/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
index f1cf502..b9efae9 100755
--- a/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
+++ b/src/lynq/lib/liblynq-call/include/libcall/lynq_call.h
@@ -8,6 +8,9 @@
    ( ( (alpha_char >= '0') && (alpha_char <= '9') ) ? 1 : 0 )

 #define LYNQ_CALL_MAX 10

 #define LYNQ_CALL_FAIL_VENDOR_CAUSE 64

+#define MAX_IP_LENGTH 128

+#define MAX_VLAN_INFO_LENGTH 128

+

 typedef enum {

     LYNQ_CALL_FAIL_UNOBTAINABLE_NUMBER = 1,

     LYNQ_CALL_FAIL_NORMAL = 16,

@@ -89,6 +92,8 @@
     LYNQ_ECALL_LLACK_RECEIVED = 3,

     LYNQ_ECALL_ALACK_POSITIVE_RECEIVED = 4,

     LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED = 5,

+    LYNQ_ECALL_DAILING = 9,

+    LYNQ_ECALL_ALERTING = 10,

     LYNQ_ECALL_ACTIVE = 11,

     LYNQ_ECALL_DISCONNECTED = 12,

     LYNQ_ECALL_IMS_ACTIVE = 13,

@@ -147,6 +152,8 @@
 int lynq_get_rtp_port(const LYNQ_Rtp_Mode rtp_mode, int* port);

 int lynq_get_rtp_param(int* clock_rate,int* channels, int* latency);//only for client

 /*Audio Path setting end*/

+

+void lynq_set_test_mode(const int test_mode);

 #ifdef __cplusplus

 }

 #endif

diff --git a/src/lynq/lib/liblynq-call/lynq_call.cpp b/src/lynq/lib/liblynq-call/lynq_call.cpp
index 0e46e6e..0270aa1 100755
--- a/src/lynq/lib/liblynq-call/lynq_call.cpp
+++ b/src/lynq/lib/liblynq-call/lynq_call.cpp
@@ -18,23 +18,23 @@
 #include <vendor-ril/telephony/mtk_ril_sp.h>

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

 #include "lynq_call.h"

+#include "lynq_module_common.h"

+#include "lynq_module_socket.h"

+#include "lynq_call_common.h"

 

-

-#define LYNQ_SERVICE_PORT 8088

-#define DSET_IP_ADDRESS  "127.0.0.1"

-#define LYNQ_URC_SERVICE_PORT 8086

-#define LYNQ_REC_BUF 8192

-#define LYNQ_REQUEST_PARAM_BUF 8192

-#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3

-#define INVALID_ID (-1)

-#define RTP_FROM_CMD "gst-launch-1.0 -v udpsrc port=%d caps=\'application/x-rtp, media=(string)audio, clock-rate=(int)%d, channels=(int)%d\' ! rtpjitterbuffer latency=%d ! rtppcmadepay ! alawdec ! audioresample ! audioconvert ! alsasink device=\'hw:0,2\'"

-#define RTP_TO_CMD   "gst-launch-1.0 -v alsasrc device=\'hw:0,6\' ! audioconvert ! audioresample ! alawenc ! rtppcmapay ! udpsink host=%s %s auto-multicast=true port=%d"

-#define RTP_VLAN_INFO_FORMAT "multicast-iface=\"%s\""

-#define MAX_IP_LENGTH 128

-#define MAX_VLAN_INFO_LENGTH 128

+#define CALL_OFF (0)

+#define CALL_ON  (1)

 #define USER_LOG_TAG "LYNQ_CALL"

 

 using ::android::Parcel;

+

+/**

+ * @brief mark call initialization state

+ * 0: deinit state

+ * 1: init state

+ */

+int g_module_init_flag = 0;

+

  typedef enum {

      LYNQ_CALL_ACTIVE = 0,

      LYNQ_CALL_HOLDING = 1,

@@ -47,12 +47,6 @@
      /*warren add for T800 platform 2022/04/26 end*/

 }lynq_call_state_t;

 

-typedef struct{

-    int uToken;

-    int request;

-    int paramLen;

-    char param[LYNQ_REQUEST_PARAM_BUF];

-}lynq_client_t;

 typedef struct

 {

     int used;

@@ -71,175 +65,28 @@
     char addr[LYNQ_PHONE_NUMBER_MAX];

 }lynq_call_list_t;

 

-lynq_call_list_e_t lynq_call_lists[LYNQ_CALL_MAX]={};

+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_get_call_list_mutex  = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_notice_get_call_list_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 pthread_mutex_t *s_urc_call_state_change_mutex = NULL;

-static pthread_cond_t *s_urc_call_state_change_cond = NULL;

+static int s_IncomingCallId = 0;

 static pthread_mutex_t s_incoming_call_mutex = PTHREAD_MUTEX_INITIALIZER;

 static pthread_cond_t s_incoming_call_cond = PTHREAD_COND_INITIALIZER;

-static pthread_mutex_t g_lynq_call_sendto_mutex;

-pthread_t lynq_call_urc_tid = -1;

-pthread_t lynq_call_list_loop_tid = -1;

 

-/*lei add*/

-/* socket文件描述符 */ 

-int len_addr_serv;

-struct sockaddr_in addr_serv;

-lynq_client_t client_t;

-int client_size = 0;

-/*lei add*/

+static int s_module_call_state =CALL_OFF;

+static int s_call_auto_answer = 0;

 

-int s_call_urc_event_complete = 0;

-

-enum{

-    CALL_OFF=0,

-    CALL_ON=1

-}call_state;

-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,

-     /*Invalid id anomaly*/

-    LYNQ_E_INVALID_ID_ANONALY=9002,

-#ifdef ECALL_SUPPORT

-    LYNQ_E_ECALL_BEING_RUNNING =9003,

-    LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,

-    LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,

-#endif

-}LYNQ_E;

 typedef enum{

     LYNQ_E_VOLUMN_SET_DTMF,

     LYNQ_E_VOLUMN_SET_SPEECH

-}LYNQ_E_VOLUMN_SET;   

+}LYNQ_E_VOLUMN_SET;  

 

-int lynq_call_state =CALL_OFF;

-int lynq_call_client_sockfd = 0;

-int Global_uToken_call = 0;

-int global_call_count =0;

-int global_call_auto_answer = 0;

-bool urc_call_recive_status = 1;

-bool call_list_loop = 0;

-int isDial = 0;

-int lynqIncomingCallId = 0;

-

-/*rtp begin*/

-typedef struct

-{   

-    char ip[MAX_IP_LENGTH];

-    int port;   

-    char vlan_info[MAX_VLAN_INFO_LENGTH];

-}lynq_rtp_server_info;

-

-typedef struct

-{       

-    int port;

-    int clockrate;  

-    int latency;

-    int channels;

-}lynq_rtp_client_info;

-

-static lynq_rtp_client_info g_rtp_client_info;

-static lynq_rtp_server_info g_rtp_server_info;

-

-static pthread_t g_rtp_thread[RTP_MODE_MAX];

-static bool g_rtp_thread_valid[RTP_MODE_MAX];

-

-/*rtp end*/

-

-#ifdef ECALL_SUPPORT

-int lynq_set_common_request(int request_id, int argc, const char* format,...);

-int g_ecallId = INVALID_ID;

-typedef enum{        

-    LYNQ_ECALL_TYPE_TEST = 0,     /* Test eCall */

-    LYNQ_ECALL_TYPE_RECONFIG = 1,    /*    Reconfiguration eCall */    

-    LYNQ_ECALL_MANUAL_EMERGENCY = 2,   /*Manual Emergency eCall */

-    LYNQ_ECALL_TYPE_AUTO_EMERGENCY = 3,   /* Automatic Emergency eCall */

-}LYNQ_ECall_Type;

-

-typedef enum{   

-    LYNQ_ECALL_DAILING_STATE_NONE =0,

-    LYNQ_ECALL_DAILING_STATE_STARTED = 1,    

-    LYNQ_ECALL_DAILING_STATE_ANSWERED = 2,      

-}LYNQ_ECall_Dailing_State;

-

-LYNQ_ECall_Dailing_State is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;

-char e_call_addr[LYNQ_ECALL_VAR_MAX][LYNQ_PHONE_NUMBER_MAX]={"test_ecall","emergency_ecall","reconf_ecall"};

-

-static pthread_mutex_t s_incoming_e_call_mutex = PTHREAD_MUTEX_INITIALIZER;

-static pthread_cond_t s_incoming_e_call_cond = PTHREAD_COND_INITIALIZER;

-static pthread_mutex_t s_ecall_variable_mutex = PTHREAD_MUTEX_INITIALIZER;

-

-LYNQ_ECall_Indication g_lynqIncomingEcallIndication;

-int g_lynqIncomingEcallId=INVALID_ID;

-LYNQ_ECall_Variant g_lynqEcallVariant=LYNQ_ECALL_VAR_NONE;

-int g_ecall_whether_preempt=0;

-

-void sendSignalIncomingECallEvent()

-{

-    LYINFLOG("send incoming ecall event signal");

-    pthread_mutex_lock(&s_incoming_e_call_mutex);

-    pthread_cond_signal(&s_incoming_e_call_cond);

-    pthread_mutex_unlock(&s_incoming_e_call_mutex);

-}

-

-int lynq_is_msd_suc(LYNQ_ECall_Indication lynqIncomingEcallIndication)

-{

-    if(LYNQ_ECALL_LLACK_RECEIVED == lynqIncomingEcallIndication ||

-       LYNQ_ECALL_ALACK_POSITIVE_RECEIVED == lynqIncomingEcallIndication ||

-       LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED == lynqIncomingEcallIndication ||

-     //LYNQ_ECALL_T5_TIMER_OUT  == lynqIncomingEcallIndication ||

-       LYNQ_ECALL_T6_TIMER_OUT  == lynqIncomingEcallIndication ||

-       LYNQ_ECALL_T7_TIMER_OUT  == lynqIncomingEcallIndication)

-    {

-           return 1;

-    }

-

-    return 0;

-}

-

-int lynq_ecall_is_running()

-{

-    return (is_ecall_dial!=LYNQ_ECALL_DAILING_STATE_NONE) || (g_ecallId !=INVALID_ID || g_lynqEcallVariant == LYNQ_ECALL_CALLBACK);

-}

-

-void print_ecall_info()

-{

-     LYERRLOG("%s is ecall dial is %d, ecall id is %d, ecall vairant is %d, incoming ecall ind is %d, incoming ecall id is %d, whether preempt is %d",__func__,is_ecall_dial,g_ecallId,g_lynqEcallVariant,g_lynqIncomingEcallIndication,g_lynqIncomingEcallId,g_ecall_whether_preempt);

-}

-

-int lynq_ecall_is_permit_in_call(int ecall_id)

-{

-    return g_lynqEcallVariant == LYNQ_ECALL_CALLBACK && (g_ecallId ==INVALID_ID || g_ecallId ==ecall_id);

-}

-

-int lynq_ecall_is_in_voice()

-{

-    return (is_ecall_dial==LYNQ_ECALL_DAILING_STATE_NONE) && (g_ecallId !=INVALID_ID);

-}

-#endif

-

-/**

- * @brief mark call initialization state

- * 0: deinit state

- * 1: init state

- */

-int g_lynq_call_init_flag = 0;

-

+#if 0

 int JumpHeader(Parcel &p,int *resp_type,int* token,int *request,int *slot_id,int *error)

 {

     if(p.dataAvail() > 0)

@@ -286,15 +133,91 @@
     }

     return 0;

 }

-static char *strdupReadString(Parcel &p) {

+#endif

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

     size_t stringlen;

     const char16_t *s16;

-    s16 = p.readString16Inplace(&stringlen);

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

     return strndup16to8(s16, stringlen);

 }

 

 int lynq_get_current_call_list(lynq_call_list_t call_list[LYNQ_CALL_MAX])

 {

+    Parcel* p=NULL;    

+    int ret=lynq_send_common_request(p,8,RIL_REQUEST_GET_CURRENT_CALLS,0,"");

+    if(ret!=0)

+    {

+        return ret;    

+    }        

+

+    int call_num = 0;

+    int temp = 0;

+    char *remote_phoneNum;

+    char *remote_name;

+    char uusData[128];

+

+    p->readInt32(&call_num);

+

+    if(call_num<=0)

+    {

+        s_module_call_state = CALL_OFF;

+        LYINFLOG("lynq_call_state:%d",s_module_call_state);

+        delete p; 

+        return RESULT_OK;

+    }

+    s_module_call_state = CALL_ON;

+    LYINFLOG("lynq_call_state:%d, call num is %d ",s_module_call_state,call_num);

+    for(int i = 0;i < call_num;i++)

+    {

+        p->readInt32(&temp);

+        call_list[i].call_state = temp;

+        p->readInt32(&call_list[i].call_id);

+        p->readInt32(&call_list[i].toa);

+        p->readInt32(&temp);

+        p->readInt32(&temp);

+        call_list[i].direction = temp;

+        p->readInt32(&temp);

+        p->readInt32(&temp);

+        p->readInt32(&temp);

+        remote_phoneNum = strdupReadString(p);

+        memcpy(call_list[i].addr,remote_phoneNum,strlen(remote_phoneNum));

+        if(remote_phoneNum !=NULL)

+        {

+            free(remote_phoneNum);

+        }

+        LYINFLOG("call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",call_list[i].call_id,call_list[i].call_state,

+        call_list[i].direction,call_list[i].addr,call_list[i].toa);

+        p->readInt32(&temp);

+        remote_name = strdupReadString(p);

+        if(remote_name !=NULL)

+        {

+            free(remote_name);

+        }

+        p->readInt32(&temp);

+        p->readInt32(&temp);

+        if(temp==0)

+        {

+            continue;

+        }

+        p->readInt32(&temp); /* UUS Information is present */

+        p->readInt32(&temp);

+        p->readInt32(&temp);

+        if(temp<=128)

+        {

+            p->read(uusData,temp);

+        }

+        else 

+        {

+            LYERRLOG("%s len %d is too great",__func__,temp);

+            delete p; 

+            return LYNQ_E_MALLOC_ERROR;

+        }

+    }

+

+    delete p; 

+    return RESULT_OK;   

+

+#if 0

     Parcel p;

     lynq_client_t client;

     int resp_type = -1;

@@ -360,40 +283,40 @@
             p.readInt32(&temp);

             p.readInt32(&temp);

             p.read(uusData,temp);

-            free(remote_phoneNum);

-            free(remote_name);

         }

     }

     return 0;

+#endif

 }

 

 void cleanCallList(int lynq_call_id)

 {

-    LYINFLOG("cleanCall local idx is %d, id is %d",lynq_call_id,lynq_call_lists[lynq_call_id].call_id);

-    lynq_call_lists[lynq_call_id].call_id = 0;

-    lynq_call_lists[lynq_call_id].call_state = (int)LYNQ_CALL_END;

-    lynq_call_lists[lynq_call_id].toa = 0;

-    lynq_call_lists[lynq_call_id].direction = 0;

-    lynq_call_lists[lynq_call_id].used = 0;

-    memset(lynq_call_lists[lynq_call_id].addr,0,sizeof(lynq_call_lists[lynq_call_id].addr));

+    LYINFLOG("cleanCall local idx is %d, id is %d",lynq_call_id,s_call_lists[lynq_call_id].call_id);

+    s_call_lists[lynq_call_id].call_id = 0;

+    s_call_lists[lynq_call_id].call_state = (int)LYNQ_CALL_END;

+    s_call_lists[lynq_call_id].toa = 0;

+    s_call_lists[lynq_call_id].direction = 0;

+    s_call_lists[lynq_call_id].used = 0;

+    memset(s_call_lists[lynq_call_id].addr,0,sizeof(s_call_lists[lynq_call_id].addr));

 }

 int getUnusedElement()

 {

     for(int i=0;i < LYNQ_CALL_MAX; i++)

     {

-        if(lynq_call_lists[i].used!=1)

+        if(s_call_lists[i].used!=1)

         {

             return i;

         }

     }

-    return -1;

+    return INVALID_ID;

 }

-int addAddr(char addr[])

+int addAddr(char addr[], int call_id)

 {

     int ret = 0;

     ret = getUnusedElement();

-    memcpy(lynq_call_lists[ret].addr,addr,strlen(addr)+1);

-    lynq_call_lists[ret].used = 1;

+    memcpy(s_call_lists[ret].addr,addr,strlen(addr)+1);

+    s_call_lists[ret].call_id=call_id;

+    s_call_lists[ret].used = 1;

     LYINFLOG("add local idx is %d addr is %s",ret,addr);

     return ret;

 }

@@ -406,24 +329,6 @@
     callList->direction = direction;   

     return;

 }

-int waitCallstateChange(int mtime)

-{

-    LYINFLOG("wait Call state Change");

-    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(&call_state_change_mutex);

-    ret = pthread_cond_timedwait(&call_state_change_cond,&call_state_change_mutex,&timeout);

-    pthread_mutex_unlock(&call_state_change_mutex);

-    return ret;

-}

 int waitIncomingCall()

 {

     LYINFLOG("wait incming call");

@@ -437,35 +342,35 @@
 {

     for(int i = 0;i<LYNQ_CALL_MAX;i++)

     {

-        if(strcmp(lynq_call_lists[i].addr,addr)==0)

+        if(strcmp(s_call_lists[i].addr,addr)==0)

         {

-            LYINFLOG("checkHasCall addr is %s idx is %d id is %d",addr,i,lynq_call_lists[i].call_id);

-            return 1;

+            LYINFLOG("checkHasCall addr is %s idx is %d id is %d",addr,i,s_call_lists[i].call_id);

+            return true;

         }

     }

     LYINFLOG("checkHasCall addr is %s , no idx is found",addr);

-    return 0;

+    return false;

 }

 int find_call_id_with_addr(char *addr)

 {

     for(int id = 0; id < LYNQ_CALL_MAX; id++)

     {

-        if(lynq_call_lists[id].used && (strcmp(lynq_call_lists[id].addr,addr) == 0))

+        if(s_call_lists[id].used && (strcmp(s_call_lists[id].addr,addr) == 0))

         {

-            LYINFLOG("find addr  %s in local list, local idx is %d id is %d",addr,id,lynq_call_lists[id].call_id);

+            LYINFLOG("find addr  %s in local list, local idx is %d id is %d",addr,id,s_call_lists[id].call_id);

             return id;

         }

     }

     LYINFLOG("find addr  %s in local list , not found",addr);

-    return -1;

+    return INVALID_ID;

 }

 int find_call_id_with_call_id(int call_id)

 {

     for(int id = 0; id < LYNQ_CALL_MAX; id++)

     {

-        if(lynq_call_lists[id].used && (lynq_call_lists[id].call_id == call_id))

+        if(s_call_lists[id].used && (s_call_lists[id].call_id == call_id))

         {

-            LYINFLOG("find id  %d in local list, local idx is %d, addr is %s",call_id,id,lynq_call_lists[id].addr);

+            LYINFLOG("find id  %d in local list, local idx is %d, addr is %s",call_id,id,s_call_lists[id].addr);

             return id;

         }

     }

@@ -487,17 +392,10 @@
     pthread_mutex_unlock(&s_incoming_call_mutex);

 }

 

-void addCallListToLynqCallList(lynq_call_list_e_t *callList,    int call_id,int call_state,int toa,int direction,char addr[LYNQ_PHONE_NUMBER_MAX])

+void cleanup_call_list_mutex(void *arg)

 {

-    callList->call_id = call_id;

-    callList->call_state = call_state;

-    callList->toa = toa;

-    callList->direction = direction;

-    memcpy(callList->addr,addr,strlen(addr)+1);

-    callList->used = 1;

-    return;

+    pthread_mutex_unlock(&s_notice_get_call_list_mutex);

 }

-

 void *triggerGetCallList(void *parg)

 {

     int ret=0;

@@ -509,18 +407,18 @@
 #ifdef ECALL_SUPPORT

     int handupIncomingMT=0;

 #endif

-    

-    while(call_list_loop)

+    pthread_mutex_lock(&s_notice_get_call_list_mutex);

+    pthread_cleanup_push(cleanup_call_list_mutex, NULL); // thread cleanup handler

+    while(s_call_list_loop)

     {

-        update=0;

-        pthread_mutex_lock(s_urc_call_state_change_mutex);

-        pthread_cond_wait(s_urc_call_state_change_cond, s_urc_call_state_change_mutex);

+        update=0;       

+        pthread_cond_wait(&s_notice_get_call_list_cond, &s_notice_get_call_list_mutex);

         LYDBGLOG("triggerGetCallList event!!!");

         memset(call_list,0,sizeof(call_list));

         ret = lynq_get_current_call_list(call_list);

-        if(ret != 0)

+        if(ret != RESULT_OK)

         {

-            LYDBGLOG("get current call list failure!!!");

+            LYDBGLOG("get current call list failure!!!");          

             continue;

         }

         LYINFLOG("++++++++++++++triggerGetCallList++++++++++++++");

@@ -528,28 +426,28 @@
         cnt=0;

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

         {

-            if(lynq_call_lists[i].used ==0)

+            if(s_call_lists[i].used ==0)

             {

                 continue;

             }

             cnt++;

-            LYINFLOG("local idx is %d id is %d addr is %s state is %d direction is %d",i,lynq_call_lists[i].call_id,lynq_call_lists[i].addr,lynq_call_lists[i].call_state,lynq_call_lists[i].direction);

+            LYINFLOG("local idx is %d id is %d addr is %s state is %d direction is %d",i,s_call_lists[i].call_id,s_call_lists[i].addr,s_call_lists[i].call_state,s_call_lists[i].direction);

             

-            if(lynq_call_lists[i].call_id > 0)

+            if(s_call_lists[i].call_id > 0)

             {

                 call_end = 0;

                 for(n = 0; n < LYNQ_CALL_MAX; n++)

                 {

-                    if(call_list[n].call_id == lynq_call_lists[i].call_id)

+                    if(call_list[n].call_id == s_call_lists[i].call_id)

                     {

                         call_end = 1;

-                        LYINFLOG("find lynq call local idx %d, service idx %d  id is %d!!!",i,n,lynq_call_lists[i].call_id);

+                        LYINFLOG("find lynq call local idx %d, service idx %d  id is %d!!!",i,n,s_call_lists[i].call_id);

                         break;

                     }

                 }

                 if(call_end == 0)

                 {

-                    LYINFLOG("MT hungup,then clean call info local idx is %d id is %d",i, lynq_call_lists[i].call_id);

+                    LYINFLOG("MT hungup,then clean call info local idx is %d id is %d",i, s_call_lists[i].call_id);

                     cleanCallList(i);                   

                 }

             } //fix bug API-54

@@ -581,10 +479,7 @@
 #ifdef ECALL_SUPPORT

                 if((call_list[i].call_state ==4) || (call_list[i].call_state ==5))

                 {

-

-                    pthread_mutex_lock(&s_ecall_variable_mutex);

-                    handupIncomingMT=lynq_ecall_is_running() && (lynq_ecall_is_permit_in_call(call_list[i].call_id)==false);   

-                    pthread_mutex_unlock(&s_ecall_variable_mutex);  

+                    handupIncomingMT=Is_handup_IncomingMT(call_list[i].call_id);                        

                     LYINFLOG("handupIncomingMT is %d",handupIncomingMT);

                     if(handupIncomingMT)

                     {

@@ -597,12 +492,12 @@
                 n = find_call_id_with_addr(call_list[i].addr);

                 if(n ==INVALID_ID)

                 {

-                    n = addAddr(call_list[i].addr);

-                    updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);

-                    lynqIncomingCallId = call_list[i].call_id;

+                    n = addAddr(call_list[i].addr,call_list[i].call_id);

+                    updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);

+                    s_IncomingCallId = call_list[i].call_id;

                     sendSignalIncomingCall();

                 }

-                else if(lynq_call_lists[n].call_state == call_list[i].call_state)

+                else if(s_call_lists[n].call_state == call_list[i].call_state)

                 {

                     LYINFLOG("state not changed, state is %d ",call_list[i].call_state);

                     if(call_list[i].call_state ==4 || call_list[i].call_state ==5)

@@ -617,9 +512,9 @@
                 }

                 else 

                 {

-                    LYINFLOG("state changed from %d to %d",lynq_call_lists[n].call_state,call_list[i].call_state);

+                    LYINFLOG("state changed from %d to %d",s_call_lists[n].call_state,call_list[i].call_state);

                     

-                    updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);

+                    updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);

                 }                               

             }

             else

@@ -628,15 +523,15 @@
                 call_end = 0;

                 for(n = 0 ; n < LYNQ_CALL_MAX; n++)

                 {

-                    if(lynq_call_lists[n].used && ((strcmp(call_list[i].addr,lynq_call_lists[n].addr)==0)||(call_list[i].call_id==lynq_call_lists[n].call_id)))

+                    if(s_call_lists[n].used && ((strcmp(call_list[i].addr,s_call_lists[n].addr)==0)||(call_list[i].call_id==s_call_lists[n].call_id)))

                     {

-                        if(lynq_call_lists[n].call_id==0)

+                        if(s_call_lists[n].call_id==0)

                         {

                              LYINFLOG("add a call id");

                              update=1;

                         }

-                        LYINFLOG("local idx %d updated, original call id is %d origial addr is %s original state is %d",n,lynq_call_lists[n].call_id,lynq_call_lists[n].addr,lynq_call_lists[n].call_state);                    

-                        updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);

+                        LYINFLOG("local idx %d updated, original call id is %d origial addr is %s original state is %d",n,s_call_lists[n].call_id,s_call_lists[n].addr,s_call_lists[n].call_state);                    

+                        updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);

                         call_end = 1;

                         break;

                     }                    

@@ -646,7 +541,7 @@
                 {  

                     LYINFLOG("need to hangup id %d", call_list[i].call_id);

 #ifdef ECALL_SUPPORT

-                    if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)

+                    if(IsECallDialing())

                     {

                         LYINFLOG("ecall is dialing, for the timebeing, don't huangup");

                         continue;

@@ -658,16 +553,15 @@
             }

             LYDBGLOG("servie idx %d end",i);

         }

-        LYINFLOG("add or update local index end ");

-        s_call_urc_event_complete = 1;

-        if(isDial==1)

+        LYINFLOG("add or update local index end ");       

+        if(s_module_isDial==1)

         {

             LYINFLOG("now is dialing");

             if(update==1)

             {

                 LYINFLOG("find added call");

                 sendSignalToWaitCallStateChange();

-                isDial = 0;

+                s_module_isDial = 0;

             }    

             else

             {

@@ -677,24 +571,22 @@
         else 

         {

             LYINFLOG("now is not dialing");

-        }

-        pthread_mutex_unlock(s_urc_call_state_change_mutex);

+        }        

     }

+    pthread_cleanup_pop(0);

+    pthread_mutex_unlock(&s_notice_get_call_list_mutex);

     return NULL;

 }

 

-void lynqRespWatingEvent()

+void lynqNoticeGetModuleCallList()

 {

-    if(s_call_urc_event_complete==1)

-    {

-        pthread_mutex_lock(s_urc_call_state_change_mutex);

-        pthread_cond_signal(s_urc_call_state_change_cond);

-        s_call_urc_event_complete = 0;

-        pthread_mutex_unlock(s_urc_call_state_change_mutex);

-    }

-    return;

+    pthread_mutex_lock(&s_notice_get_call_list_mutex);

+    pthread_cond_signal(&s_notice_get_call_list_cond);

+    pthread_mutex_unlock(&s_notice_get_call_list_mutex);

+    

 }

 

+#if 0

 /*Warren add for T800 platform 2021/11/19 start*/

 int lynq_socket_client_start()

 {   

@@ -741,236 +633,7 @@
     len_addr_serv = sizeof(addr_serv);  

     return 0;

 }

-int lynq_update_call_list_loop()

-{

-    int ret = 0;

-    pthread_attr_t attr;

-    pthread_attr_init(&attr);

-    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

-    ret = pthread_create(&lynq_call_list_loop_tid,&attr,triggerGetCallList,NULL);

-    if(ret < 0)

-    {

-        LYERRLOG("lynq_update_call_list_loop fail!!!");

-        return -1;

-    }

-    LYDBGLOG("lynq_update_call_list_loop success!!!");

-    return 0;

 

-}

-

-void *thread_urc_recv(void *parg)

-{

-    int socket_fd = (int64_t)parg;

-    int len=0;

-    socklen_t addr_len=0;

-    uint8_t *dataLength = NULL;

-    char urc_data[LYNQ_REC_BUF];

-    int slot_id = -1;

-    int resp_type = -1;

-    int urcid = -1;

-    Parcel *p = NULL;

-    struct sockaddr_in dest_addr;

-#ifdef ECALL_SUPPORT

-    int ecall_ind;

-    int ecallId;

-    int unused_callid;

-    int send_signal_to_wait_call_state;

-    int handup_ecall_id;

-#endif

-

-    LYINFLOG("thread_urc_recv in running....");

-    while(urc_call_recive_status)

-    {

-        bzero(urc_data,LYNQ_REC_BUF);

-        //get data msg

-        len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);

-        if(len <= 0)

-        {

-            LYERRLOG("thread_urc_recv step2 fail");

-            break;

-        }

-        LYDBGLOG("=====>urc data len<=====:%d",len);

-        p = new Parcel();

-        if(p==NULL)

-        {

-            LYERRLOG("new parcel failure!!!");

-            break;

-        }

-        p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);

-        p->setDataPosition(0);

-        if(p->dataAvail() > 0)

-        {

-            p->readInt32(&resp_type);

-            p->readInt32(&urcid);

-            p->readInt32(&slot_id);

-            //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);

-            switch (urcid)

-            {

-                case 1001://RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED

-                {

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

-                    lynqRespWatingEvent();

-                    break;

-                }

-                case 1018://RIL_UNSOL_CALL_RING

-                {

-                    if(global_call_auto_answer==1)

-                    {

-                        lynq_call_answer();

-                    }

-                    break;

-                }

-                case 1029://RIL_UNSOL_RINGBACK_TONE

-                case 3049://RIL_UNSOL_CALL_INFO_INDICATION

-                {

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

-                    break;

-                }

-#ifdef ECALL_SUPPORT

-                case RIL_UNSOL_ECALL_INDICATIONS:

-                {

-                    pthread_mutex_lock(&s_ecall_variable_mutex);

-		            send_signal_to_wait_call_state = false;

-                    handup_ecall_id=false;

-                    p->readInt32(&ecall_ind);   

-                    g_lynqIncomingEcallIndication = ecall_ind;

-                    p->readInt32(&ecallId);

-                    g_lynqIncomingEcallId = ecallId;

-                    LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS ,Id %d, ind %d, ecall dialing is %d, normal dialing is %d, local ecall id is %d",ecallId,ecall_ind,is_ecall_dial,isDial,g_ecallId);

-                    switch (g_lynqIncomingEcallIndication) 

-                    {

-                       case LYNQ_ECALL_ACTIVE:

-                            if(is_ecall_dial)

-                            {

-                                is_ecall_dial = LYNQ_ECALL_DAILING_STATE_ANSWERED;

-                            }

-                            break;

-                       case LYNQ_ECALL_SENDING_START:

-                            if(lynq_ecall_is_in_voice())

-                            {

-                                LYINFLOG("recv msd in voice, ind is changed to %d",LYNQ_ECALL_SENDING_START_IN_VOICE);

-                                g_lynqIncomingEcallIndication = LYNQ_ECALL_SENDING_START_IN_VOICE; 

-                            }

-                            break;

-                       case LYNQ_ECALL_LLACK_RECEIVED:

-                       case LYNQ_ECALL_ALACK_POSITIVE_RECEIVED:

-                       case LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED:

-                       //case LYNQ_ECALL_T5_TIMER_OUT:  /*when Certificate CP 1.1.10.2, no msd start (ind 1), so T5 timeout is not regard as success*/

-                       case LYNQ_ECALL_T6_TIMER_OUT:

-                       case LYNQ_ECALL_T7_TIMER_OUT:                          

-                           if(is_ecall_dial)

-                           {

-                               LYINFLOG("ecall is dialing, recv suc indication");

-                               is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;

-                               if(ecallId >0 && find_call_id_with_call_id(ecallId)==INVALID_ID)

-                               {

-                                     LYINFLOG("add ecall in loacl list");

-                                     g_ecallId = ecallId;

-                                     unused_callid=addAddr("ecall");

-                                     lynq_call_lists[unused_callid].call_id=g_ecallId;

-                               } 

-                               send_signal_to_wait_call_state=true;                             

-                           }        

-                           else if(ecallId >0 && (find_call_id_with_call_id(ecallId)==INVALID_ID) &&  (g_lynqEcallVariant != LYNQ_ECALL_CALLBACK))

-                           {

-                               LYERRLOG("ecall is not in dialing and first recv suc indication, hangup");

-                               handup_ecall_id=true;

-                           }   

-                           else 

-                           {

-                               LYERRLOG("ecall is not in dialing and not first recv suc indication");

-                           }

-                           break;

-                       case LYNQ_ECALL_PSAP_CALLBACK_START:                            

-                           if(lynq_ecall_is_running()==0)

-                           {

-                               if(ecallId>0)

-                               {                                

-                                   LYINFLOG("ecall is not running, recv psap call back msd start, set ecall running");

-                                   g_lynqEcallVariant = LYNQ_ECALL_CALLBACK;

-                                   g_ecallId = ecallId;

-                                   if(isDial)

-                                   {

-                                       LYINFLOG("stop normal dial");

-                                       send_signal_to_wait_call_state=true;                               

-                                   }

-                                   else 

-                                   {

-                                       LYINFLOG("no normal dial");

-                                   }  

-                               }

-                               else 

-                               {

-                                   LYERRLOG("ecallId is abnormal in psap callback");

-                               }

-                           }                           

-                           else 

-                           {

-                               LYERRLOG("ecall is running, recv psap call back msd start");

-                           }

-                           break;                       

-                       case LYNQ_ECALL_ABNORMAL_HANGUP:

-                           if(is_ecall_dial == LYNQ_ECALL_DAILING_STATE_NONE)                             

-                           {

-                               LYERRLOG("ecall is not in dialing , recv abnormal hangup");

-                               g_ecallId = INVALID_ID;

-                           }

-                           else if (is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)

-                           {

-                               LYERRLOG("ecall is in dialing state, recv no answer, recv abnormal hangup, dont' redial");

-                               g_ecallId = INVALID_ID;

-                               send_signal_to_wait_call_state=true;                                                    

-                           }    

-                           else {

-                               LYINFLOG("ecall is in dialing and recv answer, recv abnormal hangup");

-                           }

-                           break;

-                       case LYNQ_ECALL_DISCONNECTED:

-                       case LYNQ_ECALL_REDIAL_TIMER_OUT:

-                       case LYNQ_ECALL_T2_TIMER_OUT :

-                       case LYNQ_ECALL_IMS_DISCONNECTED:                           

-                           g_ecallId = INVALID_ID;

-                           if(g_lynqEcallVariant == LYNQ_ECALL_CALLBACK)

-                           {

-                               g_lynqEcallVariant = LYNQ_ECALL_VAR_NONE; /*other type, needn't re-initialize*/

-                           }

-                           if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)

-                           {

-                               LYERRLOG("ecall is in dialing, recv like disconnect indication");

-                               is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;                         

-                               send_signal_to_wait_call_state=true;                               

-                           }

-                           else 

-                           {

-                               LYINFLOG("ecall is not in dialing, recv like disconnect indication");

-                           }

-                           break;

-                       default:                          

-                           LYINFLOG("not special indication");

-                    }                         

-                    pthread_mutex_unlock(&s_ecall_variable_mutex);

-                    if(send_signal_to_wait_call_state)

-                    {

-                        sendSignalToWaitCallStateChange();

-                    }                    

-                    sendSignalIncomingECallEvent();

-                    if(handup_ecall_id)

-                    {

-                        lynq_call_hungup(&ecallId);

-                    }

-                    LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS, local ecall id is %d", g_ecallId);

-                    break;

-                 }

-#endif

-                default:

-                    break;

-            }

-        }

-        delete p;

-        p = NULL;

-    }

-    close(socket_fd);

-}

 int lynq_socket_urc_start()

 {

     int socket_fd=0;

@@ -1012,131 +675,134 @@
     LYDBGLOG("urc loop success!!!");

     return 0;

 }

-int getSelfElement(char addr[])

-{

-    for(int i=0;i < LYNQ_CALL_MAX; i++)

-    {

-        if(lynq_call_lists[i].used==1)

-        {

-            if(strcmp(lynq_call_lists[i].addr,addr)==0)

-            {

-                return i;

-            }

-            

-        }

-    }

-    return -1;

-}

+#endif

 

 void lynq_call_state_change_test(int soc_id)

 {

     LYDBGLOG("call state change,sim:%d",soc_id);

 }

 

-void lynq_init_rtp()

-{   

-    memset(&g_rtp_client_info,0,sizeof(g_rtp_client_info));

-    memset(&g_rtp_server_info,0,sizeof(g_rtp_server_info));    

-  

+int lynq_start_call_list_loop()

+{

+#if 0

+    int ret = 0;

+    pthread_attr_t attr;

+    pthread_attr_init(&attr);

+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

 

-    lynq_set_rtp_param(8000,1,400);

+    s_notice_get_call_list_mutex = new pthread_mutex_t;

+    pthread_mutex_init(s_notice_get_call_list_mutex, NULL);

+    s_notice_get_call_list_cond = new pthread_cond_t;

+    LYINFLOG("liulei s_notice_get_call_list_mutex\n");

+    pthread_cond_init(s_notice_get_call_list_cond, NULL);

+    LYINFLOG("liulei s_notice_get_call_list_cond\n"); 

+#endif

 

-    for(int i=0;i<RTP_MODE_MAX;i++)

+    s_call_list_loop = 1;  

+    int ret = pthread_create(&s_call_list_loop_tid,/*&attr*/NULL,triggerGetCallList,NULL);

+    if(ret < 0)

     {

-        lynq_set_rtp_port(i,6666);

-        g_rtp_thread_valid[i] = 0;

-    }          

-    

-    LYDBGLOG("lynq init rtp success!!!");

-    return;

-}

-

-int lynq_init_call(int uToken)

-{   

-    if(g_lynq_call_init_flag == 1){

-        LYDBGLOG("lynq init call failed!!!");

+        LYERRLOG("lynq_update_call_list_loop fail!!!");

         return -1;

     }

-    g_lynq_call_init_flag = 1;

-    s_call_urc_event_complete = 1;

-    call_list_loop = 1;

-    LYINFLOG("liulei call_list_loop %d\n", call_list_loop);

-    s_urc_call_state_change_mutex = new pthread_mutex_t;

-    pthread_mutex_init(s_urc_call_state_change_mutex, NULL);

-    s_urc_call_state_change_cond = new pthread_cond_t;

-    LYINFLOG("liulei s_urc_call_state_change_mutex\n");

-    pthread_cond_init(s_urc_call_state_change_cond, NULL);

-    LYINFLOG("liulei s_urc_call_state_change_cond\n");

-    int result = 0;

-    Global_uToken_call = uToken;

-    urc_call_recive_status = 1;

-    client_size = sizeof(client_t);

-    LYLOGSET(LOG_INFO);

-    LYLOGEINIT(USER_LOG_TAG);

-    result = lynq_socket_client_start();

-    if(result!=0)

-    {

-        return -1;

-    }

-    result = lynq_socket_urc_start();

-    if(result!=0)

-    {

-        return -1;

-    }

-    result = lynq_update_call_list_loop();

-    if(result!=0)

-    {

-        return -1;

-    }

-    memset(lynq_call_lists,0,sizeof(lynq_call_lists));

+    LYINFLOG("lynq_update_call_list_loop success!!!");

 

-    lynq_init_rtp();

-    

-    LYDBGLOG("lynq init call success!!!");

+    memset(s_call_lists,0,sizeof(s_call_lists));

     return 0;

 }

-int lynq_deinit_call()

+

+int lynq_stop_call_list_loop()

 {

     int ret;

-    if(g_lynq_call_init_flag == 0)

-    {

-        LYDBGLOG("lynq_deinit_call failed!!!");

-        return -1;

-    }

-    else

-    {

-        g_lynq_call_init_flag = 0;

-        lynq_call_hungup_all();       

-        if(lynq_call_client_sockfd>0)

-        {

-            close(lynq_call_client_sockfd);

-        }

-        urc_call_recive_status = 0;

-        call_list_loop = 0;

-        lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);

-        if(lynq_call_urc_tid == -1 || lynq_call_list_loop_tid == -1)

-        {

-            return -1;

-        }

-        ret = pthread_cancel(lynq_call_urc_tid);

-        LYDBGLOG("pthread cancel ret = %d",ret);

-        ret = pthread_cancel(lynq_call_list_loop_tid);

-        LYDBGLOG("pthread cancel ret = %d",ret);

-        ret = pthread_join(lynq_call_urc_tid,NULL);

-        LYDBGLOG("pthread join ret = %d",ret);

-        ret = pthread_join(lynq_call_list_loop_tid,NULL);

-        LYDBGLOG("pthread join ret = %d",ret);

-        pthread_mutex_destroy(s_urc_call_state_change_mutex);

-        pthread_cond_destroy(s_urc_call_state_change_cond);

-        delete s_urc_call_state_change_mutex;

-        //s_urc_call_state_change_mutex = NULL;

-        delete s_urc_call_state_change_cond;

-        //s_urc_call_state_change_cond = NULL;

-

-        return 0;

-    }

+    pthread_mutex_lock(&s_notice_get_call_list_mutex);

+    s_call_list_loop = 0;

+    ret = pthread_cancel(s_call_list_loop_tid);

+    LYINFLOG("pthread cancel w_c_list ret = %d",ret);    

+    pthread_mutex_unlock(&s_notice_get_call_list_mutex);    

+    ret = pthread_join(s_call_list_loop_tid,NULL);

+    LYINFLOG("pthread join w_c_list ret = %d",ret);  

+    s_call_list_loop_tid=-1;

+#if 0

+    pthread_mutex_destroy(s_notice_get_call_list_mutex);

+    pthread_cond_destroy(s_notice_get_call_list_cond);

+    delete s_notice_get_call_list_mutex;

+    //s_notice_get_call_list_mutex = NULL;

+    delete s_notice_get_call_list_cond;

+    //s_notice_get_call_list_cond = NULL;

+#endif

+    

+    return 0;

 }

 

+int lynq_init_call(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_INFO);

+    LYLOGEINIT(USER_LOG_TAG);   

+

+    g_module_Global_uToken = utoken; 

+

+    int ret = lynq_urc_socket_start();

+    if(ret != RESULT_OK)

+    {

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

+        g_module_init_flag = MODULE_CLOSED;

+        return LYNQ_E_INNER_ERROR;

+    }

+

+    ret = lynq_server_socket_start();

+    if(ret !=RESULT_OK)

+    {

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

+        lynq_close_urc_thread();

+        g_module_init_flag = MODULE_CLOSED;

+        return LYNQ_E_INNER_ERROR;

+    }

+

+     

+    int result = lynq_start_call_list_loop();

+    if(ret != RESULT_OK)

+    {

+        LYERRLOG("lynq_start_call_list_loop fail!!!");

+        lynq_close_urc_thread();

+        lynq_close_rc_thread();

+        g_module_init_flag = MODULE_CLOSED;

+        return LYNQ_E_INNER_ERROR;

+    }      

+

+    lynq_init_rtp();

+

+    g_module_init_flag = MODULE_RUNNING;

+    return 0;

+}

+

+int lynq_deinit_call(void){

+

+    if (g_module_init_flag != MODULE_RUNNING)

+    {

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

+       return LYNQ_E_CONFLICT;

+    }      

+    lynq_call_hungup_all();  

+    lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);

+    g_module_init_flag = MODULE_SWITCHING;

+    lynq_close_urc_thread();

+    lynq_close_rc_thread();    

+    lynq_stop_call_list_loop();

+    g_module_init_flag = MODULE_CLOSED;

+    return 0;

+}

+

+#if 0

 int lynq_set_common_request(int request_id, int argc, const char* format,...)

 {

     Parcel p;

@@ -1147,6 +813,14 @@
     int slot_id = -1;

     int error = -1;

 

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(request_id,5,p,argc,format,...);

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

+

     client.uToken = Global_uToken_call;

     client.request = request_id;

     client.paramLen = argc;

@@ -1170,61 +844,68 @@
         LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

     }

     return error;

+

+    

 }

+#endif

 

 int lynq_get_common_request(int request_id, int* status)

 {

-    Parcel p;

-    lynq_client_t client;

-    int resp_type = -1;

-    int token;

-    int request = -1;

-    int slot_id = -1;

-    int error = -1;

     if(status==NULL)

     {

         LYERRLOG("status is null");

-        return -1;

+        return LYNQ_E_PARAMETER_ANONALY;

     }

-    client.uToken = Global_uToken_call;

-    client.request = request_id;

-    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);

-    if(send_request(lynq_call_client_sockfd,&client)==-1)

+

+    Parcel* p=NULL;

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

+    if(ret==RESULT_OK)

     {

-        LYERRLOG("send request fail");

-        return -1;

+        p->readInt32(status);

+        delete p;        

     }

-    if(get_response(lynq_call_client_sockfd,p)==0)

-    {

-        JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);

-        p.readInt32(status);

-        LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

-    }

-    return error;

+    return ret;   

+}

+

+int waitCallstateChange(int mtime)

+{

+    LYINFLOG("wait Call state Change");

+    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(&call_state_change_mutex);

+    ret = pthread_cond_timedwait(&call_state_change_cond,&call_state_change_mutex,&timeout);

+    pthread_mutex_unlock(&call_state_change_mutex);

+    return ret;

+}

+

+int IsNormalCallDailing()

+{

+    return s_module_isDial;

 }

 

 int lynq_call(int* handle,char addr[])

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

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

+        return LYNQ_E_CONFLICT;

     }

-    Parcel p;

-    lynq_client_t client;

-    int resp_type = -1;

-    int token;

-    int request = -1;

-    int slot_id = -1;

-    int error = -1;

+    

     int lynq_call_id = -1;

 

     LYINFLOG("lynq_call begin addr %s",addr);

     if(addr==NULL)

     {

         LYERRLOG("Phone num is null!!!");

-        return -1;

+        return LYNQ_E_PARAMETER_ANONALY;

     }

 

     if(find_call_id_with_addr(addr)!=INVALID_ID)

@@ -1240,209 +921,151 @@
         return LYNQ_E_ECALL_BEING_RUNNING;

     }

 #endif   

+

+    Parcel* p=NULL;

+    lynq_call_id = addAddr(addr,0);

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_DIAL,2,"%s %d",addr, 0);

+    if(ret!=0)

+    {

+        cleanCallList(lynq_call_id);       

+        return ret;      

+    }

     

-    client.uToken = Global_uToken_call;

-    client.request = 10;//RIL_REQUEST_DIAL

-    client.paramLen = 2;

-    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

-    memcpy(client.param,addr,strlen(addr)+1);

-    strcat(client.param," 0");

-    lynq_call_id = addAddr(addr);

-    LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

-    pthread_mutex_lock(&g_lynq_call_sendto_mutex);

-    if(send_request(lynq_call_client_sockfd,&client)==-1)

+    delete p;        

+ 

+    s_module_isDial = 1;

+    if(waitCallstateChange(6000)==ETIMEDOUT)//6000ms

     {

-        LYERRLOG("send request fail");

-        cleanCallList(lynq_call_id);   

-        return -1;

+        //if timeout,this call need destroy.

+        s_module_isDial = 0;      

+        LYERRLOG("lynq_call timeout:wait Call state fail!!! clear local idx %d",lynq_call_id);

+        cleanCallList(lynq_call_id);            

+        return LYNQ_E_TIME_OUT;

     }

-    get_response(lynq_call_client_sockfd,p);

-    pthread_mutex_unlock(&g_lynq_call_sendto_mutex);

-    JumpHeader(p,&resp_type,&token,&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)

+    s_module_isDial = 0;

+    *handle = s_call_lists[lynq_call_id].call_id;

+    if(*handle > 0)

     {

-        isDial = 1;

-        if(waitCallstateChange(6000)==ETIMEDOUT)//6000ms

-        {

-            //if timeout,this call need destroy.

-            isDial = 0;

-            error = LYNQ_E_TIME_OUT;

-            LYERRLOG("lynq_call timeout:wait Call state fail!!! clear local idx %d",lynq_call_id);

-            cleanCallList(lynq_call_id);            

-            return error;

-        }

-         isDial = 0;

-        *handle = lynq_call_lists[lynq_call_id].call_id;

-        if(*handle > 0)

-        {

-            LYINFLOG("lynq_call dial addr %s suc, id is %d",addr,*handle);

-            return 0;

-        }

-        else 

-        {   

-            LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);

-            cleanCallList(lynq_call_id);      

-            return LYNQ_E_INVALID_ID_ANONALY;

-        }      

-        

+        LYINFLOG("lynq_call dial addr %s suc, id is %d",addr,*handle);

+        return RESULT_OK;   

     }

-    LYERRLOG("lynq_call dial addr %s fail, service error %d",addr, error);

-    cleanCallList(lynq_call_id);      

-    return error;

+    else 

+    {   

+        LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);

+        cleanCallList(lynq_call_id);      

+        return LYNQ_E_INVALID_ID_ANONALY;

+    }                 

 }

 int lynq_call_answer()

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

-    }

-    Parcel p;

-    lynq_client_t client;

-    int resp_type = -1;

-    int token;

-    int request = -1;    

-    int slot_id = -1;    

-    int error = -1;

-    client.uToken = Global_uToken_call;

-    client.request = 40;//RIL_REQUEST_DIAL

-    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_call_sendto_mutex);

-    if(send_request(lynq_call_client_sockfd,&client)==-1)

+        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_ANSWER,0,"");

+    if(ret==RESULT_OK)

     {

-        LYERRLOG("send request fail");

-        return -1;

-    }

-    get_response(lynq_call_client_sockfd,p);

-    pthread_mutex_unlock(&g_lynq_call_sendto_mutex);

-    JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);

-    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

-    return error;

+        delete p;      

+    }        

+    return ret;

 }

 int lynq_call_hungup(int* handle)

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

-    }

-    Parcel p;

-    lynq_client_t client;

-    int resp_type = -1;

-    int request = -1;

-    int token;

-    int slot_id = -1;

-    int error = -1;

-    int call_id = 0;

-    int lynq_call_id;

+        return LYNQ_E_CONFLICT;

+    }  

+    

     if(handle==NULL||!((*handle>=0)&&(*handle<10)))

     {

-        LYERRLOG("[%s] illegal input!!!!",__FUNCTION__);

-        return LYNQ_E_CONFLICT;

+        LYERRLOG("%s illegal input!!!!",__func__);

+        return LYNQ_E_PARAMETER_ANONALY;

     }

-    client.uToken = Global_uToken_call;

-    client.request = 12;//RIL_REQUEST_HUNGUP

-    client.paramLen = 1;

-    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

-    call_id = *handle;

-    sprintf(client.param,"%d",call_id);

-    LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

-    pthread_mutex_lock(&g_lynq_call_sendto_mutex);

-    if(send_request(lynq_call_client_sockfd,&client)==-1)

+

+    int call_id = *handle;

+    Parcel* p=NULL;    

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_HANGUP,1,"%d",call_id);

+    if(ret!=0)

     {

-        LYERRLOG("send request fail");

-        return -1;

-    }

-    get_response(lynq_call_client_sockfd,p);

-    pthread_mutex_unlock(&g_lynq_call_sendto_mutex);

-    JumpHeader(p,&resp_type,&token,&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)

+        return ret; 

+    }     

+    delete p; 

+

+    int  lynq_call_id=find_call_id_with_call_id(call_id);

+    if(lynq_call_id!=INVALID_ID)

     {

-        lynq_call_id=find_call_id_with_call_id(call_id);

-        if(lynq_call_id!=INVALID_ID)

-        {

-            cleanCallList(lynq_call_id);

-        }        

-    }

-    return error;

+        cleanCallList(lynq_call_id);

+    }        

+    

+    return RESULT_OK;     

 }

 int lynq_call_hungup_all()

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

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

+        return LYNQ_E_CONFLICT;

     }

-    Parcel p;

-    lynq_client_t client;

-    int resp_type = -1;

-    int token=-1;

-    int request = -1;

-    int slot_id = -1;

-    int error = -1;

-    client.uToken = Global_uToken_call;

-    client.request = 17;//RIL_REQUEST_UDUB

-    client.paramLen = 0;

-    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

-    LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

-    pthread_mutex_lock(&g_lynq_call_sendto_mutex);

-    if(send_request(lynq_call_client_sockfd,&client)==-1)

+

+    Parcel* p=NULL;    

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

+    if(ret==RESULT_OK)

     {

-        LYERRLOG("send request fail");

-        return -1;

-    }

-    get_response(lynq_call_client_sockfd,p);

-    pthread_mutex_unlock(&g_lynq_call_sendto_mutex);

-    JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);

-    LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

-    return error;

+         delete p;      

+    }        

+    return ret;   

 }

 int lynq_wait_incoming_call(int *handle)

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

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

+        return LYNQ_E_CONFLICT;

     }

     waitIncomingCall();

-    *handle = lynqIncomingCallId;

-    LYINFLOG("lynq incoming call id:%d",lynqIncomingCallId);

-    return 0;

+    *handle = s_IncomingCallId;

+    LYINFLOG("lynq incoming call id:%d",s_IncomingCallId);

+    return RESULT_OK;   

 }

 

 int lynq_set_auto_answercall(const int mode)

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

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

+        return LYNQ_E_CONFLICT;

     }

-    global_call_auto_answer = mode;

+    s_call_auto_answer = mode;

     LYINFLOG("auto answer call mode =%d",mode);

-    return 0;

+    return RESULT_OK;   

 }

 int lynq_get_current_call_state(int *handle,    int *call_state,int *toa,int *direction,char addr[])

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

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

+        return LYNQ_E_CONFLICT;

     }

     int lynq_call_id = 0;

     LYINFLOG("lynq_get_current_call_state begin ");

     if(handle==NULL)

     {

         LYERRLOG("handle is NULL");

-        return LYNQ_E_NULL_ANONALY;

+        return LYNQ_E_PARAMETER_ANONALY;

     }

     lynq_call_id = find_call_id_with_call_id(*handle);

     if(lynq_call_id==INVALID_ID)

     {

         return LYNQ_E_INVALID_ID_ANONALY;

     }

-    *call_state = lynq_call_lists[lynq_call_id].call_state;

-    *toa = lynq_call_lists[lynq_call_id].toa;

-    *direction = lynq_call_lists[lynq_call_id].direction;

-    memcpy(addr,lynq_call_lists[lynq_call_id].addr,strlen(lynq_call_lists[lynq_call_id].addr)+1);

-    return 0;

+    *call_state = s_call_lists[lynq_call_id].call_state;

+    *toa = s_call_lists[lynq_call_id].toa;

+    *direction = s_call_lists[lynq_call_id].direction;

+    memcpy(addr,s_call_lists[lynq_call_id].addr,strlen(s_call_lists[lynq_call_id].addr)+1);

+    return RESULT_OK;   

 }

 

 int lynq_get_current_call_number()

@@ -1451,7 +1074,7 @@
     int i;

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

     {

-        if(lynq_call_lists[i].used !=0)

+        if(s_call_lists[i].used !=0)

         {

             cnt++;           

         }

@@ -1464,32 +1087,42 @@
 static int judge_mic(const int enable){

     switch(enable){

         case 0:

-            return 1;

+            return true;

         case 1:

-            return 1;

+            return true;

         default:

-            return 0;

+            return false;

     }

 }

 

 int lynq_set_mute_mic(const int enable)

 {   

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

-    }

-    if(!judge_mic(enable)){

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

         return LYNQ_E_CONFLICT;

     }

-    return lynq_set_common_request(53,1,"%d",enable); //RIL_REQUEST_SET_MUTE    

+    if(!judge_mic(enable)){

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+ // return lynq_set_common_request(53,1,"%d",enable); //RIL_REQUEST_SET_MUTE  

+

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_MUTE,1,"%d",enable);

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

 }

 int lynq_get_mute_mic(int *status)

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

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

+        return LYNQ_E_CONFLICT;

     }

-    return lynq_get_common_request(54,status);//RIL_REQUEST_GET_MUTE    

+    return lynq_get_common_request(RIL_REQUEST_GET_MUTE,status);//54

 }

 

 /**

@@ -1502,25 +1135,36 @@
 {

     if(callnum == '#')

     {

-        return 1;

+        return true;

     }

     if(callnum == '*')

     {

-        return 1;

+        return true;

     }

     if(callnum >= '0'&& callnum <= '9')

     {

-        return 1;

+        return true;

     }

-    return 0;

+    return false;

 }

 

 int lynq_switch_waiting_or_holding_and_active(void)

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

+        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_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE,0,"");

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

+

+#if 0

     Parcel p;

     lynq_client_t client;

     int resp_type = -1;

@@ -1544,14 +1188,25 @@
     JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);

     LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

     return error;

+#endif

 }

 

 int lynq_hangup_waiting_or_background(void)

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

+        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_HANGUP_WAITING_OR_BACKGROUND,0,"");

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

+#if 0

     Parcel p;

     lynq_client_t client;

     int resp_type = -1;

@@ -1575,14 +1230,25 @@
     JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);

     LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

     return error;

+#endif

 }

 

 int lynq_hangup_foreground_resume_background(void)

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

+        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_HANGUP_FOREGROUND_RESUME_BACKGROUND,0,"");

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

+#if 0    

     Parcel p;

     lynq_client_t client;

     int resp_type = -1;

@@ -1606,24 +1272,35 @@
     JumpHeader(p,&resp_type,&token,&request,&slot_id,&error);

     LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);

     return error;

+#endif

 }

 

 int lynq_set_DTMF(const char callnum)

 {

-    if(g_lynq_call_init_flag == 0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        return -1;

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

+        return LYNQ_E_CONFLICT;

     }

     if(!judge_dtmf(callnum))

     {

         return LYNQ_E_CONFLICT;

     }

-    if(!lynq_call_state)

+    if(s_module_call_state!=CALL_ON)

     {

         LYERRLOG("LYNQ_E_CONFLICT");

         return LYNQ_E_CONFLICT;

     }

-    return lynq_set_common_request(24,1,"%c",callnum); //RIL_REQUEST_DTMF  

+    

+//  return lynq_set_common_request(24,1,"%c",callnum); //RIL_REQUEST_DTMF  

+

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_DTMF,1,"%c",callnum);

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

 }

 static int judge_volume(LYNQ_E_VOLUMN_SET set,const int volume){

     if(set==LYNQ_E_VOLUMN_SET_DTMF){

@@ -1641,716 +1318,119 @@
 }

 int lynq_set_DTMF_volume(const int volume)

 {   

-    if(!judge_volume(LYNQ_E_VOLUMN_SET_DTMF,volume)){

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

         return LYNQ_E_CONFLICT;

     }

-    return lynq_set_common_request(8003,1,"%d",volume);//LYNQ_REQUEST_SET_DTMF_VOLUME

+    if(!judge_volume(LYNQ_E_VOLUMN_SET_DTMF,volume)){

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+//  return lynq_set_common_request(8003,1,"%d",volume);//LYNQ_REQUEST_SET_DTMF_VOLUME

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_SET_DTMF_VOLUME,1,"%d",volume);

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

 }

 int lynq_set_speech_volume(const int volume)//mixer_set_volume

 {

-    if(!judge_volume(LYNQ_E_VOLUMN_SET_SPEECH,volume))

+    if(g_module_init_flag != MODULE_RUNNING)

     {

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

         return LYNQ_E_CONFLICT;

     }

-    return lynq_set_common_request(8009,1,"%d",volume); //LYNQ_REQUEST_SET_SPEECH_VOLUME

+    if(!judge_volume(LYNQ_E_VOLUMN_SET_SPEECH,volume))

+    {

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+//  return lynq_set_common_request(8009,1,"%d",volume); //LYNQ_REQUEST_SET_SPEECH_VOLUME

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_SET_SPEECH_VOLUME,1,"%d",volume);

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

 }

 int lynq_get_speech_volume(int* volumn)//mixer_get_volume

 {

-    return lynq_get_common_request(8010,volumn);//LYNQ_REQUEST_GET_SPEECH_VOLUME

+    return lynq_get_common_request(LYNQ_REQUEST_GET_SPEECH_VOLUME,volumn);//8010  

 } 

 int lynq_incall_record_start(const char* file_path)

 {

-    return lynq_set_common_request(8011,2,"%s %s","1",file_path); //LYNQ_REQUEST_RECORD

+//    return lynq_set_common_request(8011,2,"%s %s","1",file_path); //LYNQ_REQUEST_RECORD

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_RECORD,2,"%s %s","1",file_path);

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;    

 }

 int lynq_incall_record_stop()

 {

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

     const char* unused_file="just_ocuupy_paramter_postion";

-    return lynq_set_common_request(8011,2,"%s %s","0",unused_file); //LYNQ_REQUEST_RECORD

+//    return lynq_set_common_request(8011,2,"%s %s","0",unused_file); //LYNQ_REQUEST_RECORD

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,LYNQ_REQUEST_RECORD,2,"%s %s","0",unused_file);

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;        

 }

 /*audio end*/

 

+void urc_msg_process(Parcel *p)

+{ 

+    int resp_type;

+    int urcid;

+    int slot_id;

+    

+    p->readInt32(&resp_type);

+    p->readInt32(&urcid);

+    p->readInt32(&slot_id);

+    LYINFLOG("urc id = %d, slot_id = %d",urcid,slot_id);

+    switch (urcid)

+    {

+        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED://1001

+        {

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

+            lynqNoticeGetModuleCallList();

+            break;

+        }

+        case RIL_UNSOL_CALL_RING: //1018

+        {

+            if(s_call_auto_answer==1)

+            {

+                lynq_call_answer();

+            }

+            break;

+        }

+        case RIL_UNSOL_RINGBACK_TONE: //1029

+        case RIL_UNSOL_CALL_INFO_INDICATION://3049

+        {

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

+            break;

+        }

 #ifdef ECALL_SUPPORT

-LYNQ_ECall_Variant lynq_get_lynq_ecall_variant_from_lynq_type(LYNQ_ECall_Type type)

-{

-    switch(type)

-    {

-        case LYNQ_ECALL_TYPE_TEST:

-            return LYNQ_ECALL_TEST;

-        case LYNQ_ECALL_TYPE_RECONFIG:

-            return LYNQ_ECALL_RECONFIG;

-        default:

-            return LYNQ_ECALL_EMERGENCY;

-    }

-}

-

-RIL_ECall_Variant lynq_get_ril_ecall_variant_from_lynq_variant(LYNQ_ECall_Variant type)

-{

-    switch(type)

-    {

-        case LYNQ_ECALL_TEST:

-            return ECALL_TEST;

-        case LYNQ_ECALL_RECONFIG:

-            return ECALL_RECONFIG;

-        default:

-            return ECALL_EMERGENCY;

-    }

-}

-

-RIL_ECall_Category lynq_get_ril_ecall_cat_from_lynq_cat(LYNQ_ECall_Category cat)

-{

-    switch(cat)

-    {

-        case LYNQ_EMER_CAT_MANUAL_ECALL:

-            return EMER_CAT_MANUAL_ECALL;        

-        default:

-            return EMER_CAT_AUTO_ECALL;

-    }

-}

-

-

-int lynq_set_test_num(LYNQ_ECall_Set_Type type, const char *test_num, int test_num_length)

-{

-    int error; 

-

-    if(test_num==NULL || test_num_length > LYNQ_PHONE_NUMBER_MAX )

-    {

-       LYERRLOG("test_num is null or test_num_length %d s greater than %d ",test_num_length,LYNQ_PHONE_NUMBER_MAX);

-       return -1;

-    }       

-    

-    error=lynq_set_common_request(RIL_REQUEST_ECALL_SET_TEST_NUM,2,"%d %s",type,test_num);

-

-    if(error==0)

-    {

-        snprintf(e_call_addr[LYNQ_ECALL_TEST],LYNQ_PHONE_NUMBER_MAX,"%s",test_num);

-    }

-

-    return error;

-}

-

-int lynq_ecall_can_be_preempted(LYNQ_ECall_Variant old_variant,LYNQ_ECall_Variant new_variant)

-{

-    int ret;

-

-    if(old_variant == LYNQ_ECALL_EMERGENCY)

-    {

-        return false;

-    }

-    else if(new_variant == LYNQ_ECALL_EMERGENCY)

-    {

-        return true;

-    }

-    else if(old_variant==LYNQ_ECALL_DAILING_STATE_NONE)

-    {

-        return true;

-    }        

-    else 

-    {

-        ret = (g_ecall_whether_preempt & 0x01);

-    }

-    LYINFLOG("ecall clear conflict call, lynq_ecall_can_be_preempted is true");

-    return ret;

-}

-

-int lynq_clear_current_call()

-{

-    int cnt;

-    if(lynq_call_hungup_all()!=0)

-    {

-        LYERRLOG("ecall clear conflict call,  hangup all failure");

-        return -1;

-    }       

-    cnt=0;

-    while(lynq_get_current_call_number()!=0 && cnt<80)

-    {

-        lynqRespWatingEvent();  

-        usleep(200 * 1000);//200ms

-        cnt++;                

-    }

-    if(lynq_get_current_call_number()!=0)

-    {

-        LYERRLOG("ecall clear conflict call, current call list can't cleared after 15s");

-        return -2;

-    } 

-

-    LYINFLOG("ecall clear conflict call, after %d 0.2s, call list  is cleared", cnt);         

-    return 0;

-}

-

-int lynq_clear_current_conflict_call(LYNQ_ECall_Variant old_variant,LYNQ_ECall_Variant new_variant)

-{

-    int cnt;

-    int ret;

-

-    if(lynq_ecall_is_running()==false)

-    {

-        if(lynq_get_current_call_number()==0)

+        case RIL_UNSOL_ECALL_INDICATIONS://9502

         {

-            LYINFLOG("ecall clear conflict call, no conflict ecall and normal call");

+            urc_ecall_msg_process(p);

         }

-        else if(g_ecall_whether_preempt & 0x02)

-        {

-            ret=lynq_clear_current_call();

-            LYERRLOG("ecall clear conflict call, relase current normal call ret is %d",ret);                         

-        }

-        return 0;          

-    }

-

-    LYINFLOG("ecall clear conflict call, two ecall occure at the same time, new is %d, old is %d, g_preempt is %d",new_variant,old_variant,g_ecall_whether_preempt);

-

-    if(lynq_ecall_can_be_preempted(old_variant,new_variant)==false)

-    {

-        LYERRLOG("ecall clear conflict call, new ecall %d can't preempt old ecall %d",new_variant,old_variant);

-        return -1;

-    }    

-

-    ret=lynq_clear_current_call();

-    LYINFLOG("ecall clear conflict call, relase current call(including ecall) ret is %d",ret);    

-

-    if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)

-    {

-        sendSignalToWaitCallStateChange();  

-        LYINFLOG("ecall clear conflict call, stop ecall in dailing status");

-    }             

-    

-    cnt=0;

-    while(lynq_ecall_is_running() && cnt<80)

-    {

-        usleep(200 * 1000);//200ms

-        cnt++;

-    }

-  

-    if(lynq_ecall_is_running())

-    {

-        LYERRLOG("ecall clear conflict call, after 16s, lynq ecall is still running");        

-    }

-    else

-    {

-        LYINFLOG("ecall clear conflict call, after %d 0.2s, ecall info is cleared", cnt);           

-    }

-

-    sleep(3);// for ecall disconnect

-    print_ecall_info();        

-    return 0;

-}

-

-int lynq_fast_ecall(int* handle, LYNQ_ECall_Category lynq_ecall_cat, LYNQ_ECall_Variant lynq_ecall_variant,  const char *addr, int addr_length, const unsigned char *msd_data,int msd_length)

-{

-    int error;

-    RIL_ECall_Variant ril_ecall_variant = lynq_get_ril_ecall_variant_from_lynq_variant (lynq_ecall_variant);

-    RIL_ECall_Category ril_ecall_cat = lynq_get_ril_ecall_cat_from_lynq_cat(lynq_ecall_cat);

-    char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};

-    unsigned int i;          

-   

-    if(msd_length > MSD_MAX_LENGTH || msd_length <=0 || lynq_ecall_variant >=LYNQ_ECALL_MO_MAX)

-    {

-        LYERRLOG("lynq_fast_ecall msd_length %d or ecall variant %d parameter error",msd_length,lynq_ecall_variant);

-        return LYNQ_E_ECALL_MSD_LENGTH_ERROR;

-    }     

-

-    if(lynq_clear_current_conflict_call(g_lynqEcallVariant,lynq_ecall_variant)!=0)

-    {

-         LYERRLOG("%s call lynq_clear_current_conflict_call false, old is %d, new is %d",__func__,g_lynqEcallVariant,lynq_ecall_variant);

-         return LYNQ_E_ECALL_BEING_RUNNING;

-    }  

-

-    pthread_mutex_lock(&s_ecall_variable_mutex);

-    is_ecall_dial = LYNQ_ECALL_DAILING_STATE_STARTED;

-    g_lynqEcallVariant = lynq_ecall_variant;

-    g_ecallId = INVALID_ID;

-    pthread_mutex_unlock(&s_ecall_variable_mutex);

-

-    for(i =0; i<msd_length;i++)

-    {

-        sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);

-    }    

-

-

-    LYINFLOG("lynq_fast_ecall addr is %s",e_call_addr[lynq_ecall_variant]);

-

-    error=lynq_set_common_request(RIL_REQUEST_ECALL_FAST_MAKE_ECALL,4,"%d %d %s %s",ril_ecall_cat, ril_ecall_variant, "null", lynq_msd_data);

-   

-    if(error==0)

-    {   

-        if(waitCallstateChange(270000)==ETIMEDOUT)//4.5 min, dailing 1 min, alerting 1 min, sending msd 30s, redial 2min

-        {

-            pthread_mutex_lock(&s_ecall_variable_mutex);

-            LYERRLOG("lynq_fast_ecall timeout:wait Call state time out!!!");                   

-            is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;            

-            lynqRespWatingEvent();  

-            pthread_mutex_unlock(&s_ecall_variable_mutex);

-            return LYNQ_E_TIME_OUT;

-        }

-        pthread_mutex_lock(&s_ecall_variable_mutex);

-        if(is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)

-        {

-            /*just dail, no recv answer*/

-            LYERRLOG("lynq_fast_ecall, no answer!");   

-            is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;

-            lynqRespWatingEvent();   

-            pthread_mutex_unlock(&s_ecall_variable_mutex);

-            return LYNQ_E_ECALL_DAILING_NO_ANSWER;            

-        }

-        

-        is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;

-        lynqRespWatingEvent();        

-        

-        if(g_ecallId != INVALID_ID)

-        {

-            *handle=g_ecallId;         

-            LYINFLOG("lynq_fast_ecall id is %d",g_ecallId);

-            pthread_mutex_unlock(&s_ecall_variable_mutex);

-            return 0;

-        }

-

-        LYERRLOG("lynq_fast_ecall service return fail");

-        pthread_mutex_unlock(&s_ecall_variable_mutex);      

-        return LYNQ_E_INVALID_ID_ANONALY;                       

-    }

-

-    pthread_mutex_lock(&s_ecall_variable_mutex);

-    is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;

-    g_lynqEcallVariant = LYNQ_ECALL_VAR_NONE;

-    g_ecallId = INVALID_ID;

-    pthread_mutex_unlock(&s_ecall_variable_mutex);

-

-    return error;

-}

-

-int lynq_set_psap(int enable)

-{

-    return lynq_set_common_request(RIL_REQUEST_ECALL_SET_PSAP,1,"%d",enable);    

-}

-

-int lynq_psap_pull_msd()

-{

-    return lynq_set_common_request(RIL_REQUEST_ECALL_PSAP_PULL_MSD,0,"");  

-}

-

-int lynq_make_ecall(int* handle, LYNQ_ECall_Type type)

-{

-    LYNQ_ECall_Variant lynq_ecall_variant;

-    int error = -1;

-    int lynq_call_id = -1;

-

-    if(handle==NULL)

-    {

-        LYERRLOG("handle is NULL, parameter error  ");

-           return -1;

-    }

-    

-    error=lynq_set_common_request(RIL_REQUEST_ECALL_MAKE_ECALL,1,"%d",type);   

-    

-    if(error==0)

-    {

-        lynq_ecall_variant=lynq_get_lynq_ecall_variant_from_lynq_type(type);

-      

-        lynq_call_id = addAddr(e_call_addr[lynq_ecall_variant]);

-        isDial = 1;

-        if(waitCallstateChange(10000)==ETIMEDOUT)//10000ms

-        {

-            error = LYNQ_E_TIME_OUT;

-            LYERRLOG("timeout:wait Call state fail!!!");

-            return error;

-        }

- 

-        *handle = lynq_call_id;

-    }

-

-    return error;

-}

-

-

-int lynq_set_msd(int* handle, const unsigned char *msd_data, int msd_length)

-{

-    char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};

-    unsigned int i;

-

-    if(handle==NULL || ((*handle) >= LYNQ_CALL_MAX) || msd_length > MSD_MAX_LENGTH || msd_length <= 0 || msd_data ==NULL)

-    {

-        LYERRLOG("lynq_set_msd handle is NULL or *handle %d is greater or equeal to %d or msd_length %d is greater than %d or msd_data %s is NULL, parameter error",*handle,LYNQ_CALL_MAX,msd_length,MSD_MAX_LENGTH, msd_data);

-        return -1;

-    }    

-

-    for(i=0; i<msd_length;i++)

-    {

-        sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);

-    }   

-

-    LYINFLOG("lynq_set_msd ");

-

-    return lynq_set_common_request(RIL_REQUEST_ECALL_SET_MSD,2,"%d %s",*handle,lynq_msd_data);

-}

-

-int lynq_set_ivs(int enable)

-{

-#ifdef ECALL_SUPPORT

-    if(enable<0)

-    {

-       if(enable >-100)

-       {

-           lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);

-       }

-       else  if(enable== -1000)

-       {

-           print_ecall_info();

-       } 

-       else

-       {

-           g_ecall_whether_preempt= ((-100-enable) & 0x11);           

-       }

-       return 0;

-    }

 #endif

-

-    return lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);    

-}

-

-int lynq_reset_ivs()

-{

-     return lynq_set_common_request(RIL_REQUEST_ECALL_RESET_IVS,0,"");

-}

-

-int lynq_ivs_push_msd()

-{

-    return lynq_set_common_request(RIL_REQUEST_ECALL_IVS_PUSH_MSD,0,"");    

-}

-

-int wait_ecall_event()

-{

-    int ret = 0;

-    pthread_mutex_lock(&s_incoming_e_call_mutex);

-    ret = pthread_cond_wait(&s_incoming_e_call_cond,&s_incoming_e_call_mutex);

-    pthread_mutex_unlock(&s_incoming_e_call_mutex); 

-    return ret;

-}

-

-int lynq_wait_ecall_indication(int* handle, LYNQ_ECall_Indication *eCall_Indication)

-{

-    wait_ecall_event();

-    *handle = g_lynqIncomingEcallId;

-    *eCall_Indication = g_lynqIncomingEcallIndication;  

-    LYINFLOG("lynq_wait_ecall_indication handle %d, Ind id: %d", *handle, *eCall_Indication);

-    return 0;

-}

-

-#endif

-

-/*Audio Path setting begin*/

-/*sub function*/

-void lynq_set_rtp_mixer_ctrl(int enable_rtp)

-{

-    char cmd[256];

-    LYINFLOG("set_rtp_mixer_ctrl %d", enable_rtp);

-    if(enable_rtp)

-    {

-        sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 0);

-        system(cmd);

-        sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 1);

-        system(cmd);

-        sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 1);

-        system(cmd);

-        sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 1);

-        system(cmd);

-        sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 1);

-        system(cmd);

-        sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 1);

-        system(cmd);    

-    }

-    else 

-    {

-        sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 1);

-        system(cmd);

-        sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 0);

-        system(cmd);

-        sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 0);

-        system(cmd);

-        sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 0);

-        system(cmd);

-        sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 0);

-        system(cmd);

-        sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 0);

-        system(cmd);    

-    }    

-}

-

-void* lynq_start_rtp_cmd(void *arg)

-{

-    if(g_lynq_call_init_flag == 0)

-    {

-        return -1;

-    }

-    int* rtp_mode= (int*) arg;

-    char cmd[384];

-	char vlan_para_string[sizeof(RTP_VLAN_INFO_FORMAT)+MAX_VLAN_INFO_LENGTH-2/*sizeof "%s"*/]={0};

-    LYINFLOG("lynq_start_rtp_cmd: rtp_mode is %d",(*rtp_mode));    

-    if ((*rtp_mode) == RTP_CLIENT)

-    {

-        sprintf(cmd,RTP_FROM_CMD, \

-            g_rtp_client_info.port,g_rtp_client_info.clockrate,g_rtp_client_info.channels, \

-            g_rtp_client_info.latency);            

-    //  LYINFLOG("start from rtp play: cmd is %s",cmd);    

-        system(cmd);

-    }

-    else if ((*rtp_mode) == RTP_SERVER)

-    {

-        if(strlen(g_rtp_server_info.vlan_info)>0)

-        {

-           sprintf(vlan_para_string,RTP_VLAN_INFO_FORMAT,g_rtp_server_info.vlan_info);

-        }

-        sprintf(cmd,RTP_TO_CMD,   \

-        g_rtp_server_info.ip,vlan_para_string,g_rtp_server_info.port); 

-    //  LYINFLOG("start to rtp play: cmd is %s",cmd);

-        system(cmd);    

-    }

-    return NULL;

-}

-

-int lynq_start_rtp_thread(int rtp_mode)

-{

-    int ret;

-    pthread_attr_t attr;

-    static int start_mode[RTP_MODE_MAX]={0,1};  

-

-    pthread_attr_init(&attr);

-    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

-    ret = pthread_create(&(g_rtp_thread[rtp_mode]),&attr,lynq_start_rtp_cmd,&(start_mode[rtp_mode]));

-    if(ret != 0)

-    {

-        g_rtp_thread_valid[rtp_mode]=0;

-        LYERRLOG("rtp create %d pthread error, ret is %d",rtp_mode, ret);

-        return ret;

-    }

-    g_rtp_thread_valid[rtp_mode]=1;

-    return 0;

-}

-

-/*set*/

-int lynq_set_voice_audio_mode(const LYNQ_Audio_Mode audio_mode)

-{

-    if(g_lynq_call_init_flag == 0)

-    {

-        return -1;

-    }

-    int ret;

-    int i;

-    

-    if(audio_mode==AUDIO_MODE_RTP)

-    {

-        lynq_set_rtp_mixer_ctrl(1);

-        for(i=0;i<RTP_MODE_MAX;i++)

-        {

-            if(!g_rtp_thread_valid[i])

-            {

-                if(lynq_start_rtp_thread(i)!= 0)

-                {

-                    LYERRLOG("start rtp %d fail",i);

-                    break;

-                }

-                else 

-                {

-                    LYINFLOG("start rtp %d suc",i);        

-                }

-            }

-            else 

-            {

-                LYERRLOG("rtp %d needn't start",i); 

-            }

-        }

-        if(i!= RTP_MODE_MAX)            

-        {

-            LYERRLOG("start rtp whole fail");

-            lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);

-            return 1;

-        }

-        LYINFLOG("start rtp whole suc");          

-        return 0;

-    }

-    else if(audio_mode==AUDIO_MODE_CODEC)

-    {

-         for(i=0;i<RTP_MODE_MAX;i++)

-        {

-            if(g_rtp_thread_valid[i]) 

-            {

-                 ret = pthread_cancel(g_rtp_thread[i]);

-                 LYINFLOG("pthread cancel rtp %d ret = %d",i,ret);

-                 ret = pthread_join(g_rtp_thread[i],NULL);

-                 LYINFLOG("pthread join rtp %d ret = %d",i,ret);

-                 g_rtp_thread_valid[i] = 0;

-            }

-            else 

-            {

-                LYINFLOG("rtp %d needn't stop",i);

-            }

-        }

-        lynq_set_rtp_mixer_ctrl(0);     

-        LYINFLOG("stop rtp suc");

-    }

-    return 0;     

-}

-int lynq_set_remote_rtp_ip(const char* ip, const int ip_length)

-{

-    if (NULL == ip)

-    {

-        LYERRLOG("ip is NULL!!!");

-        return -1;

-    }

-    if ((ip_length < strlen(ip)+1) || (ip_length > MAX_IP_LENGTH))

-    {

-        LYERRLOG("incoming ip length error %d", ip_length);

-        return -1;

-    }

-

-    bzero(g_rtp_server_info.ip,MAX_IP_LENGTH);

-    strcpy(g_rtp_server_info.ip,ip);

-

-    LYINFLOG("lynq_set_remote_rtp_ip suc: ip is %s, length is %d", ip,ip_length);

-    

-    return 0;

-}

-int lynq_set_vlan_info(const char* vlan_info, const int vlan_info_length)

-{

-    if (NULL == vlan_info)

-    {

-        LYERRLOG("vlan_info is NULL!!!");

-        return -1;

-    }

-    

-    if ((vlan_info_length < strlen(vlan_info)+1) || (vlan_info_length > MAX_VLAN_INFO_LENGTH))

-    {

-        LYERRLOG("incoming vlan_info error, vlan info length %d", vlan_info_length);

-        return -1;

-    }    

-

-    

-    bzero(g_rtp_server_info.vlan_info,MAX_VLAN_INFO_LENGTH);

-    strcpy(g_rtp_server_info.vlan_info,vlan_info);

-   

-    LYINFLOG("lynq_set_vlan_info suc: vlan is %s, length is %d", vlan_info,vlan_info_length);

-    

-    return 0;  

-}

-int lynq_set_rtp_port(const LYNQ_Rtp_Mode rtp_mode, const int port)

-{  

-    if (port < 0)

-    {

-        LYERRLOG("invalid port number %d", port);

-        return -1;

-    }

-    if (rtp_mode == 0)

-    {

-        g_rtp_client_info.port = port;

-    }

-    else if (rtp_mode == 1)

-    {

-        g_rtp_server_info.port = port;

-    }

-    LYINFLOG("lynq_set_rtp_port suc: LYNQ_Rtp_Mode is %d, port is %d", rtp_mode, port);

-    return 0;

-}

-int lynq_set_rtp_param(const int clock_rate,const int channels,const int latency) //only for client mode

-{

-    g_rtp_client_info.clockrate = clock_rate;

-    g_rtp_client_info.channels = channels;

-    g_rtp_client_info.latency = latency;

-    LYINFLOG("lynq_set_rtp_param suc: clockrate is %d, channels is %d, latency is %d", clock_rate, channels, latency);

-    return 0;

-}

-/*get*/

-LYNQ_Audio_Mode lynq_get_voice_audio_mode()

-{

-    if(g_lynq_call_init_flag == 0)

-    {

-        return -1;

-    }

-    if(g_rtp_thread_valid[0])

-    {

-        return AUDIO_MODE_RTP;

-    }

-    else 

-    {

-        return AUDIO_MODE_CODEC;

+        default:

+            break;

     }

 }

-int lynq_get_remote_rtp_ip(char* ip, const int ip_length)

-{

-    if(g_lynq_call_init_flag == 0)

-    {

-        return -1;

-    }

-    if(ip==NULL)

-    {

-        LYERRLOG("ip is NULL");

-        return 1;

-    }    

-

-    if(ip_length < strlen(g_rtp_server_info.ip)+1)

-    {

-        LYERRLOG("ip lenght %d is shorter than saved ip length %d",ip_length,strlen(g_rtp_server_info.ip)+1);

-        return 1;

-    }

-    bzero(ip,ip_length);

-    strcpy(ip,g_rtp_server_info.ip);

-    return 0;

-}

-int lynq_get_vlan_info(char* vlan_info, const int vlan_info_length)

-{

-    if(vlan_info==NULL) 

-    {

-        LYERRLOG("vlan info is NULL");

-        return -1;

-    }

-

-    if(vlan_info_length < strlen(g_rtp_server_info.vlan_info)+1)

-    {

-        LYERRLOG("vlan info length %d is shorter than saved vlan info length %d",vlan_info_length,strlen(g_rtp_server_info.vlan_info)+1);

-        return -1;

-    }

-   

-    bzero(vlan_info,vlan_info_length);

-    strcpy(vlan_info,g_rtp_server_info.vlan_info);        

-   

-    return 0;  

-}

-int lynq_get_rtp_port(const LYNQ_Rtp_Mode rtp_mode, int* port)

-{

-    if(g_lynq_call_init_flag == 0)

-    {

-        return -1;

-    }

-    if(port==NULL)

-    {

-        return 1;

-    }   

-    if (rtp_mode == 0)

-    {

-        *port = g_rtp_client_info.port;

-    }

-    else if (rtp_mode == 1)

-    {

-        *port = g_rtp_server_info.port;

-    }

-    return 0;

-}

-int lynq_get_rtp_param(int* clock_rate, int* channels, int* latency)//only for client mode

-{

-    if(g_lynq_call_init_flag == 0)

-    {

-        return -1;

-    }

-    if(clock_rate == NULL || channels ==NULL || latency ==NULL)

-    {

-        LYERRLOG("input parameter is NULL");

-        return 1;

-    }

-

-    *clock_rate = g_rtp_client_info.clockrate;

-    *channels = g_rtp_client_info.channels ;

-    *latency = g_rtp_client_info.latency;

-

-    return 0;

-}

-/*Audio Path setting end*/

 

 #if 0

 int main(int argc,char **argv)

diff --git a/src/lynq/lib/liblynq-call/lynq_call_common.h b/src/lynq/lib/liblynq-call/lynq_call_common.h
new file mode 100755
index 0000000..21077df
--- /dev/null
+++ b/src/lynq/lib/liblynq-call/lynq_call_common.h
@@ -0,0 +1,23 @@
+#ifndef LYNQ_CALL_COMMON_H

+#define LYNQ_CALL_COMMON_H 

+

+#define INVALID_ID (-1)

+

+int find_call_id_with_call_id(int call_id);

+int addAddr(char addr[], int call_id);

+int waitCallstateChange(int mtime);

+void sendSignalToWaitCallStateChange();

+void lynqNoticeGetModuleCallList();

+int IsNormalCallDailing();

+int lynq_get_current_call_number();

+

+#ifdef ECALL_SUPPORT

+int lynq_ecall_is_running();

+int IsECallDialing();

+int Is_handup_IncomingMT(int ecall_id);

+using ::android::Parcel;

+void urc_ecall_msg_process(Parcel *p);

+#endif

+

+void lynq_init_rtp();

+#endif

diff --git a/src/lynq/lib/liblynq-call/lynq_call_ecall.cpp b/src/lynq/lib/liblynq-call/lynq_call_ecall.cpp
new file mode 100755
index 0000000..0c76262
--- /dev/null
+++ b/src/lynq/lib/liblynq-call/lynq_call_ecall.cpp
@@ -0,0 +1,703 @@
+#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_call.h"

+#include "lynq_module_common.h"

+#include "lynq_module_socket.h"

+#include "lynq_call_common.h"

+

+#define USER_LOG_TAG "LYNQ_CALL"

+

+using ::android::Parcel;

+

+#ifdef ECALL_SUPPORT

+typedef enum{        

+    LYNQ_ECALL_TYPE_TEST = 0,     /* Test eCall */

+    LYNQ_ECALL_TYPE_RECONFIG = 1,    /*    Reconfiguration eCall */    

+    LYNQ_ECALL_MANUAL_EMERGENCY = 2,   /*Manual Emergency eCall */

+    LYNQ_ECALL_TYPE_AUTO_EMERGENCY = 3,   /* Automatic Emergency eCall */

+}LYNQ_ECall_Type;

+typedef enum{   

+    LYNQ_ECALL_DAILING_STATE_NONE =0,

+    LYNQ_ECALL_DAILING_STATE_STARTED = 1,    

+    LYNQ_ECALL_DAILING_STATE_ANSWERED = 2,      

+}LYNQ_ECall_Dailing_State;

+static LYNQ_ECall_Dailing_State s_module_is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;

+int IsECallDialing()

+{

+    return s_module_is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE;

+}

+static int s_ecallId = INVALID_ID;

+char e_call_addr[LYNQ_ECALL_VAR_MAX][LYNQ_PHONE_NUMBER_MAX]={"test_ecall","emergency_ecall","reconf_ecall"};

+

+static pthread_mutex_t s_incoming_e_call_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_incoming_e_call_cond = PTHREAD_COND_INITIALIZER;

+static pthread_mutex_t s_ecall_variable_mutex = PTHREAD_MUTEX_INITIALIZER;

+

+static LYNQ_ECall_Indication s_IncomingEcallIndication;

+int s_IncomingEcallId=INVALID_ID;

+LYNQ_ECall_Variant s_EcallVariant=LYNQ_ECALL_VAR_NONE;

+int s_ecall_whether_preempt=0;

+

+void sendSignalIncomingECallEvent()

+{

+    LYINFLOG("send incoming ecall event signal");

+    pthread_mutex_lock(&s_incoming_e_call_mutex);

+    pthread_cond_signal(&s_incoming_e_call_cond);

+    pthread_mutex_unlock(&s_incoming_e_call_mutex);

+}

+

+int lynq_is_msd_suc(LYNQ_ECall_Indication lynqIncomingEcallIndication)

+{

+    if(LYNQ_ECALL_LLACK_RECEIVED == lynqIncomingEcallIndication ||

+       LYNQ_ECALL_ALACK_POSITIVE_RECEIVED == lynqIncomingEcallIndication ||

+       LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED == lynqIncomingEcallIndication ||

+     //LYNQ_ECALL_T5_TIMER_OUT  == lynqIncomingEcallIndication ||

+       LYNQ_ECALL_T6_TIMER_OUT  == lynqIncomingEcallIndication ||

+       LYNQ_ECALL_T7_TIMER_OUT  == lynqIncomingEcallIndication)

+    {

+           return 1;

+    }

+

+    return 0;

+}

+

+int lynq_ecall_is_running()

+{

+    return (s_module_is_ecall_dial!=LYNQ_ECALL_DAILING_STATE_NONE) || (s_ecallId !=INVALID_ID || s_EcallVariant == LYNQ_ECALL_CALLBACK);

+}

+

+void print_ecall_info()

+{

+     LYERRLOG("%s is ecall dial is %d, ecall id is %d, ecall vairant is %d, incoming ecall ind is %d, incoming ecall id is %d, whether preempt is %d",__func__,s_module_is_ecall_dial,s_ecallId,s_EcallVariant,s_IncomingEcallIndication,s_IncomingEcallId,s_ecall_whether_preempt);

+}

+

+int lynq_ecall_is_permit_in_call(int ecall_id)

+{

+    return s_EcallVariant == LYNQ_ECALL_CALLBACK && (s_ecallId ==INVALID_ID || s_ecallId ==ecall_id);

+}

+

+int Is_handup_IncomingMT(int ecall_id)

+{

+    pthread_mutex_lock(&s_ecall_variable_mutex);

+    int handupIncomingMT=lynq_ecall_is_running() && (lynq_ecall_is_permit_in_call(ecall_id)==false);   

+    pthread_mutex_unlock(&s_ecall_variable_mutex);  

+    return handupIncomingMT;

+}

+

+int lynq_ecall_is_in_voice()

+{

+    return (s_module_is_ecall_dial==LYNQ_ECALL_DAILING_STATE_NONE) && (s_ecallId !=INVALID_ID);

+}

+

+LYNQ_ECall_Variant lynq_get_lynq_ecall_variant_from_lynq_type(LYNQ_ECall_Type type)

+{

+    switch(type)

+    {

+        case LYNQ_ECALL_TYPE_TEST:

+            return LYNQ_ECALL_TEST;

+        case LYNQ_ECALL_TYPE_RECONFIG:

+            return LYNQ_ECALL_RECONFIG;

+        default:

+            return LYNQ_ECALL_EMERGENCY;

+    }

+}

+

+RIL_ECall_Variant lynq_get_ril_ecall_variant_from_lynq_variant(LYNQ_ECall_Variant type)

+{

+    switch(type)

+    {

+        case LYNQ_ECALL_TEST:

+            return ECALL_TEST;

+        case LYNQ_ECALL_RECONFIG:

+            return ECALL_RECONFIG;

+        default:

+            return ECALL_EMERGENCY;

+    }

+}

+

+RIL_ECall_Category lynq_get_ril_ecall_cat_from_lynq_cat(LYNQ_ECall_Category cat)

+{

+    switch(cat)

+    {

+        case LYNQ_EMER_CAT_MANUAL_ECALL:

+            return EMER_CAT_MANUAL_ECALL;        

+        default:

+            return EMER_CAT_AUTO_ECALL;

+    }

+}

+

+

+int lynq_set_test_num(LYNQ_ECall_Set_Type type, const char *test_num, int test_num_length)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+    if(test_num==NULL || test_num_length > LYNQ_PHONE_NUMBER_MAX )

+    {

+       LYERRLOG("test_num is null or test_num_length %d s greater than %d ",test_num_length,LYNQ_PHONE_NUMBER_MAX);

+       return LYNQ_E_PARAMETER_ANONALY;

+    }       

+    

+//    error=lynq_set_common_request(RIL_REQUEST_ECALL_SET_TEST_NUM,2,"%d %s",type,test_num);

+

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_ECALL_SET_TEST_NUM,2,"%d %s",type,test_num);

+    if(ret==RESULT_OK)

+    {

+        snprintf(e_call_addr[LYNQ_ECALL_TEST],LYNQ_PHONE_NUMBER_MAX,"%s",test_num);

+        delete p;        

+    }

+    return ret;    

+}

+

+int lynq_ecall_can_be_preempted(LYNQ_ECall_Variant old_variant,LYNQ_ECall_Variant new_variant)

+{

+    int ret;

+

+    if(old_variant == LYNQ_ECALL_EMERGENCY)

+    {

+        return false;

+    }

+    else if(new_variant == LYNQ_ECALL_EMERGENCY)

+    {

+        return true;

+    }

+    else if(old_variant==LYNQ_ECALL_DAILING_STATE_NONE)

+    {

+        return true;

+    }        

+    else 

+    {

+        ret = (s_ecall_whether_preempt & 0x01);

+    }

+    LYINFLOG("ecall clear conflict call, lynq_ecall_can_be_preempted is true");

+    return ret;

+}

+

+int lynq_clear_current_call()

+{

+    int cnt;

+    int ret=lynq_call_hungup_all();

+    

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("ecall clear conflict call,  hangup all failure");

+        return ret;

+    }       

+    cnt=0;

+    while(lynq_get_current_call_number()!=0 && cnt<80)

+    {

+        lynqNoticeGetModuleCallList();  

+        usleep(200 * 1000);//200ms

+        cnt++;                

+    }

+    if(lynq_get_current_call_number()!=0)

+    {

+        LYERRLOG("ecall clear conflict call, current call list can't cleared after 15s");

+        return LYNQ_E_INNER_ERROR;

+    } 

+

+    LYINFLOG("ecall clear conflict call, after %d 0.2s, call list  is cleared", cnt);         

+    return RESULT_OK;   

+}

+

+int lynq_clear_current_conflict_call(LYNQ_ECall_Variant old_variant,LYNQ_ECall_Variant new_variant)

+{

+    int cnt;

+    int ret;

+

+    if(lynq_ecall_is_running()==false)

+    {

+        if(lynq_get_current_call_number()==0)

+        {

+            LYINFLOG("ecall clear conflict call, no conflict ecall and normal call");

+        }

+        else if(s_ecall_whether_preempt & 0x02)

+        {

+            ret=lynq_clear_current_call();

+            LYERRLOG("ecall clear conflict call, relase current normal call ret is %d",ret);                         

+        }

+        return RESULT_OK;          

+    }

+

+    LYINFLOG("ecall clear conflict call, two ecall occure at the same time, new is %d, old is %d, g_preempt is %d",new_variant,old_variant,s_ecall_whether_preempt);

+

+    if(lynq_ecall_can_be_preempted(old_variant,new_variant)==false)

+    {

+        LYERRLOG("ecall clear conflict call, new ecall %d can't preempt old ecall %d",new_variant,old_variant);

+        return LYNQ_E_CONFLICT;

+    }    

+

+    ret=lynq_clear_current_call();

+    LYINFLOG("ecall clear conflict call, relase current call(including ecall) ret is %d",ret);    

+

+    if(s_module_is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)

+    {

+        sendSignalToWaitCallStateChange();  

+        LYINFLOG("ecall clear conflict call, stop ecall in dailing status");

+    }             

+    

+    cnt=0;

+    while(lynq_ecall_is_running() && cnt<80)

+    {

+        usleep(200 * 1000);//200ms

+        cnt++;

+    }

+  

+    if(lynq_ecall_is_running())

+    {

+        LYERRLOG("ecall clear conflict call, after 16s, lynq ecall is still running");        

+    }

+    else

+    {

+        LYINFLOG("ecall clear conflict call, after %d 0.2s, ecall info is cleared", cnt);           

+    }

+

+    sleep(3);// for ecall disconnect

+    print_ecall_info();        

+    return RESULT_OK;   

+}

+

+int lynq_fast_ecall(int* handle, LYNQ_ECall_Category lynq_ecall_cat, LYNQ_ECall_Variant lynq_ecall_variant,  const char *addr, int addr_length, const unsigned char *msd_data,int msd_length)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+    RIL_ECall_Variant ril_ecall_variant = lynq_get_ril_ecall_variant_from_lynq_variant (lynq_ecall_variant);

+    RIL_ECall_Category ril_ecall_cat = lynq_get_ril_ecall_cat_from_lynq_cat(lynq_ecall_cat);

+    char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};

+    unsigned int i;          

+   

+    if(msd_length > MSD_MAX_LENGTH || msd_length <=0 || lynq_ecall_variant >=LYNQ_ECALL_MO_MAX)

+    {

+        LYERRLOG("lynq_fast_ecall msd_length %d or ecall variant %d parameter error",msd_length,lynq_ecall_variant);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }     

+

+    if(lynq_clear_current_conflict_call(s_EcallVariant,lynq_ecall_variant)!=0)

+    {

+         LYERRLOG("%s call lynq_clear_current_conflict_call false, old is %d, new is %d",__func__,s_EcallVariant,lynq_ecall_variant);

+         return LYNQ_E_CONFLICT;

+    }  

+

+    pthread_mutex_lock(&s_ecall_variable_mutex);

+    s_module_is_ecall_dial = LYNQ_ECALL_DAILING_STATE_STARTED;

+    s_EcallVariant = lynq_ecall_variant;

+    s_ecallId = INVALID_ID;

+    pthread_mutex_unlock(&s_ecall_variable_mutex);

+

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

+    {

+        sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);

+    }    

+

+

+    LYINFLOG("lynq_fast_ecall addr is %s",e_call_addr[lynq_ecall_variant]);

+

+//  error=lynq_set_common_request(RIL_REQUEST_ECALL_FAST_MAKE_ECALL,4,"%d %d %s %s",ril_ecall_cat, ril_ecall_variant, "null", lynq_msd_data);

+

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_ECALL_FAST_MAKE_ECALL,4,"%d %d %s %s",ril_ecall_cat, ril_ecall_variant, "null", lynq_msd_data);

+    if(ret!=RESULT_OK)

+    {

+        pthread_mutex_lock(&s_ecall_variable_mutex);

+        s_module_is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;

+        s_EcallVariant = LYNQ_ECALL_VAR_NONE;

+        s_ecallId = INVALID_ID;

+        pthread_mutex_unlock(&s_ecall_variable_mutex);

+        return ret;      

+    }

+    

+    delete p;   

+    if(waitCallstateChange(270000)==ETIMEDOUT)//4.5 min, dailing 1 min, alerting 1 min, sending msd 30s, redial 2min

+    {

+        pthread_mutex_lock(&s_ecall_variable_mutex);

+        LYERRLOG("lynq_fast_ecall timeout:wait Call state time out!!!");                   

+        s_module_is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;            

+        lynqNoticeGetModuleCallList();  

+        pthread_mutex_unlock(&s_ecall_variable_mutex);

+        return LYNQ_E_TIME_OUT;

+    }

+    pthread_mutex_lock(&s_ecall_variable_mutex);

+    if(s_module_is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)

+    {

+        /*just dail, no recv answer*/

+        LYERRLOG("lynq_fast_ecall, no answer!");   

+        s_module_is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;

+        lynqNoticeGetModuleCallList();   

+        pthread_mutex_unlock(&s_ecall_variable_mutex);

+        return LYNQ_E_ECALL_DAILING_NO_ANSWER;            

+    }

+    

+    s_module_is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;

+    lynqNoticeGetModuleCallList();        

+    

+    if(s_ecallId != INVALID_ID)

+    {

+        *handle=s_ecallId;         

+        LYINFLOG("lynq_fast_ecall id is %d",s_ecallId);

+        pthread_mutex_unlock(&s_ecall_variable_mutex);

+        return RESULT_OK;   

+    }

+

+    LYERRLOG("lynq_fast_ecall service return fail");

+    pthread_mutex_unlock(&s_ecall_variable_mutex);      

+    return LYNQ_E_INVALID_ID_ANONALY;                       

+    

+}

+

+int lynq_set_psap(int enable)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+//  return lynq_set_common_request(RIL_REQUEST_ECALL_SET_PSAP,1,"%d",enable);    

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_ECALL_SET_PSAP,1,"%d",enable);

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

+}

+

+int lynq_psap_pull_msd()

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+//    return lynq_set_common_request(RIL_REQUEST_ECALL_PSAP_PULL_MSD,0,"");  

+    Parcel* p=NULL;

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

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

+}

+

+int lynq_make_ecall(int* handle, LYNQ_ECall_Type type)

+{

+    return RESULT_OK;   

+#if 0

+    LYNQ_ECall_Variant lynq_ecall_variant;

+    int error = -1;

+    int lynq_call_id = -1;

+

+    if(handle==NULL)

+    {

+        LYERRLOG("handle is NULL, parameter error  ");

+           return -1;

+    }

+    

+    error=lynq_set_common_request(RIL_REQUEST_ECALL_MAKE_ECALL,1,"%d",type);   

+    

+    if(error==0)

+    {

+        lynq_ecall_variant=lynq_get_lynq_ecall_variant_from_lynq_type(type);

+      

+        lynq_call_id = addAddr(e_call_addr[lynq_ecall_variant]);

+        s_module_isDial = 1;

+        if(waitCallstateChange(10000)==ETIMEDOUT)//10000ms

+        {

+            error = LYNQ_E_TIME_OUT;

+            LYERRLOG("timeout:wait Call state fail!!!");

+            return error;

+        }

+ 

+        *handle = lynq_call_id;

+    }

+

+    return error;

+#endif

+}

+

+

+int lynq_set_msd(int* handle, const unsigned char *msd_data, int msd_length)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+    char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};

+    unsigned int i;

+

+    if(handle==NULL || ((*handle) >= LYNQ_CALL_MAX) || msd_length > MSD_MAX_LENGTH || msd_length <= 0 || msd_data ==NULL)

+    {

+        LYERRLOG("lynq_set_msd handle is NULL or *handle %d is greater or equeal to %d or msd_length %d is greater than %d or msd_data %s is NULL, parameter error",*handle,LYNQ_CALL_MAX,msd_length,MSD_MAX_LENGTH, msd_data);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }    

+

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

+    {

+        sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);

+    }   

+

+    LYINFLOG("lynq_set_msd ");    

+

+//    return lynq_set_common_request(RIL_REQUEST_ECALL_SET_MSD,2,"%d %s",*handle,lynq_msd_data);

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_ECALL_SET_MSD,2,"%d %s",*handle,lynq_msd_data);

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

+}

+

+int lynq_set_ivs(int enable)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+    if(enable<0)

+    {

+       if(enable >-100)

+       {

+           goto set_ivs_end;

+//         lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);

+       }

+       else  if(enable== -1000)

+       {

+           print_ecall_info();

+       } 

+       else

+       {

+           s_ecall_whether_preempt= ((-100-enable) & 0x11);           

+       }

+       return RESULT_OK;   

+    }

+

+//  return lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);  

+set_ivs_end:

+    Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

+}

+

+int lynq_reset_ivs()

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+//  return lynq_set_common_request(RIL_REQUEST_ECALL_RESET_IVS,0,"");

+    Parcel* p=NULL;

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

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

+}

+

+int lynq_ivs_push_msd()

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+//  return lynq_set_common_request(RIL_REQUEST_ECALL_IVS_PUSH_MSD,0,"");  

+    Parcel* p=NULL;

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

+    if(ret==RESULT_OK)

+    {

+        delete p;        

+    }

+    return ret;

+}

+

+int wait_ecall_event()

+{

+    int ret = 0;

+    pthread_mutex_lock(&s_incoming_e_call_mutex);

+    ret = pthread_cond_wait(&s_incoming_e_call_cond,&s_incoming_e_call_mutex);

+    pthread_mutex_unlock(&s_incoming_e_call_mutex); 

+    return ret;

+}

+

+int lynq_wait_ecall_indication(int* handle, LYNQ_ECall_Indication *eCall_Indication)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+    wait_ecall_event();

+    *handle = s_IncomingEcallId;

+    *eCall_Indication = s_IncomingEcallIndication;  

+    LYINFLOG("lynq_wait_ecall_indication handle %d, Ind id: %d", *handle, *eCall_Indication);

+    return RESULT_OK;  

+}

+void urc_ecall_msg_process(Parcel *p)

+{ 

+    int ecall_ind;

+    int ecallId;

+    int send_signal_to_wait_call_state;

+    int handup_ecall_id;

+    

+    pthread_mutex_lock(&s_ecall_variable_mutex);

+    send_signal_to_wait_call_state = false;

+    handup_ecall_id=false;

+    p->readInt32(&ecall_ind);   

+    s_IncomingEcallIndication = ecall_ind;

+    p->readInt32(&ecallId);

+    s_IncomingEcallId = ecallId;

+    LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS ,Id %d, ind %d, ecall dialing is %d, normal dialing is %d, local ecall id is %d",ecallId,ecall_ind,s_module_is_ecall_dial,IsNormalCallDailing(),s_ecallId);

+    switch (s_IncomingEcallIndication) 

+    {

+       case LYNQ_ECALL_ACTIVE:

+            if(s_module_is_ecall_dial)

+            {

+                s_module_is_ecall_dial = LYNQ_ECALL_DAILING_STATE_ANSWERED;

+            }

+            break;

+       case LYNQ_ECALL_SENDING_START:

+            if(lynq_ecall_is_in_voice())

+            {

+                LYINFLOG("recv msd in voice, ind is changed to %d",LYNQ_ECALL_SENDING_START_IN_VOICE);

+                s_IncomingEcallIndication = LYNQ_ECALL_SENDING_START_IN_VOICE; 

+            }

+            break;

+       case LYNQ_ECALL_LLACK_RECEIVED:

+       case LYNQ_ECALL_ALACK_POSITIVE_RECEIVED:

+       case LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED:

+       //case LYNQ_ECALL_T5_TIMER_OUT:  /*when Certificate CP 1.1.10.2, no msd start (ind 1), so T5 timeout is not regard as success*/

+       case LYNQ_ECALL_T6_TIMER_OUT:

+       case LYNQ_ECALL_T7_TIMER_OUT:                          

+           if(s_module_is_ecall_dial)

+           {

+               LYINFLOG("ecall is dialing, recv suc indication");

+               s_module_is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;

+               if(ecallId >0 && find_call_id_with_call_id(ecallId)==INVALID_ID)

+               {

+                     LYINFLOG("add ecall in loacl list");

+                     s_ecallId = ecallId;

+                     addAddr("ecall",s_ecallId);               

+               } 

+               send_signal_to_wait_call_state=true;                             

+           }        

+           else if(ecallId >0 && (find_call_id_with_call_id(ecallId)==INVALID_ID) &&  (s_EcallVariant != LYNQ_ECALL_CALLBACK))

+           {

+               LYERRLOG("ecall is not in dialing and first recv suc indication, hangup");

+               handup_ecall_id=true;

+           }   

+           else 

+           {

+               LYERRLOG("ecall is not in dialing and not first recv suc indication");

+           }

+           break;

+       case LYNQ_ECALL_PSAP_CALLBACK_START:                            

+           if(lynq_ecall_is_running()==0)

+           {

+               if(ecallId>0)

+               {                                

+                   LYINFLOG("ecall is not running, recv psap call back msd start, set ecall running");

+                   s_EcallVariant = LYNQ_ECALL_CALLBACK;

+                   s_ecallId = ecallId;

+                   if(IsNormalCallDailing())

+                   {

+                       LYINFLOG("stop normal dial");

+                       send_signal_to_wait_call_state=true;                               

+                   }

+                   else 

+                   {

+                       LYINFLOG("no normal dial");

+                   }  

+               }

+               else 

+               {

+                   LYERRLOG("ecallId is abnormal in psap callback");

+               }

+           }                           

+           else 

+           {

+               LYERRLOG("ecall is running, recv psap call back msd start");

+           }

+           break;                       

+       case LYNQ_ECALL_ABNORMAL_HANGUP:

+           if(s_module_is_ecall_dial == LYNQ_ECALL_DAILING_STATE_NONE)                             

+           {

+               LYERRLOG("ecall is not in dialing , recv abnormal hangup");

+               s_ecallId = INVALID_ID;

+           }

+           else if (s_module_is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)

+           {

+               LYERRLOG("ecall is in dialing state, recv no answer, recv abnormal hangup, dont' redial");

+               s_ecallId = INVALID_ID;

+               send_signal_to_wait_call_state=true;                                                    

+           }    

+           else {

+               LYINFLOG("ecall is in dialing and recv answer, recv abnormal hangup");

+           }

+           break;

+       case LYNQ_ECALL_DISCONNECTED:

+       case LYNQ_ECALL_REDIAL_TIMER_OUT:

+       case LYNQ_ECALL_T2_TIMER_OUT :

+       case LYNQ_ECALL_IMS_DISCONNECTED:                           

+           s_ecallId = INVALID_ID;

+           if(s_EcallVariant == LYNQ_ECALL_CALLBACK)

+           {

+               s_EcallVariant = LYNQ_ECALL_VAR_NONE; /*other type, needn't re-initialize*/

+           }

+           if(s_module_is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)

+           {

+               LYERRLOG("ecall is in dialing, recv like disconnect indication");

+               s_module_is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;                         

+               send_signal_to_wait_call_state=true;                               

+           }

+           else 

+           {

+               LYINFLOG("ecall is not in dialing, recv like disconnect indication");

+           }

+           break;

+       default:                          

+           LYINFLOG("not special indication");

+    }                         

+    pthread_mutex_unlock(&s_ecall_variable_mutex);

+    if(send_signal_to_wait_call_state)

+    {

+        sendSignalToWaitCallStateChange();

+    }                    

+    sendSignalIncomingECallEvent();

+    if(handup_ecall_id)

+    {

+        lynq_call_hungup(&ecallId);

+    }

+    LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS, local ecall id is %d", s_ecallId);

+    return;

+}

+#endif

diff --git a/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp b/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp
new file mode 100755
index 0000000..f217c25
--- /dev/null
+++ b/src/lynq/lib/liblynq-call/lynq_call_rtp.cpp
@@ -0,0 +1,357 @@
+

+#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 "lynq_call.h"

+#include "lynq_module_common.h"

+#include "lynq_call_common.h"

+

+#define RTP_FROM_CMD "gst-launch-1.0 -v udpsrc port=%d caps=\'application/x-rtp, media=(string)audio, clock-rate=(int)%d, channels=(int)%d\' ! rtpjitterbuffer latency=%d ! rtppcmadepay ! alawdec ! audioresample ! audioconvert ! alsasink device=\'hw:0,2\'"

+#define RTP_TO_CMD   "gst-launch-1.0 -v alsasrc device=\'hw:0,6\' ! audioconvert ! audioresample ! alawenc ! rtppcmapay ! udpsink host=%s %s auto-multicast=true port=%d"

+#define RTP_VLAN_INFO_FORMAT "multicast-iface=\"%s\""

+#define USER_LOG_TAG "LYNQ_CALL"

+

+typedef struct

+{   

+    char ip[MAX_IP_LENGTH];

+    int port;   

+    char vlan_info[MAX_VLAN_INFO_LENGTH];

+}lynq_rtp_server_info;

+

+typedef struct

+{       

+    int port;

+    int clockrate;  

+    int latency;

+    int channels;

+}lynq_rtp_client_info;

+

+static lynq_rtp_client_info g_rtp_client_info;

+static lynq_rtp_server_info g_rtp_server_info;

+

+static pthread_t g_rtp_thread[RTP_MODE_MAX];

+static bool g_rtp_thread_valid[RTP_MODE_MAX];

+

+void lynq_init_rtp()

+{   

+    memset(&g_rtp_client_info,0,sizeof(g_rtp_client_info));

+    memset(&g_rtp_server_info,0,sizeof(g_rtp_server_info));    

+  

+

+    lynq_set_rtp_param(8000,1,400);

+

+    for(int i=0;i<RTP_MODE_MAX;i++)

+    {

+        lynq_set_rtp_port(i,6666);

+        g_rtp_thread_valid[i] = 0;

+    }          

+    

+    LYDBGLOG("lynq init rtp success!!!");

+    return;

+}

+

+/*Audio Path setting begin*/

+/*sub function*/

+void lynq_set_rtp_mixer_ctrl(int enable_rtp)

+{

+    char cmd[256];

+    LYINFLOG("set_rtp_mixer_ctrl %d", enable_rtp);

+    if(enable_rtp)

+    {

+        sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 0);

+        system(cmd);

+        sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 1);

+        system(cmd);

+        sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 1);

+        system(cmd);

+        sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 1);

+        system(cmd);

+        sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 1);

+        system(cmd);

+        sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 1);

+        system(cmd);    

+    }

+    else 

+    {

+        sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 1);

+        system(cmd);

+        sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 0);

+        system(cmd);

+        sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 0);

+        system(cmd);

+        sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 0);

+        system(cmd);

+        sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 0);

+        system(cmd);

+        sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 0);

+        system(cmd);    

+    }    

+}

+

+void* lynq_start_rtp_cmd(void *arg)

+{

+    int* rtp_mode= (int*) arg;

+    char cmd[384];

+    char vlan_para_string[sizeof(RTP_VLAN_INFO_FORMAT)+MAX_VLAN_INFO_LENGTH-2/*sizeof "%s"*/]={0};

+    LYINFLOG("lynq_start_rtp_cmd: rtp_mode is %d",(*rtp_mode));    

+    if ((*rtp_mode) == RTP_CLIENT)

+    {

+        sprintf(cmd,RTP_FROM_CMD, \

+            g_rtp_client_info.port,g_rtp_client_info.clockrate,g_rtp_client_info.channels, \

+            g_rtp_client_info.latency);            

+    //  LYINFLOG("start from rtp play: cmd is %s",cmd);    

+        system(cmd);

+    }

+    else if ((*rtp_mode) == RTP_SERVER)

+    {

+        if(strlen(g_rtp_server_info.vlan_info)>0)

+        {

+           sprintf(vlan_para_string,RTP_VLAN_INFO_FORMAT,g_rtp_server_info.vlan_info);

+        }

+        sprintf(cmd,RTP_TO_CMD,   \

+        g_rtp_server_info.ip,vlan_para_string,g_rtp_server_info.port);       

+        

+    //  LYINFLOG("start to rtp play: cmd is %s",cmd);

+        system(cmd);    

+    }

+    return NULL;

+}

+

+int lynq_start_rtp_thread(int rtp_mode)

+{

+    int ret;

+    pthread_attr_t attr;

+    static int start_mode[RTP_MODE_MAX]={0,1};  

+

+    pthread_attr_init(&attr);

+    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

+    ret = pthread_create(&(g_rtp_thread[rtp_mode]),&attr,lynq_start_rtp_cmd,&(start_mode[rtp_mode]));

+    if(ret != 0)

+    {

+        g_rtp_thread_valid[rtp_mode]=0;

+        LYERRLOG("rtp create %d pthread error, ret is %d",rtp_mode, ret);

+        return ret;

+    }

+    g_rtp_thread_valid[rtp_mode]=1;

+    return RESULT_OK;  

+}

+

+/*set*/

+int lynq_set_voice_audio_mode(const LYNQ_Audio_Mode audio_mode)

+{

+    int ret;

+    int i;

+    

+    if(audio_mode==AUDIO_MODE_RTP)

+    {

+        lynq_set_rtp_mixer_ctrl(1);

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

+        {

+            if(!g_rtp_thread_valid[i])

+            {

+                if(lynq_start_rtp_thread(i)!= 0)

+                {

+                    LYERRLOG("start rtp %d fail",i);

+                    break;

+                }

+                else 

+                {

+                    LYINFLOG("start rtp %d suc",i);        

+                }

+            }

+            else 

+            {

+                LYERRLOG("rtp %d needn't start",i); 

+            }

+        }

+        if(i!= RTP_MODE_MAX)            

+        {

+            LYERRLOG("start rtp whole fail");

+            lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);

+            return RESULT_ERROR;

+        }

+        LYINFLOG("start rtp whole suc");          

+        return RESULT_OK;  

+    }

+    else if(audio_mode==AUDIO_MODE_CODEC)

+    {

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

+        {

+            if(g_rtp_thread_valid[i]) 

+            {

+                 ret = pthread_cancel(g_rtp_thread[i]);

+                 LYINFLOG("pthread cancel rtp %d ret = %d",i,ret);

+                 ret = pthread_join(g_rtp_thread[i],NULL);

+                 LYINFLOG("pthread join rtp %d ret = %d",i,ret);

+                 g_rtp_thread_valid[i] = 0;

+            }

+            else 

+            {

+                LYINFLOG("rtp %d needn't stop",i);

+            }

+        }

+        lynq_set_rtp_mixer_ctrl(0);     

+        LYINFLOG("stop rtp suc");

+    }

+    return RESULT_OK;    

+}

+int lynq_set_remote_rtp_ip(const char* ip, const int ip_length)

+{

+    if (NULL == ip)

+    {

+        LYERRLOG("ip is NULL!!!");

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+    if ((ip_length < strlen(ip)+1) || (ip_length > MAX_IP_LENGTH))

+    {

+        LYERRLOG("incoming ip length error %d", ip_length);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }    

+

+    bzero(g_rtp_server_info.ip,MAX_IP_LENGTH);

+    strcpy(g_rtp_server_info.ip,ip);

+    

+    LYINFLOG("lynq_set_remote_rtp_ip suc: ip is %s, length is %d", ip,ip_length);

+    

+    return RESULT_OK;  

+}

+int lynq_set_vlan_info(const char* vlan_info, const int vlan_info_length)

+{

+    if (NULL == vlan_info)

+    {

+        LYERRLOG("vlan_info is NULL!!!");

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+    

+    if ((vlan_info_length < strlen(vlan_info)+1) || (vlan_info_length > MAX_VLAN_INFO_LENGTH))

+    {

+        LYERRLOG("incoming vlan_info error, vlan info length %d", vlan_info_length);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }    

+

+    

+    bzero(g_rtp_server_info.vlan_info,MAX_VLAN_INFO_LENGTH);

+    strcpy(g_rtp_server_info.vlan_info,vlan_info);

+   

+    LYINFLOG("lynq_set_vlan_info suc: vlan is %s, length is %d", vlan_info,vlan_info_length);

+    

+    return RESULT_OK;  

+}

+int lynq_set_rtp_port(const LYNQ_Rtp_Mode rtp_mode, const int port)

+{  

+    if (port < 0)

+    {

+        LYERRLOG("invalid port number %d", port);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+    if (rtp_mode == 0)

+    {

+        g_rtp_client_info.port = port;

+    }

+    else if (rtp_mode == 1)

+    {

+        g_rtp_server_info.port = port;

+    }

+    LYINFLOG("lynq_set_rtp_port suc: LYNQ_Rtp_Mode is %d, port is %d", rtp_mode, port);

+    return RESULT_OK;  

+}

+int lynq_set_rtp_param(const int clock_rate,const int channels,const int latency) //only for client mode

+{

+    g_rtp_client_info.clockrate = clock_rate;

+    g_rtp_client_info.channels = channels;

+    g_rtp_client_info.latency = latency;

+    LYINFLOG("lynq_set_rtp_param suc: clockrate is %d, channels is %d, latency is %d", clock_rate, channels, latency);

+    return RESULT_OK;  

+}

+/*get*/

+LYNQ_Audio_Mode lynq_get_voice_audio_mode()

+{

+    if(g_rtp_thread_valid[0])

+    {

+        return AUDIO_MODE_RTP;

+    }

+    else 

+    {

+        return AUDIO_MODE_CODEC;

+    }

+}

+int lynq_get_remote_rtp_ip(char* ip, const int ip_length)

+{

+    if(ip==NULL)

+    {

+        LYERRLOG("ip is NULL");

+        return LYNQ_E_PARAMETER_ANONALY;

+    }    

+

+    if(ip_length < strlen(g_rtp_server_info.ip)+1)

+    {

+        LYERRLOG("ip length %d is shorter than saved ip length %d",ip_length,strlen(g_rtp_server_info.ip)+1);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+    

+    bzero(ip,ip_length);

+    strcpy(ip,g_rtp_server_info.ip);

+    

+    return RESULT_OK;  

+}

+int lynq_get_vlan_info(char* vlan_info, const int vlan_info_length)

+{

+    if(vlan_info==NULL) 

+    {

+        LYERRLOG("vlan info is NULL");

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+

+    if(vlan_info_length < strlen(g_rtp_server_info.vlan_info)+1)

+    {

+        LYERRLOG("vlan info length %d is shorter than saved vlan info length %d",vlan_info_length,strlen(g_rtp_server_info.vlan_info)+1);

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+   

+    bzero(vlan_info,vlan_info_length);

+    strcpy(vlan_info,g_rtp_server_info.vlan_info);        

+   

+    return RESULT_OK;  

+}

+int lynq_get_rtp_port(const LYNQ_Rtp_Mode rtp_mode, int* port)

+{

+    if(port==NULL)

+    {

+        return LYNQ_E_PARAMETER_ANONALY;

+    }   

+    if (rtp_mode == 0)

+    {

+        *port = g_rtp_client_info.port;

+    }

+    else if (rtp_mode == 1)

+    {

+        *port = g_rtp_server_info.port;

+    }

+    return RESULT_OK;  

+}

+int lynq_get_rtp_param(int* clock_rate, int* channels, int* latency)//only for client mode

+{

+    if(clock_rate == NULL || channels ==NULL || latency ==NULL)

+    {

+        LYERRLOG("input parameter is NULL");

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+

+    *clock_rate = g_rtp_client_info.clockrate;

+    *channels = g_rtp_client_info.channels ;

+    *latency = g_rtp_client_info.latency;

+

+    return RESULT_OK;  

+}

diff --git a/src/lynq/lib/liblynq-call/lynq_module_common.h b/src/lynq/lib/liblynq-call/lynq_module_common.h
new file mode 100755
index 0000000..9e70d6c
--- /dev/null
+++ b/src/lynq/lib/liblynq-call/lynq_module_common.h
@@ -0,0 +1,73 @@
+#ifndef LYNQ_MODULE_COMMON_H

+#define LYNQ_MODULE_COMMON_H 

+

+#define RESULT_OK (0)

+#define RESULT_ERROR (-1)

+

+/*the same with lynq_interface.h begin*/

+#define LYNQ_REQUEST_VENDOR_BASE 8000
+#define LYNQ_URC_VENDOR_BASE 9000
+#define LYNQ_AT_SNED (LYNQ_REQUEST_VENDOR_BASE +1)
+#define LYNQ_URC_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+1)
+#define LYNQ_URC_DATA_STATUS_IND (LYNQ_URC_VENDOR_BASE+2)
+#define LYNQ_URC_DATA_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+3)
+#define LYNQ_AUTO_ANSWER_CALL (LYNQ_REQUEST_VENDOR_BASE +2)
+#define LYNQ_REQUEST_SET_DTMF_VOLUME (LYNQ_REQUEST_VENDOR_BASE +3)
+#define LYNQ_URC_MODIFY_APNDB (LYNQ_URC_VENDOR_BASE+4)
+#define LYNQ_URC_RESET_APNDB (LYNQ_URC_VENDOR_BASE+5)
+
+
+#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)
+#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL (LYNQ_REQUEST_VENDOR_BASE + 8)
+
+#define LYNQ_REQUEST_SET_SPEECH_VOLUME (LYNQ_REQUEST_VENDOR_BASE +9)
+#define LYNQ_REQUEST_GET_SPEECH_VOLUME (LYNQ_REQUEST_VENDOR_BASE +10)
+#define LYNQ_REQUEST_RECORD  (LYNQ_REQUEST_VENDOR_BASE +11)
+#define LYNQ_REQUEST_OOS_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +12)
+#define LYNQ_REQUEST_OOS_DEEP_SLEEP_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +13)

+/*the same with lynq_interface.h end*/

+

+typedef enum{

+    /*base abnormal*/

+    LYNQ_E_PARAMETER_ANONALY=7000,

+    LYNQ_E_SEND_REQUEST_FAIL=7001,

+    LYNQ_E_GET_HEAD_ERROR=7002,

+    LYNQ_E_INNER_ERROR=7100,

+    LYNQ_E_MALLOC_ERROR=7101,

+    /**/

+    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,

+     /*Invalid id anomaly*/

+    LYNQ_E_INVALID_ID_ANONALY=9002,

+#ifdef ECALL_SUPPORT

+    LYNQ_E_ECALL_BEING_RUNNING =9003,

+    LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,

+    LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,

+#endif

+}LYNQ_E;

+

+#define MODULE_CLOSED (0)

+#define MODULE_SWITCHING  (1)

+#define MODULE_RUNNING (2)

+

+extern int g_module_init_flag;

+

+#endif

diff --git a/src/lynq/lib/liblynq-call/lynq_module_socket.cpp b/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
new file mode 100755
index 0000000..71862a8
--- /dev/null
+++ b/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
@@ -0,0 +1,547 @@
+#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 <list>

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

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

+#include "lynq_call.h"

+#include "lynq_module_common.h"

+#include "lynq_module_socket.h"

+#include "liblog/lynq_deflog.h"

+

+#define LYNQ_SERVICE_PORT 8088

+#define LYNQ_ADDRESS "127.0.0.1"

+#define LYNQ_URC_SERVICE_PORT 8086

+#define LYNQ_URC_ADDRESS "0.0.0.0"

+#define LYNQ_REQUEST_PARAM_BUF 8192

+#define LYNQ_REC_BUF 8192

+

+#define USER_LOG_TAG "LYNQ_NETWORK"

+

+typedef struct{

+    int uToken;

+    int request;

+    int paramLen;

+    char param[LYNQ_REQUEST_PARAM_BUF];

+}lynq_client_t;

+

+typedef struct{

+    int resp_type;

+    int token;

+    int request;

+    int slot_id;

+    int error;

+}lynq_resp_t;

+

+lynq_client_t client_t;

+lynq_resp_t response;

+

+int module_len_rc_addr_serv;

+int module_len_urc_addr_serv;

+struct sockaddr_in module_rc_addr_serv;

+struct sockaddr_in module_urc_addr_serv;

+static int module_rc_sock_fd = -1;

+static int module_urc_sock_fd = -1;

+int module_urc_status = 1;

+int module_rc_status = 1;

+pthread_t module_urc_tid = -1;

+pthread_t module_rc_tid = -1;

+static pthread_mutex_t s_urc_mutex = PTHREAD_MUTEX_INITIALIZER;

+

+/*hq add for set waiting time 2022/09/13 begin*/

+static pthread_mutex_t s_sendto_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_mutex_t s_RecvMsgBlockMutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_WaitRecvMsgCond = PTHREAD_COND_INITIALIZER;

+#define BLOCK_RECV_MSG_LOCK() pthread_mutex_lock(&s_RecvMsgBlockMutex)

+#define BLOCK_RECV_MSG_UNLOCK() pthread_mutex_unlock(&s_RecvMsgBlockMutex)

+#define BLOCK_WAIT_RECV_MSG_TIME_OUT(a) pthread_cond_timedwait(&s_WaitRecvMsgCond, &s_RecvMsgBlockMutex,(a))

+#define BLOCK_WAKEUP_RECV_MSG() pthread_cond_broadcast(&s_WaitRecvMsgCond)

+static std::list<Parcel*> s_recv_parcel_list;

+const int waitResponse(int token,int time_out);

+/*hq add for set waiting time 2022/09/13 end*/

+

+int g_module_Global_uToken = 0;

+int g_wait_time=5;

+

+/*inner test*/

+static int s_inner_test=0;

+

+/**@brief just for inner test

+* @param test_mode [IN]: test mode

+*  0:success

+*  other:failure

+*/

+void lynq_set_test_mode(const int test_mode)

+{

+    if(test_mode<0)

+    {

+        g_wait_time = -test_mode;          

+    }

+    else if(test_mode==9999)

+    {

+        LYERRLOG("%s inner test para %d %d",__func__,s_inner_test,g_wait_time);         

+    }    

+    else 

+    {

+        s_inner_test = test_mode;    

+    }

+}

+

+void cleanup_RecvMsgBlock_mutex(void *arg)

+{

+    BLOCK_RECV_MSG_UNLOCK(); 

+}

+

+/**@brief wait response with expected token and write msg to parcel in some time

+* @param p [IN]: pointer the parcel

+* @param token [IN]: the expected token for the response msg

+* @param time_out [IN]: timeout.

+* @return

+*  0:success

+*  other:failure

+*/

+const int waitResponse(Parcel*& p, int token,int time_out)

+{
+    int waitToken = token;

+    int wakeup_token=-1;

+    int resp_type;

+    struct timeval now;
+    struct timespec timeout;  

+    int ret;

+    std::list<Parcel*>::iterator iter;

+    int cnt=0;

+    

+	gettimeofday(&now,NULL);

+    timeout.tv_sec = now.tv_sec+time_out; //timeout is 1min

+    timeout.tv_nsec = now.tv_usec*1000;
+
+    LYINFLOG("%s wait token is %d, wait time is %d",__func__,waitToken,time_out);

+    

+    BLOCK_RECV_MSG_LOCK();

+    pthread_cleanup_push(cleanup_RecvMsgBlock_mutex, NULL); // thread cleanup handler

+    while(module_rc_status) { 

+        cnt++;

+        for(iter=s_recv_parcel_list.begin();iter!=s_recv_parcel_list.end();++iter)

+        {

+            (*iter)->setDataPosition(0);

+            (*iter)->readInt32(&resp_type);

+            (*iter)->readInt32(&wakeup_token);

+            if(wakeup_token==waitToken)

+            {

+                LYINFLOG("%s get waitToken",__func__);

+                p=(*iter);

+                p->setDataPosition(0);

+                s_recv_parcel_list.erase(iter);

+                goto waitResponse_end;

+            }

+        }

+        LYINFLOG("%s no wait Token in msg list, list size is %d",__func__,s_recv_parcel_list.size());

+        ret=BLOCK_WAIT_RECV_MSG_TIME_OUT(&timeout);

+        if(ret!=0)

+        {

+            LYERRLOG("%s no expected token %d after %d second",__func__,waitToken,time_out);

+            break;

+        }        

+    }

+waitResponse_end:

+    LYINFLOG("%s wait token is %d wakeup_token is %d, cnt is %d",__func__,waitToken,wakeup_token,cnt);

+    pthread_cleanup_pop(0);

+    BLOCK_RECV_MSG_UNLOCK(); 

+    return wakeup_token==waitToken ? 0:LYNQ_E_TIME_OUT;

+}

+

+/**@brief print solicied response msg's head information

+* @param head [IN]: head information

+* @return none

+*/

+void PrintHeader(lynq_resp_t& head)

+{

+    LYINFLOG("resp_type=%d,token=%d,request=%d,slot_id=%d,error_code=%d",head.resp_type,head.token,head.request,head.slot_id,head.error);

+}

+

+/**@brief get solicied response msg's head

+* @param head [OUT]: head information

+* @return

+*  0:success

+*  other:failure

+*/

+int GetHeader(Parcel* &p, lynq_resp_t& head)

+{

+    LYINFLOG("get header");

+    if(p->dataAvail() > 0)

+    {

+        p->readInt32(&(head.resp_type));

+        p->readInt32(&(head.token));

+        p->readInt32(&(head.request));

+        p->readInt32(&(head.slot_id));

+        p->readInt32(&(head.error));

+        PrintHeader(head);

+        return RESULT_OK;  

+    }

+    else

+    {

+        return RESULT_ERROR;  

+    }

+}

+

+/**@brief send msg to service and get response from service

+* @param request_id [IN]: request id

+* @param time_out [IN]: wait time uplimit

+* @param p [IN]: point to response msg's parcel

+* @param argc [IN]: how many parameters in parameter string

+* @param format [IN]: parameter string's format

+* @param ... [IN]: the specific parameter

+* @return

+*  0:success

+*  other:failure

+*/

+int lynq_send_common_request(Parcel*& p, int time_out, int request_id, int argc, const char* format,...)

+{

+    lynq_client_t client;

+    int ret;

+    int send_num;

+    

+    client.uToken = g_module_Global_uToken;

+    g_module_Global_uToken=(g_module_Global_uToken+1)%10000;/*0-10000*/

+    client.request = request_id;

+    client.paramLen = argc;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    if(argc!=0)

+    {

+        va_list args;

+        va_start(args, format);

+        vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);

+        va_end(args);    

+    }

+    LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

+    pthread_mutex_lock(&s_sendto_mutex);

+     if(s_inner_test==1)

+    {

+        send_num = 1;          

+    }

+    else

+    {

+        send_num = sendto(module_rc_sock_fd,&client,sizeof(client),0,(struct sockaddr *)&module_rc_addr_serv,module_len_rc_addr_serv); 

+    }

+    if(s_inner_test>=1000)

+    {

+        time_out = s_inner_test-1000;

+    }        

+    pthread_mutex_unlock(&s_sendto_mutex);

+

+    if(send_num <= 0)       

+    {

+        LYERRLOG("send request fail, send num is %d", send_num);

+        return LYNQ_E_SEND_REQUEST_FAIL;

+    }

+    ret = waitResponse(p, client.uToken,time_out);

+

+    if(ret==0)

+    {

+        lynq_resp_t head; 

+        ret=GetHeader(p,head);

+        if(ret!=0)

+        {

+            LYERRLOG("%s %d get head error %d",__func__,client.uToken,ret);

+            delete p;

+            return LYNQ_E_GET_HEAD_ERROR;

+        }

+        if(head.error!=0)

+        {

+            LYERRLOG("%s %d mdm return head error %d",__func__,client.uToken,head.error);

+            delete p;

+            return head.error;

+        }

+        LYERRLOG("%s %d suc",__func__,client.uToken);

+        return RESULT_OK;  

+    }

+

+    LYERRLOG("%s %d fail, ret is %d",__func__,client.uToken,ret);

+   

+    return ret;    

+}

+

+/**@ a thread just for recv\buffer solicited msg's response and notice waiting thread

+* @param p [IN]: no meaning

+* @return

+* always null

+*/

+void *thread_rc_recv(void *p)

+{

+    Parcel* rc_p;

+    std::list<Parcel*>::iterator iter;

+    int resp_type = -1;   

+    char rc_data[LYNQ_REC_BUF];

+    int rc_len;

+    int null_cnt=0;

+    int wakeup_token; 

+ 

+    LYINFLOG("rc thread is running");

+    while(module_rc_status)

+    {

+        bzero(rc_data,LYNQ_REC_BUF);

+        while(true)

+        {

+            rc_len = recvfrom(module_rc_sock_fd,rc_data,sizeof(rc_data),0,(struct sockaddr *)&module_rc_addr_serv,(socklen_t *)&module_len_rc_addr_serv);

+            if(rc_len<sizeof(int32_t)*2)

+            {

+                 LYERRLOG("%s recv len %d less %d",__func__, rc_len,sizeof(int)*2);

+                 continue;

+            } 

+            rc_p= new Parcel;

+            if(rc_p==NULL)

+            {

+                null_cnt++;

+                LYERRLOG("%s rc_p is NULL, cnt is %d",__func__, null_cnt);

+                if(null_cnt>20)

+                {

+                    goto rc_recv_end;

+                }

+                continue;

+            }

+            else 

+            {

+                null_cnt=0;

+            }

+                

+            rc_p->setData((uint8_t *)rc_data,rc_len); // p.setData((uint8_t *) buffer, buflen);

+            rc_p->setDataPosition(0);

+            if(rc_p->dataAvail()>0)

+            {

+                rc_p->readInt32(&resp_type); 

+                rc_p->readInt32(&wakeup_token); 

+                BLOCK_RECV_MSG_LOCK();

+                s_recv_parcel_list.push_back(rc_p);                

+                LYINFLOG("%s wakeup token is %d, list size is %d!",__func__,wakeup_token,s_recv_parcel_list.size());

+                if(s_recv_parcel_list.size()>20) //max 20

+                {

+                    iter=s_recv_parcel_list.begin();

+                    (*iter)->setDataPosition(0);

+                    (*iter)->readInt32(&resp_type); 

+                    (*iter)->readInt32(&wakeup_token); 

+                    delete (*(s_recv_parcel_list.begin()));

+                    LYERRLOG("%s wakeup token %d is deleted!",__func__,wakeup_token);

+                    s_recv_parcel_list.erase(iter);

+                }                   

+                BLOCK_WAKEUP_RECV_MSG();

+                BLOCK_RECV_MSG_UNLOCK();

+                break;

+            }

+            else

+            {

+                LYERRLOG("%s rc_p data Avail %d not greater than 0",__func__, rc_p->dataAvail());

+                delete rc_p;

+            }

+        }

+    }                 

+

+rc_recv_end:    

+    LYINFLOG("rc thread ended");

+    return NULL;

+}

+

+void *thread_urc_recv(void *p)

+{

+    Parcel *urc_p =NULL;

+    char urc_data[LYNQ_REC_BUF];    

+    int res = 0;

+   

+    LYINFLOG("urc thread is running");

+    while(module_urc_status)

+    {

+        bzero(urc_data,LYNQ_REC_BUF);

+        res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);

+        if(res<=0)

+        {

+            LYERRLOG("thread_urc_recv step2 fail:");

+            break;

+        }

+        urc_p = new Parcel();

+        if(urc_p == NULL)

+        {

+            LYERRLOG("new parcel failure!!!");

+            break;

+        }

+        urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);

+        urc_p->setDataPosition(0);

+        if(urc_p->dataAvail()>0)

+        {

+            pthread_mutex_lock(&s_urc_mutex);

+            urc_msg_process(urc_p);            

+            pthread_mutex_unlock(&s_urc_mutex);

+        }

+        delete urc_p;

+        urc_p = NULL;

+    }

+    LYINFLOG("urc thread ended");

+    return NULL;

+}

+

+int lynq_server_socket_start()

+{

+    module_rc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);

+    if(module_rc_sock_fd < 0)

+    {

+        LYERRLOG("socket open error");

+        return -1;

+    }

+

+    LYINFLOG("module_rc_sock_fd = %d",module_rc_sock_fd);

+

+    memset(&module_rc_addr_serv, 0, sizeof(module_rc_addr_serv));

+    module_rc_addr_serv.sin_family = AF_INET;

+    module_rc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);

+    module_rc_addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);

+    module_len_rc_addr_serv = sizeof(module_rc_addr_serv);

+

+    BLOCK_RECV_MSG_LOCK(); 

+    std::list<Parcel*>::iterator iter;

+    for(iter=s_recv_parcel_list.begin();iter!=s_recv_parcel_list.end();++iter)

+    {

+        delete (*iter);        

+    }

+    s_recv_parcel_list.clear();  

+    BLOCK_RECV_MSG_UNLOCK(); 

+

+//    pthread_attr_t attr;

+    int ret;

+

+    pthread_mutex_init(&s_sendto_mutex, NULL);   

+    pthread_mutex_init(&s_RecvMsgBlockMutex, NULL);   

+

+    module_rc_status = 1;

+//    pthread_attr_init(&attr);

+//    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

+    ret = pthread_create(&module_rc_tid,/*&attr*/NULL,thread_rc_recv,NULL);

+    if(ret <0)

+    {

+        LYERRLOG("rc pthread create error");

+        module_rc_status =0;

+        close(module_rc_sock_fd);

+        module_rc_sock_fd =-1;        

+        return ret;

+    }   

+    

+    LYINFLOG("rc start success");

+

+    return RESULT_OK;  

+}

+

+int lynq_urc_socket_start()

+{

+//    pthread_t tid;

+//    pthread_attr_t attr;

+    int on = 1;

+    int ret = 0;

+    module_len_urc_addr_serv = sizeof(sockaddr_in);

+    module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);

+    if (module_urc_sock_fd <0){

+        LYERRLOG("urc socket error");

+        return RESULT_ERROR;  

+    }

+    module_urc_addr_serv.sin_family = AF_INET;

+    module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);

+    module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);

+    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/

+    ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);

+    if(ret <0)

+    {

+        LYERRLOG("urc socket set error");

+        close(module_urc_sock_fd);

+        module_urc_sock_fd =-1;

+        return RESULT_ERROR;  

+    }

+    ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));

+    if(ret <0)

+    {

+        LYERRLOG("urc socket bind error");

+        close(module_urc_sock_fd);

+        module_urc_sock_fd =-1;

+        return RESULT_ERROR;  

+    }

+

+    module_urc_status = 1;

+  //  pthread_attr_init(&attr);

+  //  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

+    ret = pthread_create(&module_urc_tid,/*&attr*/NULL,thread_urc_recv,NULL);

+    if(ret <0)

+    {

+        LYERRLOG("urc pthread create error");

+        module_urc_status = 0;

+        close(module_urc_sock_fd);

+        module_urc_sock_fd =-1;

+        return RESULT_ERROR;  

+    }

+    LYINFLOG("urc start success");

+    

+    return RESULT_OK;  

+}

+

+void lynq_close_urc_thread()

+{

+    int ret;

+

+    pthread_mutex_lock(&s_urc_mutex); //just cancel urc tid when recvfrom avoid mutual lock for tid may call pthread_cond_wait

+    module_urc_status = 0;    

+    if(module_urc_tid!=-1)

+    {

+        ret = pthread_cancel(module_urc_tid);

+        LYINFLOG("pthread cancel urc ret = %d",ret);            

+    }

+    pthread_mutex_unlock(&s_urc_mutex);

+    if(module_urc_tid != -1)

+    {

+        ret = pthread_join(module_urc_tid,NULL);

+        LYINFLOG("pthread join urc tid ret = %d",ret);

+        module_urc_tid =-1;

+    }

+    if (module_urc_sock_fd > 0)

+    {

+        close(module_urc_sock_fd);

+        module_urc_sock_fd =-1;

+    }  

+}

+

+void lynq_close_rc_thread()

+{

+    int ret;

+    BLOCK_RECV_MSG_LOCK(); 

+    module_rc_status = 0;

+    BLOCK_WAKEUP_RECV_MSG();    

+    if(module_rc_tid != -1)

+    {

+        ret = pthread_cancel(module_rc_tid);

+        LYINFLOG("pthread cancel rc ret = %d",ret);     

+    }    

+    BLOCK_RECV_MSG_UNLOCK();     

+    if(module_rc_tid != -1)

+    {

+        ret = pthread_join(module_rc_tid,NULL);      

+        module_rc_tid =-1;

+        LYINFLOG("pthread join rc tid ret = %d",ret);       

+    }

+    

+

+    if (module_rc_sock_fd > 0)

+    {

+        close(module_rc_sock_fd);

+        module_rc_sock_fd =-1;

+    }

+    

+    BLOCK_RECV_MSG_LOCK();    

+    std::list<Parcel*>::iterator iter;

+    for(iter=s_recv_parcel_list.begin();iter!=s_recv_parcel_list.end();++iter)

+    {

+        delete (*iter);        

+    }

+    s_recv_parcel_list.clear(); 

+    BLOCK_RECV_MSG_UNLOCK(); 

+}

+

diff --git a/src/lynq/lib/liblynq-call/lynq_module_socket.h b/src/lynq/lib/liblynq-call/lynq_module_socket.h
new file mode 100755
index 0000000..57466f6
--- /dev/null
+++ b/src/lynq/lib/liblynq-call/lynq_module_socket.h
@@ -0,0 +1,18 @@
+#ifndef LYNQ_MODULE_SOCKET_H

+#define LYNQ_MODULE_SOCKET_H 

+

+using ::android::Parcel;

+

+int lynq_set_test_network(const int test_mode);

+int lynq_send_common_request(Parcel*& p, int time_out, int request_id, int argc, const char* format,...);

+int lynq_server_socket_start();

+int lynq_urc_socket_start();

+void lynq_close_urc_thread();

+void lynq_close_rc_thread();

+

+extern int g_module_Global_uToken;

+extern int g_wait_time;

+

+void urc_msg_process(Parcel *p);

+

+#endif

diff --git a/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h b/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
index 8c40b68..5b2ce3c 100755
--- a/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
+++ b/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
@@ -72,6 +72,7 @@
 int lynq_set_ims(const int ims_mode);

 int lynq_wait_signalchanges(int *handle);

 int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id);

+

 typedef enum {

     NETWORK_STATE_BUFFER_TYPE_VOICE_REG,

     NETWORK_STATE_BUFFER_TYPE_DATA_REG,

@@ -115,6 +116,7 @@
 */

 int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode);

 #endif

+void lynq_set_test_mode(const int test_mode);

 #ifdef __cplusplus

 }

 #endif

diff --git a/src/lynq/lib/liblynq-network/lynq_module_common.h b/src/lynq/lib/liblynq-network/lynq_module_common.h
new file mode 100755
index 0000000..a582538
--- /dev/null
+++ b/src/lynq/lib/liblynq-network/lynq_module_common.h
@@ -0,0 +1,63 @@
+#ifndef LYNQ_MODULE_COMMON_H

+#define LYNQ_MODULE_COMMON_H 

+

+#define RESULT_OK (0)

+#define RESULT_ERROR (-1)

+

+/*the same with lynq_interface.h begin*/

+#define LYNQ_REQUEST_VENDOR_BASE 8000
+#define LYNQ_URC_VENDOR_BASE 9000
+#define LYNQ_AT_SNED (LYNQ_REQUEST_VENDOR_BASE +1)
+#define LYNQ_URC_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+1)
+#define LYNQ_URC_DATA_STATUS_IND (LYNQ_URC_VENDOR_BASE+2)
+#define LYNQ_URC_DATA_CALL_STATUS_IND (LYNQ_URC_VENDOR_BASE+3)
+#define LYNQ_AUTO_ANSWER_CALL (LYNQ_REQUEST_VENDOR_BASE +2)
+#define LYNQ_REQUEST_SET_DTMF_VOLUME (LYNQ_REQUEST_VENDOR_BASE +3)
+#define LYNQ_URC_MODIFY_APNDB (LYNQ_URC_VENDOR_BASE+4)
+#define LYNQ_URC_RESET_APNDB (LYNQ_URC_VENDOR_BASE+5)
+
+
+#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)
+#define LYNQ_REQUEST_SET_DEFAULT_SIM_ALL (LYNQ_REQUEST_VENDOR_BASE + 8)
+
+#define LYNQ_REQUEST_SET_SPEECH_VOLUME (LYNQ_REQUEST_VENDOR_BASE +9)
+#define LYNQ_REQUEST_GET_SPEECH_VOLUME (LYNQ_REQUEST_VENDOR_BASE +10)
+#define LYNQ_REQUEST_RECORD  (LYNQ_REQUEST_VENDOR_BASE +11)
+#define LYNQ_REQUEST_OOS_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +12)
+#define LYNQ_REQUEST_OOS_DEEP_SLEEP_RECOVER_TIMER_INTERVAL (LYNQ_REQUEST_VENDOR_BASE +13)

+/*the same with lynq_interface.h end*/

+

+typedef enum{

+    /*base abnormal*/

+    LYNQ_E_PARAMETER_ANONALY=7000,

+    LYNQ_E_SEND_REQUEST_FAIL=7001,

+    LYNQ_E_GET_HEAD_ERROR=7002,

+    LYNQ_E_INNER_ERROR=7100,

+    LYNQ_E_MALLOC_ERROR=7101,

+    /**/

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

+

+#define MODULE_CLOSED (0)

+#define MODULE_SWITCHING  (1)

+#define MODULE_RUNNING (2)

+#endif

diff --git a/src/lynq/lib/liblynq-network/lynq_module_socket.cpp b/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
new file mode 100755
index 0000000..fa71d82
--- /dev/null
+++ b/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
@@ -0,0 +1,547 @@
+#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 <list>

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

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

+#include "lynq_network.h"

+#include "lynq_module_common.h"

+#include "lynq_module_socket.h"

+#include "liblog/lynq_deflog.h"

+

+#define LYNQ_SERVICE_PORT 8088

+#define LYNQ_ADDRESS "127.0.0.1"

+#define LYNQ_URC_SERVICE_PORT 8086

+#define LYNQ_URC_ADDRESS "0.0.0.0"

+#define LYNQ_REQUEST_PARAM_BUF 8192

+#define LYNQ_REC_BUF 8192

+

+#define USER_LOG_TAG "LYNQ_NETWORK"

+

+typedef struct{

+    int uToken;

+    int request;

+    int paramLen;

+    char param[LYNQ_REQUEST_PARAM_BUF];

+}lynq_client_t;

+

+typedef struct{

+    int resp_type;

+    int token;

+    int request;

+    int slot_id;

+    int error;

+}lynq_resp_t;

+

+lynq_client_t client_t;

+lynq_resp_t response;

+

+int module_len_rc_addr_serv;

+int module_len_urc_addr_serv;

+struct sockaddr_in module_rc_addr_serv;

+struct sockaddr_in module_urc_addr_serv;

+static int module_rc_sock_fd = -1;

+static int module_urc_sock_fd = -1;

+int module_urc_status = 1;

+int module_rc_status = 1;

+pthread_t module_urc_tid = -1;

+pthread_t module_rc_tid = -1;

+static pthread_mutex_t s_urc_mutex = PTHREAD_MUTEX_INITIALIZER;

+

+/*hq add for set waiting time 2022/09/13 begin*/

+static pthread_mutex_t s_sendto_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_mutex_t s_RecvMsgBlockMutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t s_WaitRecvMsgCond = PTHREAD_COND_INITIALIZER;

+#define BLOCK_RECV_MSG_LOCK() pthread_mutex_lock(&s_RecvMsgBlockMutex)

+#define BLOCK_RECV_MSG_UNLOCK() pthread_mutex_unlock(&s_RecvMsgBlockMutex)

+#define BLOCK_WAIT_RECV_MSG_TIME_OUT(a) pthread_cond_timedwait(&s_WaitRecvMsgCond, &s_RecvMsgBlockMutex,(a))

+#define BLOCK_WAKEUP_RECV_MSG() pthread_cond_broadcast(&s_WaitRecvMsgCond)

+static std::list<Parcel*> s_recv_parcel_list;

+const int waitResponse(int token,int time_out);

+/*hq add for set waiting time 2022/09/13 end*/

+

+int g_module_Global_uToken = 0;

+int g_wait_time=5;

+

+/*inner test*/

+static int s_inner_test=0;

+

+/**@brief just for inner test

+* @param test_mode [IN]: test mode

+*  0:success

+*  other:failure

+*/

+void lynq_set_test_mode(const int test_mode)

+{

+    if(test_mode<0)

+    {

+        g_wait_time = -test_mode;          

+    }

+    else if(test_mode==9999)

+    {

+        LYERRLOG("%s inner test para %d %d",__func__,s_inner_test,g_wait_time);         

+    }    

+    else 

+    {

+        s_inner_test = test_mode;    

+    }

+}

+

+void cleanup_RecvMsgBlock_mutex(void *arg)

+{

+    BLOCK_RECV_MSG_UNLOCK(); 

+}

+

+/**@brief wait response with expected token and write msg to parcel in some time

+* @param p [IN]: pointer the parcel

+* @param token [IN]: the expected token for the response msg

+* @param time_out [IN]: timeout.

+* @return

+*  0:success

+*  other:failure

+*/

+const int waitResponse(Parcel*& p, int token,int time_out)

+{
+    int waitToken = token;

+    int wakeup_token=-1;

+    int resp_type;

+    struct timeval now;
+    struct timespec timeout;  

+    int ret;

+    std::list<Parcel*>::iterator iter;

+    int cnt=0;

+    

+	gettimeofday(&now,NULL);

+    timeout.tv_sec = now.tv_sec+time_out; //timeout is 1min

+    timeout.tv_nsec = now.tv_usec*1000;
+
+    LYINFLOG("%s wait token is %d, wait time is %d",__func__,waitToken,time_out);

+    

+    BLOCK_RECV_MSG_LOCK();

+    pthread_cleanup_push(cleanup_RecvMsgBlock_mutex, NULL); // thread cleanup handler

+    while(module_rc_status) { 

+        cnt++;

+        for(iter=s_recv_parcel_list.begin();iter!=s_recv_parcel_list.end();++iter)

+        {

+            (*iter)->setDataPosition(0);

+            (*iter)->readInt32(&resp_type);

+            (*iter)->readInt32(&wakeup_token);

+            if(wakeup_token==waitToken)

+            {

+                LYINFLOG("%s get waitToken",__func__);

+                p=(*iter);

+                p->setDataPosition(0);

+                s_recv_parcel_list.erase(iter);

+                goto waitResponse_end;

+            }

+        }

+        LYINFLOG("%s no wait Token in msg list, list size is %d",__func__,s_recv_parcel_list.size());

+        ret=BLOCK_WAIT_RECV_MSG_TIME_OUT(&timeout);

+        if(ret!=0)

+        {

+            LYERRLOG("%s no expected token %d after %d second",__func__,waitToken,time_out);

+            break;

+        }        

+    }

+waitResponse_end:

+    LYINFLOG("%s wait token is %d wakeup_token is %d, cnt is %d",__func__,waitToken,wakeup_token,cnt);

+    pthread_cleanup_pop(0);

+    BLOCK_RECV_MSG_UNLOCK(); 

+    return wakeup_token==waitToken ? 0:LYNQ_E_TIME_OUT;

+}

+

+/**@brief print solicied response msg's head information

+* @param head [IN]: head information

+* @return none

+*/

+void PrintHeader(lynq_resp_t& head)

+{

+    LYINFLOG("resp_type=%d,token=%d,request=%d,slot_id=%d,error_code=%d",head.resp_type,head.token,head.request,head.slot_id,head.error);

+}

+

+/**@brief get solicied response msg's head

+* @param head [OUT]: head information

+* @return

+*  0:success

+*  other:failure

+*/

+int GetHeader(Parcel* &p, lynq_resp_t& head)

+{

+    LYINFLOG("get header");

+    if(p->dataAvail() > 0)

+    {

+        p->readInt32(&(head.resp_type));

+        p->readInt32(&(head.token));

+        p->readInt32(&(head.request));

+        p->readInt32(&(head.slot_id));

+        p->readInt32(&(head.error));

+        PrintHeader(head);

+        return RESULT_OK;  

+    }

+    else

+    {

+        return RESULT_ERROR;  

+    }

+}

+

+/**@brief send msg to service and get response from service

+* @param request_id [IN]: request id

+* @param time_out [IN]: wait time uplimit

+* @param p [IN]: point to response msg's parcel

+* @param argc [IN]: how many parameters in parameter string

+* @param format [IN]: parameter string's format

+* @param ... [IN]: the specific parameter

+* @return

+*  0:success

+*  other:failure

+*/

+int lynq_send_common_request(Parcel*& p, int time_out, int request_id, int argc, const char* format,...)

+{

+    lynq_client_t client;

+    int ret;

+    int send_num;

+    

+    client.uToken = g_module_Global_uToken;

+    g_module_Global_uToken=(g_module_Global_uToken+1)%10000;/*0-10000*/

+    client.request = request_id;

+    client.paramLen = argc;

+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

+    if(argc!=0)

+    {

+        va_list args;

+        va_start(args, format);

+        vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);

+        va_end(args);    

+    }

+    LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

+    pthread_mutex_lock(&s_sendto_mutex);

+     if(s_inner_test==1)

+    {

+        send_num = 1;          

+    }

+    else

+    {

+        send_num = sendto(module_rc_sock_fd,&client,sizeof(client),0,(struct sockaddr *)&module_rc_addr_serv,module_len_rc_addr_serv); 

+    }

+    if(s_inner_test>=1000)

+    {

+        time_out = s_inner_test-1000;

+    }        

+    pthread_mutex_unlock(&s_sendto_mutex);

+

+    if(send_num <= 0)       

+    {

+        LYERRLOG("send request fail, send num is %d", send_num);

+        return LYNQ_E_SEND_REQUEST_FAIL;

+    }

+    ret = waitResponse(p, client.uToken,time_out);

+

+    if(ret==0)

+    {

+        lynq_resp_t head; 

+        ret=GetHeader(p,head);

+        if(ret!=0)

+        {

+            LYERRLOG("%s %d get head error %d",__func__,client.uToken,ret);

+            delete p;

+            return LYNQ_E_GET_HEAD_ERROR;

+        }

+        if(head.error!=0)

+        {

+            LYERRLOG("%s %d mdm return head error %d",__func__,client.uToken,head.error);

+            delete p;

+            return head.error;

+        }

+        LYERRLOG("%s %d suc",__func__,client.uToken);

+        return RESULT_OK;  

+    }

+

+    LYERRLOG("%s %d fail, ret is %d",__func__,client.uToken,ret);

+   

+    return ret;    

+}

+

+/**@ a thread just for recv\buffer solicited msg's response and notice waiting thread

+* @param p [IN]: no meaning

+* @return

+* always null

+*/

+void *thread_rc_recv(void *p)

+{

+    Parcel* rc_p;

+    std::list<Parcel*>::iterator iter;

+    int resp_type = -1;   

+    char rc_data[LYNQ_REC_BUF];

+    int rc_len;

+    int null_cnt=0;

+    int wakeup_token; 

+ 

+    LYINFLOG("rc thread is running");

+    while(module_rc_status)

+    {

+        bzero(rc_data,LYNQ_REC_BUF);

+        while(true)

+        {

+            rc_len = recvfrom(module_rc_sock_fd,rc_data,sizeof(rc_data),0,(struct sockaddr *)&module_rc_addr_serv,(socklen_t *)&module_len_rc_addr_serv);

+            if(rc_len<sizeof(int32_t)*2)

+            {

+                 LYERRLOG("%s recv len %d less %d",__func__, rc_len,sizeof(int)*2);

+                 continue;

+            } 

+            rc_p= new Parcel;

+            if(rc_p==NULL)

+            {

+                null_cnt++;

+                LYERRLOG("%s rc_p is NULL, cnt is %d",__func__, null_cnt);

+                if(null_cnt>20)

+                {

+                    goto rc_recv_end;

+                }

+                continue;

+            }

+            else 

+            {

+                null_cnt=0;

+            }

+                

+            rc_p->setData((uint8_t *)rc_data,rc_len); // p.setData((uint8_t *) buffer, buflen);

+            rc_p->setDataPosition(0);

+            if(rc_p->dataAvail()>0)

+            {

+                rc_p->readInt32(&resp_type); 

+                rc_p->readInt32(&wakeup_token); 

+                BLOCK_RECV_MSG_LOCK();

+                s_recv_parcel_list.push_back(rc_p);                

+                LYINFLOG("%s wakeup token is %d, list size is %d!",__func__,wakeup_token,s_recv_parcel_list.size());

+                if(s_recv_parcel_list.size()>20) //max 20

+                {

+                    iter=s_recv_parcel_list.begin();

+                    (*iter)->setDataPosition(0);

+                    (*iter)->readInt32(&resp_type); 

+                    (*iter)->readInt32(&wakeup_token); 

+                    delete (*(s_recv_parcel_list.begin()));

+                    LYERRLOG("%s wakeup token %d is deleted!",__func__,wakeup_token);

+                    s_recv_parcel_list.erase(iter);

+                }                   

+                BLOCK_WAKEUP_RECV_MSG();

+                BLOCK_RECV_MSG_UNLOCK();

+                break;

+            }

+            else

+            {

+                LYERRLOG("%s rc_p data Avail %d not greater than 0",__func__, rc_p->dataAvail());

+                delete rc_p;

+            }

+        }

+    }                 

+

+rc_recv_end:    

+    LYINFLOG("rc thread ended");

+    return NULL;

+}

+

+void *thread_urc_recv(void *p)

+{

+    Parcel *urc_p =NULL;

+    char urc_data[LYNQ_REC_BUF];    

+    int res = 0;

+   

+    LYINFLOG("urc thread is running");

+    while(module_urc_status)

+    {

+        bzero(urc_data,LYNQ_REC_BUF);

+        res = recvfrom(module_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&module_urc_addr_serv,(socklen_t*)&module_len_urc_addr_serv);

+        if(res<=0)

+        {

+            LYERRLOG("thread_urc_recv step2 fail:");

+            break;

+        }

+        urc_p = new Parcel();

+        if(urc_p == NULL)

+        {

+            LYERRLOG("new parcel failure!!!");

+            break;

+        }

+        urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);

+        urc_p->setDataPosition(0);

+        if(urc_p->dataAvail()>0)

+        {

+            pthread_mutex_lock(&s_urc_mutex);

+            urc_msg_process(urc_p);            

+            pthread_mutex_unlock(&s_urc_mutex);

+        }

+        delete urc_p;

+        urc_p = NULL;

+    }

+    LYINFLOG("urc thread ended");

+    return NULL;

+}

+

+int lynq_server_socket_start()

+{

+    module_rc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);

+    if(module_rc_sock_fd < 0)

+    {

+        LYERRLOG("socket open error");

+        return -1;

+    }

+

+    LYINFLOG("module_rc_sock_fd = %d",module_rc_sock_fd);

+

+    memset(&module_rc_addr_serv, 0, sizeof(module_rc_addr_serv));

+    module_rc_addr_serv.sin_family = AF_INET;

+    module_rc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);

+    module_rc_addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);

+    module_len_rc_addr_serv = sizeof(module_rc_addr_serv);

+

+    BLOCK_RECV_MSG_LOCK(); 

+    std::list<Parcel*>::iterator iter;

+    for(iter=s_recv_parcel_list.begin();iter!=s_recv_parcel_list.end();++iter)

+    {

+        delete (*iter);        

+    }

+    s_recv_parcel_list.clear();  

+    BLOCK_RECV_MSG_UNLOCK(); 

+

+//    pthread_attr_t attr;

+    int ret;

+

+    pthread_mutex_init(&s_sendto_mutex, NULL);   

+    pthread_mutex_init(&s_RecvMsgBlockMutex, NULL);   

+

+    module_rc_status = 1;

+//    pthread_attr_init(&attr);

+//    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

+    ret = pthread_create(&module_rc_tid,/*&attr*/NULL,thread_rc_recv,NULL);

+    if(ret <0)

+    {

+        LYERRLOG("rc pthread create error");

+        module_rc_status =0;

+        close(module_rc_sock_fd);

+        module_rc_sock_fd =-1;        

+        return ret;

+    }   

+    

+    LYINFLOG("rc start success");

+

+    return RESULT_OK;  

+}

+

+int lynq_urc_socket_start()

+{

+//    pthread_t tid;

+//    pthread_attr_t attr;

+    int on = 1;

+    int ret = 0;

+    module_len_urc_addr_serv = sizeof(sockaddr_in);

+    module_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);

+    if (module_urc_sock_fd <0){

+        LYERRLOG("urc socket error");

+        return RESULT_ERROR;  

+    }

+    module_urc_addr_serv.sin_family = AF_INET;

+    module_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);

+    module_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);

+    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/

+    ret = setsockopt(module_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);

+    if(ret <0)

+    {

+        LYERRLOG("urc socket set error");

+        close(module_urc_sock_fd);

+        module_urc_sock_fd =-1;

+        return RESULT_ERROR;  

+    }

+    ret = bind(module_urc_sock_fd ,(struct sockaddr*)&module_urc_addr_serv, sizeof(module_urc_addr_serv));

+    if(ret <0)

+    {

+        LYERRLOG("urc socket bind error");

+        close(module_urc_sock_fd);

+        module_urc_sock_fd =-1;

+        return RESULT_ERROR;  

+    }

+

+    module_urc_status = 1;

+  //  pthread_attr_init(&attr);

+  //  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

+    ret = pthread_create(&module_urc_tid,/*&attr*/NULL,thread_urc_recv,NULL);

+    if(ret <0)

+    {

+        LYERRLOG("urc pthread create error");

+        module_urc_status = 0;

+        close(module_urc_sock_fd);

+        module_urc_sock_fd =-1;

+        return RESULT_ERROR;  

+    }

+    LYINFLOG("urc start success");

+    

+    return RESULT_OK;  

+}

+

+void lynq_close_urc_thread()

+{

+    int ret;

+

+    pthread_mutex_lock(&s_urc_mutex); //just cancel urc tid when recvfrom avoid mutual lock for tid may call pthread_cond_wait

+    module_urc_status = 0;    

+    if(module_urc_tid!=-1)

+    {

+        ret = pthread_cancel(module_urc_tid);

+        LYINFLOG("pthread cancel urc ret = %d",ret);            

+    }

+    pthread_mutex_unlock(&s_urc_mutex);

+     if(module_urc_tid != -1)

+    {

+        ret = pthread_join(module_urc_tid,NULL);

+        LYINFLOG("pthread join urc tid ret = %d",ret);

+        module_urc_tid =-1;

+    }

+    if (module_urc_sock_fd > 0)

+    {

+        close(module_urc_sock_fd);

+        module_urc_sock_fd =-1;

+    }  

+}

+

+void lynq_close_rc_thread()

+{

+    int ret;

+    BLOCK_RECV_MSG_LOCK(); 

+    module_rc_status = 0;    

+    BLOCK_WAKEUP_RECV_MSG(); 

+    if(module_rc_tid != -1)

+    {

+        ret = pthread_cancel(module_rc_tid);

+        LYINFLOG("pthread cancel rc ret = %d",ret);     

+    }    

+    BLOCK_RECV_MSG_UNLOCK();     

+    if(module_rc_tid != -1)

+    {

+        ret = pthread_join(module_rc_tid,NULL);

+        module_rc_tid =-1;

+        LYINFLOG("pthread join rc tid ret = %d",ret);

+        

+    }    

+

+    if (module_rc_sock_fd > 0)

+    {

+        close(module_rc_sock_fd);

+        module_rc_sock_fd =-1;

+    }

+    

+    BLOCK_RECV_MSG_LOCK();    

+    std::list<Parcel*>::iterator iter;

+    for(iter=s_recv_parcel_list.begin();iter!=s_recv_parcel_list.end();++iter)

+    {

+        delete (*iter);        

+    }

+    s_recv_parcel_list.clear(); 

+    BLOCK_RECV_MSG_UNLOCK(); 

+}

+

diff --git a/src/lynq/lib/liblynq-network/lynq_module_socket.h b/src/lynq/lib/liblynq-network/lynq_module_socket.h
new file mode 100755
index 0000000..fb1785a
--- /dev/null
+++ b/src/lynq/lib/liblynq-network/lynq_module_socket.h
@@ -0,0 +1,18 @@
+#ifndef LYNQ_MODULE_SOCKET_H

+#define LYNQ_MODULE_SOCKET_H 

+

+using ::android::Parcel;

+

+int lynq_set_test_network(const int test_mode);

+int lynq_send_common_request(Parcel*& p, int time_out, int request_id,  int argc, const char* format,...);

+int lynq_server_socket_start();

+int lynq_urc_socket_start();

+void lynq_close_urc_thread();

+void lynq_close_rc_thread();

+

+extern int g_module_Global_uToken;

+extern int g_wait_time;

+

+void urc_msg_process(Parcel *p);

+

+#endif

diff --git a/src/lynq/lib/liblynq-network/lynq_network_state_buffer.cpp b/src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp
similarity index 99%
rename from src/lynq/lib/liblynq-network/lynq_network_state_buffer.cpp
rename to src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp
index 7b41533..d7c9111 100755
--- a/src/lynq/lib/liblynq-network/lynq_network_state_buffer.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_module_state_buffer.cpp
@@ -11,7 +11,8 @@
 #include <climits>

 #include "liblog/lynq_deflog.h"

 #include "lynq_network.h"

-#include "lynq_network_state_buffer.h"

+#include "lynq_module_common.h"

+#include "lynq_module_state_buffer.h"

 

 #define USER_LOG_TAG "LYNQ_NETWORK"

 

@@ -86,38 +87,38 @@
 

 void start_network_timer(timer_t timer, int signal_value, int milliseconds) {

     LYINFLOG("start_network_timer(), timer_id=%ld, signal_value=%d, time=%d",(long)timer, signal_value, milliseconds);

-

-    struct itimerspec expire;

-    expire.it_interval.tv_sec = 0;

-    expire.it_interval.tv_nsec = 0;

-    expire.it_value.tv_sec = milliseconds/1000;

-    expire.it_value.tv_nsec = (milliseconds%1000)*1000000;

-    if (timer_settime(timer, 0, &expire, NULL) == -1) {

+
+    struct itimerspec expire;
+    expire.it_interval.tv_sec = 0;
+    expire.it_interval.tv_nsec = 0;
+    expire.it_value.tv_sec = milliseconds/1000;
+    expire.it_value.tv_nsec = (milliseconds%1000)*1000000;
+    if (timer_settime(timer, 0, &expire, NULL) == -1) {
         LYERRLOG("timer_settime  failed reason=[%s]", strerror(errno));

-    }

-}

-

+    }
+}
+
 void stop_network_timer(timer_t timer, int signal_value) {

     LYINFLOG("stop_network_timer(), timer_id=%ld, signal_value=%d", (long)timer, signal_value);

-    struct itimerspec timespec;

-    if(timer_gettime(timer, &timespec) == -1) {

+    struct itimerspec timespec;
+    if(timer_gettime(timer, &timespec) == -1) {
         LYERRLOG("stop_network_timer(), get time fail(%s)", strerror(errno));

-        return;

-    }

+        return;
+    }
     LYINFLOG("stop_network_timer(), tv_sec=%ld, tv_nsec=%ld",timespec.it_value.tv_sec, timespec.it_value.tv_nsec);

-    if((timespec.it_value.tv_sec == 0)  && (timespec.it_value.tv_nsec == 0) ) {

+    if((timespec.it_value.tv_sec == 0)  && (timespec.it_value.tv_nsec == 0) ) {
         LYINFLOG("stop_network_timer(), timer_id(%ld) had stopped, just return", (long)timer);

-        return;

-    } else {

+        return;
+    } else {
         start_network_timer(timer, signal_value, 0);

-    }

+    }
 }

 

 void network_timer_handler(sigval_t sig) {    

     LYINFLOG("network_timer_handler, sig_value: %d", sig.sival_int);

     int s;   

-    s = pthread_mutex_lock(&mtx);

-    if(s != 0) {

+    s = pthread_mutex_lock(&mtx);
+    if(s != 0) {
         LYERRLOG("network_timer_handler, pthead_mutex_lock fail");

     }   

     for(int i=0;i<NETWORK_STATE_BUFFER_TYPE_MAX;i++)

@@ -128,8 +129,8 @@
             break;

         }        

     }    

-    s = pthread_mutex_unlock(&mtx);

-    if(s != 0) {

+    s = pthread_mutex_unlock(&mtx);
+    if(s != 0) {
         LYERRLOG("network_timer_handler, pthread_mutex_unlock fail");

     }

 }

@@ -137,17 +138,17 @@
 void init_network_timer(timer_t* timer, int signal_value) 

 {

     struct sigevent sevp;

-    memset(&sevp, 0, sizeof(sevp));

-    sevp.sigev_value.sival_int = signal_value;

-    sevp.sigev_notify = SIGEV_THREAD;

+    memset(&sevp, 0, sizeof(sevp));
+    sevp.sigev_value.sival_int = signal_value;
+    sevp.sigev_notify = SIGEV_THREAD;
     sevp.sigev_notify_function = network_timer_handler;

-

-    if(timer_create(CLOCK_MONOTONIC, &sevp, timer) == -1) {

+
+    if(timer_create(CLOCK_MONOTONIC, &sevp, timer) == -1) {
         LYERRLOG("init_network_timer()  failed reason=[%s]", strerror(errno));

-    }

+    }
     LYINFLOG("init_network_timer(), timer_Id = %ld, signal_value=%d", (long)(*timer), signal_value);

-}

-

+}
+
 void init_network_timer_all() {

 

     for(int i=0;i<NETWORK_STATE_BUFFER_TYPE_MAX;i++){

diff --git a/src/lynq/lib/liblynq-network/lynq_network_state_buffer.h b/src/lynq/lib/liblynq-network/lynq_module_state_buffer.h
similarity index 82%
rename from src/lynq/lib/liblynq-network/lynq_network_state_buffer.h
rename to src/lynq/lib/liblynq-network/lynq_module_state_buffer.h
index b451c65..35357a3 100755
--- a/src/lynq/lib/liblynq-network/lynq_network_state_buffer.h
+++ b/src/lynq/lib/liblynq-network/lynq_module_state_buffer.h
@@ -1,13 +1,15 @@
-#ifndef LYNQ_NETWORK_STATE_BUFFER_H

-#define LYNQ_NETWORK_STATE_BUFFER_H 

+#ifndef LYNQ_MODULE_STATE_BUFFER_H

+#define LYNQ_MODULE_STATE_BUFFER_H 

 #ifdef __cplusplus

 extern "C" {

 #endif

+

 void set_state_buffer_valid(lynq_network_state_buffer_type type,int valid);

 void set_state_to_buf(lynq_network_state_buffer_type type,...);

 int get_state_from_buf(lynq_network_state_buffer_type type,...);

 void init_network_timer_all();

 void deinit_network_timer_all();

+

 #ifdef __cplusplus

 }

 #endif

diff --git a/src/lynq/lib/liblynq-network/lynq_network.cpp b/src/lynq/lib/liblynq-network/lynq_network.cpp
index 2fc1480..6040dbf 100755
--- a/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -8,688 +8,89 @@
 #include <log/log.h>

 #include <cutils/jstring.h>

 #include <pthread.h>

-#include <list>

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

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

-

-#include "lynq_network.h"

 #include "liblog/lynq_deflog.h"

-#include "lynq_network_state_buffer.h"

-#define LYNQ_SERVICE_PORT 8088

-#define LYNQ_URC_SERVICE_PORT 8086

-#define LYNQ_URC_ADDRESS "0.0.0.0"

-#define LYNQ_ADDRESS "127.0.0.1"

-#define LYNQ_REQUEST_PARAM_BUF 8192

-#define LYNQ_REC_BUF 8192

-#define LYNQ_RESP_BUF 128

+#include "lynq_network.h"

+#include "lynq_module_common.h"

+#include "lynq_module_socket.h"

+#include "lynq_module_state_buffer.h"

+

+#define LYNQ_RESP_STRING_MAX_NUM 128

 #define LYNQ_TYPE_BUF 10

 #define USER_LOG_TAG "LYNQ_NETWORK"

 

-

 using ::android::Parcel;

 

+static int s_module_wait_urc_id;

+static int s_module_urc_slot_id;

+static signalStrength_t s_network_urc_solSigStren;

 

-typedef struct{

-    int uToken;

-    int request;

-    int paramLen;

-    char param[LYNQ_REQUEST_PARAM_BUF];

-}lynq_client_t;

-

-typedef struct{

-    int resp_type;

-    int token;

-    int request;

-    int slot_id;

-    int error;

-}lynq_resp_t;

-

-lynq_client_t client_t;

-lynq_resp_t response;

-

-int network_len_addr_serv;

-int network_len_urc_addr_serv;

-struct sockaddr_in network_addr_serv;

-struct sockaddr_in network_urc_addr_serv;

-static int network_sock_fd = 0;

-int network_urc_sock_fd = 0;

-int network_Global_uToken = 0;

-int network_slot_id = -1;

-int network_urc_slot_id = -1;

-int network_urc_status = 1;

-int network_wait_urc_id = 0;

-signalStrength_t network_urc_solSigStren;

-/**g_lynq_network_init_flag

+/**g_module_init_flag

 * @brief mark network initialization state

 * 0:deinit status

 * 1:init state

 */

-static int g_lynq_network_init_flag = 0;

-

-static pthread_mutex_t signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;

-static pthread_cond_t signal_state_change_cond = PTHREAD_COND_INITIALIZER;

-

-/**g_lynq_network_sendto_mutex

-* @brief mark network send request mutex

-*/

-static pthread_mutex_t g_lynq_network_sendto_mutex;

-

-

-/*hq add for set waiting time 2022/09/13 begin*/

-int network_rc_status = 1;

-static pthread_mutex_t s_RecvMsgBlockMutex = PTHREAD_MUTEX_INITIALIZER;

-static pthread_cond_t s_WaitRecvMsgCond = PTHREAD_COND_INITIALIZER;

-#define BLOCK_RC_MSG_LOCK() pthread_mutex_lock(&s_RecvMsgBlockMutex)

-#define BLOCK_RC_MSG_UNLOCK() pthread_mutex_unlock(&s_RecvMsgBlockMutex)

-#define BLOCK_WAIT_RECV_MSG_TIME_OUT(a) pthread_cond_timedwait(&s_WaitRecvMsgCond, &s_RecvMsgBlockMutex,(a))

-#define BLOCK_WAKEUP_RECV_MSG() pthread_cond_broadcast(&s_WaitRecvMsgCond)

-std::list<Parcel*> g_recv_parcel_list;

-const int waitResponse(int token,int time_out);

-int g_inner_test=0;

-/*hq add for set waiting time 2022/09/13 end*/

-

-

-//static pthread_mutex_t g_lynq_network_recv_mutex;

-

-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;

-

-

-/**@brief get response and write msg to parcel

-* @param p [IN] <p>: the parcel

-*

-* @param time_out [IN] <time_out>: timeout.

-*  < 0:use defult timeout(5s)

-*  >=0:use this timeout

-* @return

-*  0:success

-*  other:failure

-*/

-int get_response(Parcel &p,int time_out)

-{

-    int len = 0;

-    char recvline[LYNQ_REC_BUF];

-    bzero(recvline,LYNQ_REC_BUF);

-    LYINFLOG("get response");

-    /* receive data from server */

-    struct timeval timeOut;

-    timeOut.tv_sec = 30;    //defualt 5s

-    timeOut.tv_usec = 0;

-    if(time_out >= 0)

-    {

-        LYINFLOG("use time out %d",time_out);

-        timeOut.tv_sec = time_out;    //just set second

-    }

-    if(setsockopt(network_sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)

-    {

-        LYERRLOG("time out setting failed");

-        return -1;

-    }

-    len = recvfrom(network_sock_fd,recvline,sizeof(recvline),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);

-    if(len == -1 && errno == EAGAIN)

-    {

-        LYERRLOG("read error,maybe timeout: %s",strerror(errno));

-        return LYNQ_E_TIME_OUT;

-    }

-    if (recvline != NULL) 

-    {

-        p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);

-        p.setDataPosition(0);

-    }

-    return 0;

-}

-

-/**@brief wait response with expected token and write msg to parcel in some time

-* @param p [IN]: pointer the parcel

-* @param token [IN]: the expected token for the response msg

-* @param time_out [IN]: timeout.

-* @return

-*  0:success

-*  other:failure

-*/

-const int waitResponse(Parcel*& p, int token,int time_out)

-{

-    int waitToken = token;

-    int wakeup_token=-1;

-    int resp_type;

-    struct timeval now;

-    struct timespec timeout;  

-    int ret;

-    std::list<Parcel*>::iterator iter;

-    int cnt=0;

-    

-	gettimeofday(&now,NULL);

-    timeout.tv_sec = now.tv_sec+time_out; //timeout is 1min

-    timeout.tv_nsec = now.tv_usec*1000;

-

-    LYINFLOG("%s wait token is %d",__func__,waitToken);

-    

-    BLOCK_RC_MSG_LOCK();

-    while(true) { 

-        cnt++;

-        for(iter=g_recv_parcel_list.begin();iter!=g_recv_parcel_list.end();++iter)

-        {

-            (*iter)->setDataPosition(0);

-            (*iter)->readInt32(&resp_type);

-            (*iter)->readInt32(&wakeup_token);

-            if(wakeup_token==waitToken)

-            {

-                LYINFLOG("%s get waitToken",__func__);

-                p=(*iter);

-                p->setDataPosition(0);

-                g_recv_parcel_list.erase(iter);

-                goto waitResponse_end;

-            }

-        }

-        LYINFLOG("%s no wait Token in msg list, list size is %d",__func__,g_recv_parcel_list.size());

-        ret=BLOCK_WAIT_RECV_MSG_TIME_OUT(&timeout);

-        if(ret!=0)

-        {

-            LYERRLOG("%s no expected token after %d second",__func__,time_out);

-            break;

-        }        

-    }

-waitResponse_end:

-    LYINFLOG("%s wait token is %d wakeup_token is %d, cnt is %d",__func__,waitToken,wakeup_token,cnt);

-    BLOCK_RC_MSG_UNLOCK(); 

-    return wakeup_token==waitToken ? 0:LYNQ_E_TIME_OUT;

-}

-

-int JumpHeader(Parcel &p,int *resp_type,int* token,int *request,int *slot_id,int *error)

-{

-    LYINFLOG("jump header");

-    if(p.dataAvail() > 0)

-    {

-        p.readInt32(resp_type);

-        p.readInt32(token);

-        p.readInt32(request);

-        p.readInt32(slot_id);

-        p.readInt32(error);

-        LYINFLOG("resp_type=%d,token=%d,request=%d,slot_id=%d,error_code=%d",*resp_type,*token,*request,*slot_id,*error);

-        return 0;

-    }

-    else

-    {

-        return -1;

-    }

-}

-

-/**@brief print solicied response msg's head information

-* @param head [IN]: head information

-* @return none

-*/

-void PrintHeader(lynq_resp_t& head)

-{

-    LYINFLOG("resp_type=%d,token=%d,request=%d,slot_id=%d,error_code=%d",head.resp_type,head.token,head.request,head.slot_id,head.error);

-}

-

-/**@brief get solicied response msg's head

-* @param head [OUT]: head information

-* @return

-*  0:success

-*  other:failure

-*/

-int GetHeader(Parcel* &p, lynq_resp_t& head)

-{

-    LYINFLOG("get header");

-    if(p->dataAvail() > 0)

-    {

-        p->readInt32(&(head.resp_type));

-        p->readInt32(&(head.token));

-        p->readInt32(&(head.request));

-        p->readInt32(&(head.slot_id));

-        p->readInt32(&(head.error));

-        PrintHeader(head);

-        return 0;

-    }

-    else

-    {

-        return -1;

-    }

-}

-

-/**@brief send msg to service and get response from service

-* @param request_id [IN]: request id

-* @param time_out [IN]: wait time uplimit

-* @param p [IN]: point to response msg's parcel

-* @param argc [IN]: how many parameters in parameter string

-* @param format [IN]: parameter string's format

-* @param ... [IN]: the specific parameter

-* @return

-*  0:success

-*  other:failure

-*/

-int lynq_get_common_request(int request_id, int time_out, Parcel*& p, int argc, const char* format,...)

-{

-    lynq_client_t client;

-    int ret;

-    int send_num;

-    

-    client.uToken = network_Global_uToken;

-    network_Global_uToken=(network_Global_uToken+1)%10000;/*0-10000*/

-    client.request = request_id;

-    client.paramLen = argc;

-    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);

-    if(argc!=0)

-    {

-        va_list args;

-        va_start(args, format);

-        vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);

-        va_end(args);    

-    }

-    LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);

-    pthread_mutex_lock(&g_lynq_network_sendto_mutex);

-    if(g_inner_test==0)

-    {

-        send_num = sendto(network_sock_fd,&client,sizeof(client),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv); 

-    }

-    else 

-    {

-        send_num = 1;

-        g_inner_test = 0;

-    }

-    pthread_mutex_unlock(&g_lynq_network_sendto_mutex);

-

-    if(send_num <= 0)       

-    {

-        LYERRLOG("send request fail, send num is %d", send_num);

-        return -1;

-    }

-    ret = waitResponse(p, client.uToken,time_out);

-   

-    return ret;    

-}

-

-

-int wait_signal_changes()

-{

-    int ret = 0;

-    pthread_mutex_lock(&signal_state_change_mutex);

-    ret = pthread_cond_wait(&signal_state_change_cond,&signal_state_change_mutex);

-    pthread_mutex_unlock(&signal_state_change_mutex);

-    return 0;

-}

-

-void send_signal_changes()

-{

-    pthread_mutex_lock(&signal_state_change_mutex);

-    pthread_cond_signal(&signal_state_change_cond);

-    pthread_mutex_unlock(&signal_state_change_mutex);

-    return;

-}

-

-/**@ a thread just for recv\buffer solicited msg's response and notice waiting thread

-* @param p [IN]: no meaning

-* @return

-* always null

-*/

-void *thread_rc_recv(void *p)

-{

-    Parcel* rc_p;

-    std::list<Parcel*>::iterator iter;

-    int resp_type = -1;   

-    char rc_data[LYNQ_REC_BUF];

-    int rc_len;

-    int null_cnt=0;

-    int wakeup_token; 

- 

-    LYINFLOG("rc thread is running");

-    while(network_rc_status)

-    {

-        bzero(rc_data,LYNQ_REC_BUF);

-        while(true)

-        {

-            rc_len = recvfrom(network_sock_fd,rc_data,sizeof(rc_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);

-            if(rc_len<sizeof(int32_t)*2)

-            {

-                 LYERRLOG("%s recv len %d less %d",__func__, rc_len,sizeof(int)*2);

-                 continue;

-            } 

-            rc_p= new Parcel;

-            if(rc_p==NULL)

-            {

-                null_cnt++;

-                LYERRLOG("%s rc_p is NULL, cnt is %d",__func__, null_cnt);

-                if(null_cnt>20)

-                {

-                    goto rc_recv_end;

-                }

-                continue;

-            }

-            else 

-            {

-                null_cnt=0;

-            }

-                

-            rc_p->setData((uint8_t *)rc_data,rc_len); // p.setData((uint8_t *) buffer, buflen);

-            rc_p->setDataPosition(0);

-            if(rc_p->dataAvail()>0)

-            {

-                rc_p->readInt32(&resp_type); 

-                rc_p->readInt32(&wakeup_token); 

-                BLOCK_RC_MSG_LOCK();

-                g_recv_parcel_list.push_back(rc_p);                

-                LYINFLOG("%s wakeup token is %d, list size is %d!",__func__,wakeup_token,g_recv_parcel_list.size());

-                if(g_recv_parcel_list.size()>20) //max 20

-                {

-                    iter=g_recv_parcel_list.begin();

-                    (*iter)->setDataPosition(0);

-                    (*iter)->readInt32(&resp_type); 

-                    (*iter)->readInt32(&wakeup_token); 

-                    delete (*(g_recv_parcel_list.begin()));

-                    LYERRLOG("%s wakeup token %d is deleted!",__func__,wakeup_token);

-                    g_recv_parcel_list.erase(iter);

-                }                   

-                BLOCK_WAKEUP_RECV_MSG();

-                BLOCK_RC_MSG_UNLOCK();

-                break;

-            }

-            else

-            {

-                LYERRLOG("%s rc_p data Avail %d not greater than 0",__func__, rc_p->dataAvail());

-                delete rc_p;

-            }

-        }

-    }                 

-

-rc_recv_end:    

-    return NULL;

-}

-

-void *thread_urc_recv(void *p)

-{

-    Parcel *urc_p =NULL;

-    char urc_data[LYNQ_REC_BUF];

-    int resp_type = -1;

-    int urc_id = -1;

-    int res = 0;

-    int none = 0;

-    int NR_sum = 0;

-    int urc_LTE_signalstrength = 0;

-    int urc_WCDMA_signalstrength = 0;

-    LYINFLOG("urc thread is running");

-    while(network_urc_status)

-    {

-        bzero(urc_data,LYNQ_REC_BUF);

-        res = recvfrom(network_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&network_urc_addr_serv,(socklen_t*)&network_len_urc_addr_serv);

-        if(res<=0)

-        {

-            LYERRLOG("thread_urc_recv step2 fail:");

-            break;

-        }

-        urc_p = new Parcel();

-        if(urc_p == NULL)

-        {

-            LYERRLOG("new parcel failure!!!");

-            break;

-        }

-        urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);

-        urc_p->setDataPosition(0);

-        if(urc_p->dataAvail()>0)

-        {

-            urc_p->readInt32(&resp_type);

-            urc_p->readInt32(&urc_id);

-            urc_p->readInt32(&network_urc_slot_id);

-            switch(urc_id)

-            {

-                case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:

-                {

-                    set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,false);

-                    network_wait_urc_id = urc_id;

-                    LYINFLOG("slot_id = %d",network_urc_slot_id);

-                    send_signal_changes();

-                    break;

-                }

-                case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:

-                {                    

-                    set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_DATA_REG,false);

-                    network_wait_urc_id = urc_id;

-                    LYINFLOG("slot_id = %d",network_urc_slot_id);

-                    send_signal_changes();

-                    break;

-                }

-                case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:

-                {                   

-                    set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_IMS_REG,false);

-                    network_wait_urc_id = urc_id;

-                    LYINFLOG("slot_id = %d",network_urc_slot_id);

-                    send_signal_changes();

-                    break;

-                }

-                case RIL_UNSOL_SIGNAL_STRENGTH:

-                {

-                    urc_p->readInt32(&network_urc_solSigStren.rssi);

-                    if((network_urc_solSigStren.rssi!=99)&&(network_urc_solSigStren.rssi!=0))

-                    {

-                        network_urc_solSigStren.gw_sig_valid = 1;

-                    }else{

-                        network_urc_solSigStren.gw_sig_valid = 0;

-                    }

-                    if(network_urc_solSigStren.gw_sig_valid == 1)

-                    {

-                        LYINFLOG("urc_GSM_signalstrength:%d",network_urc_solSigStren.rssi);

-                    }

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&urc_LTE_signalstrength);

-                    // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);

-                    urc_p->readInt32(&network_urc_solSigStren.rsrp);

-                    urc_p->readInt32(&network_urc_solSigStren.rsrq);

-                    urc_p->readInt32(&network_urc_solSigStren.rssnr);

-                    if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))

-                    {

-                        network_urc_solSigStren.lte_sig_valid = 1;

-                    }else{

-                        network_urc_solSigStren.lte_sig_valid = 0;

-                    }

-                    if(network_urc_solSigStren.lte_sig_valid == 1)

-                    {

-                        LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);

-                    }

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&urc_WCDMA_signalstrength);

-                    urc_p->readInt32(&none);

-                    urc_p->readInt32(&network_urc_solSigStren.rscp);

-                    urc_p->readInt32(&network_urc_solSigStren.ecno);

-                    if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))

-                    {

-                        network_urc_solSigStren.wcdma_sig_valid = 1;

-                    }else{

-                        network_urc_solSigStren.wcdma_sig_valid = 0;

-                    }

-                    if(network_urc_solSigStren.wcdma_sig_valid == 1)

-                    {

-                        LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);

-                    }

-                    urc_p->readInt32(&network_urc_solSigStren.ssRsrp);

-                    urc_p->readInt32(&network_urc_solSigStren.ssRsrq);

-                    urc_p->readInt32(&network_urc_solSigStren.ssSinr);

-                    urc_p->readInt32(&network_urc_solSigStren.csiRsrp);

-                    urc_p->readInt32(&network_urc_solSigStren.csiRsrq);

-                    urc_p->readInt32(&network_urc_solSigStren.csiSinr);

-                    NR_sum = (network_urc_solSigStren.ssRsrp) + (network_urc_solSigStren.ssRsrq) + (network_urc_solSigStren.ssSinr) + (network_urc_solSigStren.csiRsrp)+\

-                    (network_urc_solSigStren.csiRsrq) + (network_urc_solSigStren.csiSinr);

-                    if(NR_sum != 0)

-                    {

-                        network_urc_solSigStren.nr_sig_valid = 1;

-                    }else{

-                        network_urc_solSigStren.nr_sig_valid = 0;

-                    }

-                    if(network_urc_solSigStren.nr_sig_valid == 1)

-                    {

-                        LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\

-                        network_urc_solSigStren.ssRsrp,network_urc_solSigStren.ssRsrq,network_urc_solSigStren.ssSinr, \

-                        network_urc_solSigStren.csiRsrp,network_urc_solSigStren.csiRsrq,network_urc_solSigStren.csiSinr);

-                    }

-                    network_wait_urc_id = urc_id;

-                    send_signal_changes();

-                    break;

-                }

-            }

-        }

-        delete urc_p;

-        urc_p = NULL;

-    }

-    return NULL;

-}

-

-int lynq_server_socket_start()

-{

-//    struct timeval timeOut;

-    network_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);

-    if(-1 == network_sock_fd)

-    {

-        LYERRLOG("socket open error");

-        return -1;

-    }

-# if 0

-    timeOut.tv_sec = 5;

-    timeOut.tv_usec = 0;

-    if (setsockopt(network_sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)

-    {

-        LYERRLOG("time out setting failed\n");

-        return -1;

-    }

-#endif

-

-    LYINFLOG("network_sock_fd = %d",network_sock_fd);

-

-    memset(&network_addr_serv, 0, sizeof(network_addr_serv));

-    network_addr_serv.sin_family = AF_INET;

-    network_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);

-    network_addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);

-    network_len_addr_serv = sizeof(network_addr_serv);

-

-    BLOCK_RC_MSG_LOCK(); 

-    std::list<Parcel*>::iterator iter;

-    for(iter=g_recv_parcel_list.begin();iter!=g_recv_parcel_list.end();++iter)

-    {

-        delete (*iter);        

-    }

-    g_recv_parcel_list.clear();  

-    BLOCK_RC_MSG_UNLOCK(); 

-

-    pthread_t tid;

-    pthread_attr_t attr;

-    int ret;

-

-    pthread_attr_init(&attr);

-    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

-    ret = pthread_create(&tid,&attr,thread_rc_recv,NULL);

-    if(ret <0)

-    {

-        LYERRLOG("rc pthread create error");

-        return -1;

-    }

-    LYINFLOG("rc start success");

-

-    return 0;

-}

-

-int lynq_urc_socket_start()

-{

-    pthread_t tid;

-    pthread_attr_t attr;

-    int on = 1;

-    network_urc_sock_fd = -1;

-    int ret = 0;

-    network_len_urc_addr_serv = sizeof(sockaddr_in);

-    network_urc_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);

-    if (network_urc_sock_fd <0){

-        LYERRLOG("urc socket error");

-        ret = -1;

-    }

-    network_urc_addr_serv.sin_family = AF_INET;

-    network_urc_addr_serv.sin_port = htons(LYNQ_URC_SERVICE_PORT);

-    network_urc_addr_serv.sin_addr.s_addr = inet_addr(LYNQ_URC_ADDRESS);

-    /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/

-    ret = setsockopt(network_urc_sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);

-    if(ret <0)

-    {

-        LYERRLOG("urc socket set error");

-        return -1;

-    }

-    ret = bind(network_urc_sock_fd ,(struct sockaddr*)&network_urc_addr_serv, sizeof(network_urc_addr_serv));

-    if(ret <0)

-    {

-        LYERRLOG("urc socket bind error");

-        return -1;

-    }

-    pthread_attr_init(&attr);

-    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

-    ret = pthread_create(&tid,&attr,thread_urc_recv,(void *)network_urc_sock_fd);

-    if(ret <0)

-    {

-        LYERRLOG("urc pthread create error");

-        return -1;

-    }

-    LYINFLOG("urc start success");

-    

-    return 0;

-}

+int g_module_init_flag = 0;

 

 int lynq_network_init(int utoken){

-    if(g_lynq_network_init_flag == 1)

+    if(g_module_init_flag != MODULE_CLOSED)

     {

-        LYERRLOG("init twice is not allowed");

-        return -1;

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

+        return LYNQ_E_CONFLICT;

     }

-    g_lynq_network_init_flag = 1;

-    if(utoken <0){

-        LYERRLOG("init err");

-        return -1;

+    

+   if(utoken <0){

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

+        return LYNQ_E_PARAMETER_ANONALY;

     }

-    network_urc_status = 1;

-    network_rc_status = 1;

-    network_Global_uToken = utoken;

+

+    g_module_init_flag = MODULE_SWITCHING;

+

+    g_module_Global_uToken = utoken;

     LYLOGSET(LOG_INFO);

     LYLOGEINIT(USER_LOG_TAG);

-    int ret = 0;

+    

+    int ret;

 

     init_network_timer_all();

 

+    ret = lynq_urc_socket_start();

+    if(ret != 0)

+    {

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

+        g_module_init_flag = MODULE_CLOSED;  

+        return LYNQ_E_INNER_ERROR;

+    }

+

     ret = lynq_server_socket_start();

     if(ret !=0)

     {

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

-        return -1;

+        lynq_close_urc_thread();

+        g_module_init_flag = MODULE_CLOSED;  

+        return LYNQ_E_INNER_ERROR;

     }

-    ret = lynq_urc_socket_start();

-    if(ret != 0)

-    {

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

-        return -1;

-    }

-    pthread_mutex_init(&g_lynq_network_sendto_mutex, NULL);   

-    pthread_mutex_init(&s_RecvMsgBlockMutex, NULL);   

+    g_module_init_flag = MODULE_RUNNING;

     

-    return 0;

+    return RESULT_OK;    

+}

+

+int lynq_network_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_urc_thread();

+    lynq_close_rc_thread();    

+    deinit_network_timer_all();

+

+    g_module_init_flag = MODULE_CLOSED;

+    return RESULT_OK;    

 }

 

 int strUpper(char * str)

@@ -707,7 +108,7 @@
         }

         i++;

     }

-    return 0;

+    return RESULT_OK;      

 }

 

 int copyCellInfoList(Parcel* &p,uint64_t *cellinfo,int *tac,int *earfcn)

@@ -717,6 +118,7 @@
     if(NULL == cellinfo)

     {

         LYERRLOG("*cellinfo error");

+        return LYNQ_E_PARAMETER_ANONALY;   

     }

 

     int nothing = 0;

@@ -820,35 +222,7 @@
     LYINFLOG("CID in fUNC :%llu",*cellinfo);

     LYINFLOG("tac in fUNC :%d",*tac);

     LYINFLOG("earfcn in fUNC :%d",*earfcn);

-    return 0;

-}

-

-int lynq_network_deinit(void){

-    if (g_lynq_network_init_flag == 0)

-    {

-        LYERRLOG("deinit twice is not allowed");

-        return -1;

-    }

-    if (network_sock_fd > 0)

-    {

-        close(network_sock_fd);

-    }

-    g_lynq_network_init_flag = 0;

-    network_urc_status = 0;

-    network_rc_status = 0;

-

-    deinit_network_timer_all();

-

-    BLOCK_RC_MSG_LOCK(); 

-    std::list<Parcel*>::iterator iter;

-    for(iter=g_recv_parcel_list.begin();iter!=g_recv_parcel_list.end();++iter)

-    {

-        delete (*iter);        

-    }

-    g_recv_parcel_list.clear();  

-    BLOCK_RC_MSG_UNLOCK(); 

-

-    return 0;

+    return RESULT_OK;    

 }

 

 static char * lynqStrdupReadString(Parcel* &p) {

@@ -861,123 +235,112 @@
 

 int lynq_query_operater(char *OperatorFN,char *OperatorSH,char *MccMnc)

 {

-    int ret = -1;

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+    

     if(NULL == OperatorFN||NULL == OperatorSH|| NULL == MccMnc)

     {

         LYERRLOG("%s some parameter OperatorFN OperatorSH MccMnc %s %s %s is NULL",__func__,OperatorFN,OperatorSH,MccMnc);  

-        return ret;   

+        return LYNQ_E_PARAMETER_ANONALY;   

     }    

-    lynq_resp_t head; 

+

     Parcel* p=NULL;

-    

-    ret=lynq_get_common_request(RIL_REQUEST_OPERATOR,5,p,0,"");

-    if(ret==0)

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

+

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }       

+ 

+    int num ;

+    char *resp[LYNQ_RESP_STRING_MAX_NUM];

 

-        int num ;

-        char *resp[LYNQ_RESP_BUF];

-

-        p->readInt32(&num);

-        if(num == 0)

+    p->readInt32(&num);

+    if(num == 0 || num > LYNQ_RESP_STRING_MAX_NUM)

+    {

+        LYERRLOG("no paramters or num %d too great",num);        

+        delete p;      

+        return LYNQ_E_INNER_ERROR;    

+    }else{

+        int i;

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

         {

-            LYERRLOG("no paramters");

-        }else{

-            for(int i = 0; i<num;i++)

-            {

-                resp[i] = lynqStrdupReadString(p);

-            }

-            if(NULL != resp[0])

-            {

-                strcpy(OperatorFN,resp[0]);

-            }

-            if(NULL != resp[1])

-            {

-                strcpy(OperatorSH,resp[1]);

-            }

-            if(NULL != resp[2])

-            {

-                strcpy(MccMnc,resp[2]);

-            }

+            resp[i] = lynqStrdupReadString(p);

         }

-

-        LYINFLOG("%s suc",__func__);   

-        delete p;       

-        return 0;

+        if(NULL != resp[0])

+        {

+            strcpy(OperatorFN,resp[0]);

+        }

+        if(NULL != resp[1])

+        {

+            strcpy(OperatorSH,resp[1]);

+        }

+        if(NULL != resp[2])

+        {

+            strcpy(MccMnc,resp[2]);

+        }

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

+        {

+            if(resp[i]!=NULL)

+            {

+                free(resp[i]);            

+            }            

+        }

     }

 

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;  

+    LYINFLOG("%s suc",__func__);   

+    delete p;       

+    return RESULT_OK;    

 }

 

 int lynq_query_network_selection_mode(int *netselMode)

 {

-    int ret = -1;

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+

     if(NULL == netselMode)

     {

         LYERRLOG("%s parameter is NULL",__func__);  

-        return ret;   

+        return LYNQ_E_PARAMETER_ANONALY;   

     }    

-    lynq_resp_t head; 

-    Parcel* p=NULL;

-    

-    ret=lynq_get_common_request(RIL_REQUEST_QUERY_NETWORK_SELECTION_MODE,600,p,0,"");

-    if(ret==0)

+ 

+    Parcel* p=NULL;    

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

+

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

+    

+    int readnum;

+    p->readInt32(&readnum);

+    p->readInt32(netselMode);

 

-        int readnum;

-        p->readInt32(&readnum);

-        p->readInt32(netselMode);

-

-        LYINFLOG("%s suc",__func__);   

-        delete p;       

-        return 0;

-    }

-    return ret;  

+    LYINFLOG("%s suc",__func__);   

+    delete p;       

+    return RESULT_OK;  

 }

 

 int lynq_set_network_selection_mode(const char *mode,const char* mccmnc)

 {

-    int ret = -1; 

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+    

     if(NULL == mode || (strlen(mode) == 0))

     {

         LYERRLOG("%s parameter mod %s is error",__func__,mode);  

-        return -1;

+        return LYNQ_E_PARAMETER_ANONALY;

     }

 

     if(!strcmp(mode,"Manual"))

@@ -985,145 +348,120 @@
         if(mccmnc == NULL || strlen(mccmnc) == 0)

         {

              LYERRLOG("%s parameter mccmnc %s is error",__func__,mccmnc);  

-             return -1;

+             return LYNQ_E_PARAMETER_ANONALY;

         }        

     }

     

-    lynq_resp_t head; 

     Parcel* p=NULL;

+    int ret;

 

     if(!strcmp(mode,"Auto"))

     {

-        ret=lynq_get_common_request(RIL_REQUEST_SET_NETWORK_SELECTION_AUTOMATIC,5,p,0,"");

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

     }

     else if(!strcmp(mode,"Manual"))

     {

-        ret=lynq_get_common_request(RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,5,p,1,"%s",mccmnc); 

+        ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_NETWORK_SELECTION_MANUAL,1,"%s",mccmnc); 

     }

     else 

     {

-        LYERRLOG("%s parameter mode %s is NULL",__func__,mode);  

-        return -1;

-    }

-        

-    

-    if(ret==0)

-    {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error %d",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-        LYINFLOG("%s set mode %s mccmnc %s suc",__func__,mode,mccmnc);   

-        delete p;

-        return 0;

+        LYERRLOG("%s parameter mode %s is errir",__func__,mode);  

+        return LYNQ_E_PARAMETER_ANONALY;

     }

 

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;    

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

+        

+    LYINFLOG("%s set mode %s mccmnc %s suc",__func__,mode,mccmnc);   

+    delete p;

+    return RESULT_OK;  

 }

 

 int lynq_query_available_network(char *OperatorFN,char *OperatorSH,char *MccMnc,char * NetStatus)

 {

-    int ret = -1;

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

     if(NULL == OperatorFN||NULL == OperatorSH||NULL == MccMnc||NULL == NetStatus)

     {

         LYERRLOG("%s there is parameter is NULL",__func__);  

-        return ret;

+        return LYNQ_E_PARAMETER_ANONALY;

     }  

-    

-    lynq_resp_t head; 

+

     Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,600,RIL_REQUEST_QUERY_AVAILABLE_NETWORKS,0,"");

 

-    ret=lynq_get_common_request(RIL_REQUEST_QUERY_AVAILABLE_NETWORKS,600,p,0,"");

-    if(ret==0)

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error %d",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-        

-        int num =p->readInt32();

-        char *resp[128];

-        if(num == 0)

-        {

-            LYERRLOG("%s get num is 0",__func__);

-            delete p;

-            return -1;

-        }else{

-            for(int i = 0; i<num;i++)

-            {

-                resp[i] = lynqStrdupReadString(p);

-            }

-            if(NULL != resp[0])

-            {

-                strcpy(OperatorFN,resp[0]);

-            }

-            if(NULL != resp[1])

-            {

-                strcpy(OperatorSH,resp[1]);

-            }

-            if(NULL != resp[2])

-            {

-                strcpy(MccMnc,resp[2]);

-            }

-            if(NULL != resp[3])

-            {

-                strcpy(NetStatus,resp[2]);

-            }

-        }

-        delete p;

-        LYINFLOG("%s suc",__func__);   

-        return 0;

-    }

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

 

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;

+    int num =p->readInt32();

+    char *resp[LYNQ_RESP_STRING_MAX_NUM];

+    if(num == 0 || num > LYNQ_RESP_STRING_MAX_NUM)

+    {

+        LYERRLOG("no paramters or num %d too great",num);        

+        delete p;      

+        return LYNQ_E_INNER_ERROR;    

+    }else{

+        int i;

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

+        {

+            resp[i] = lynqStrdupReadString(p);

+        }

+        if(NULL != resp[0])

+        {

+            strcpy(OperatorFN,resp[0]);

+        }

+        if(NULL != resp[1])

+        {

+            strcpy(OperatorSH,resp[1]);

+        }

+        if(NULL != resp[2])

+        {

+            strcpy(MccMnc,resp[2]);

+        }

+        if(NULL != resp[3])

+        {

+            strcpy(NetStatus,resp[2]);

+        }

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

+        {

+            if(resp[i]!=NULL)

+            {

+                free(resp[i]);            

+            }            

+        }

+    }

+    delete p;

+    LYINFLOG("%s suc",__func__);   

+    return RESULT_OK;  

 }

 

 int lynq_query_registration_state(const char *type,int* regState,int* imsRegState,char * LAC,char * CID,int *netType,int *radioTechFam,int *netRejected)

 {

-    int ret = -1;

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+    

     if(NULL == type || NULL ==regState ||NULL ==imsRegState ||NULL ==LAC ||NULL ==CID ||NULL ==netType ||NULL ==radioTechFam || NULL == netRejected)

     {

         LYERRLOG("%s there is parameter is NULL",__func__);  

-        return ret;

+        return LYNQ_E_PARAMETER_ANONALY;

     }  

     if(strlen(type)>LYNQ_TYPE_BUF)

     {

         LYERRLOG("[%s]the parameter is inavaliable !",__FUNCTION__);

-        return ret;   

-    }

-    

-    lynq_resp_t head; 

-    Parcel* p=NULL;

+        return LYNQ_E_PARAMETER_ANONALY;   

+    }   

     

     int request;

     char str[LYNQ_TYPE_BUF];   

@@ -1150,752 +488,742 @@
         request = RIL_REQUEST_IMS_REGISTRATION_STATE;

     }else{

         LYERRLOG("request error");

-        return ret;

+        return LYNQ_E_PARAMETER_ANONALY;

     }    

 

-    ret=lynq_get_common_request(request,5,p,0,"");

-    if(ret==0)

+    Parcel* p=NULL;

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

+

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

+    

+    int num,i;

+    char *resp[LYNQ_RESP_STRING_MAX_NUM];       

+    if(!strcmp(str,"VOICE"))

+    {

+        p->readInt32(&num);

+        if(num == 15)

         {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

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

+            {

+                resp[i]=lynqStrdupReadString(p);

+            }            

+            *regState = atoi(resp[0]);

+            *netType = atoi(resp[3]);

+            *netRejected = atoi(resp[14]);     

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

+            {

+                if(resp[i]!=NULL)

+                {

+                    free(resp[i]);            

+                }            

+            }            

+            set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,*regState,*netType,*netRejected,0);

         }

-        ret=GetHeader(p,head);

-        if(ret!=0)

+        else 

         {

-            LYERRLOG("%s get head error %d",__func__,ret);

+            LYERRLOG("%s type %s num %d error",__func__,str,num);

             delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-        int num;

-        if(!strcmp(str,"VOICE"))

-        {

-            p->readInt32(&num);

-            if(num == 15)

-            {

-                *regState = atoi(lynqStrdupReadString(p));

-                lynqStrdupReadString(p);

-                lynqStrdupReadString(p);

-                *netType = atoi(lynqStrdupReadString(p));

-                lynqStrdupReadString(p);

-                lynqStrdupReadString(p);

-                lynqStrdupReadString(p);

-                lynqStrdupReadString(p);

-                lynqStrdupReadString(p);

-                lynqStrdupReadString(p);

-                lynqStrdupReadString(p);

-                lynqStrdupReadString(p);

-                lynqStrdupReadString(p);

-                lynqStrdupReadString(p);

-                *netRejected = atoi(lynqStrdupReadString(p));       

-                set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,*regState,*netType,*netRejected,0);

-            }

-            else 

-            {

-                LYERRLOG("%s type %s num %d error",__func__,str,num);

-                delete p;

-                return -1;

-            }            

-        }

-        else if(!strcmp(str,"DATA")){

-            p->readInt32(&num);

-            if(num == 11)

-            {

-                char *resp[LYNQ_RESP_BUF];

-                *regState = atoi(lynqStrdupReadString(p));

-                resp[0] = lynqStrdupReadString(p);

-                strcpy(LAC,resp[0]);

-

-                resp[1] = lynqStrdupReadString(p);

-                strcpy(CID,resp[1]);

-                *netType = atoi(lynqStrdupReadString(p));

-                set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,*regState,*netType,2,LAC,CID);

-            }

-            else 

-            {

-                LYERRLOG("%s type %s num %d error",__func__,str,num);

-                delete p;

-                return -1;

-            }            

-

-        }

-        else // "IMS"

-        {

-            p->readInt32(&num);

-            if(num == 2)

-            {

-                p->readInt32(imsRegState);

-                p->readInt32(radioTechFam);

-                set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,*imsRegState,*radioTechFam,0);

-            }

-            else 

-            {

-                LYERRLOG("%s type %s num %d error",__func__,str,num);

-                delete p;

-                return -1;

-            }            

-        }

-        LYINFLOG("%s suc",__func__); 

-        delete p;        

-        return 0;

+            return LYNQ_E_INNER_ERROR;

+        }            

     }

+    else if(!strcmp(str,"DATA")){

+        p->readInt32(&num);

+        if(num == 11)

+        {                

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

+            {

+                resp[i]=lynqStrdupReadString(p);

+            }            

+            *regState = atoi(resp[0]);

+            strcpy(LAC,resp[1]);

+            strcpy(CID,resp[2]);

+            *netType = atoi(resp[3]);

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

+            {

+                if(resp[i]!=NULL)

+                {

+                    free(resp[i]);            

+                }           

+            }            

+            set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,*regState,*netType,2,LAC,CID);

+        }

+        else 

+        {

+            LYERRLOG("%s type %s num %d error",__func__,str,num);

+            delete p;

+            return LYNQ_E_INNER_ERROR;

+        }            

 

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;

+    }

+    else // "IMS"

+    {

+        p->readInt32(&num);

+        if(num == 2)

+        {

+            p->readInt32(imsRegState);

+            p->readInt32(radioTechFam);

+            set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,*imsRegState,*radioTechFam,0);

+        }

+        else 

+        {

+            LYERRLOG("%s type %s num %d error",__func__,str,num);

+            delete p;

+            return LYNQ_E_INNER_ERROR;

+        }            

+    }

+    LYINFLOG("%s suc",__func__); 

+    delete p;        

+    return RESULT_OK;     

 }

 

 int lynq_query_prefferred_networktype(int *preNetType)

 {    

-    int ret = -1;

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

     if(NULL == preNetType)

     {

         LYERRLOG("%s there is parameter is NULL",__func__);  

-        return ret;

-    }      

-    

-    lynq_resp_t head; 

-    Parcel* p=NULL;

-      

-    ret=lynq_get_common_request(RIL_REQUEST_GET_PREFERRED_NETWORK_TYPE,5,p,0,"");

-    if(ret==0)

-    {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error %d",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-        int num;

-        p->readInt32(&num);

-        p->readInt32(preNetType);  

-        LYINFLOG("%s suc",__func__); 

-        delete p;

-        return 0;

-    }

+        return LYNQ_E_PARAMETER_ANONALY;

+    }          

 

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;

+    Parcel* p=NULL;

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

+

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

+    

+    int num;

+    p->readInt32(&num);

+    p->readInt32(preNetType);  

+    

+    LYINFLOG("%s suc",__func__); 

+    delete p;

+    return RESULT_OK;  

 }

 

 int lynq_set_prefferred_networktype(const int preffertype)

 {

-    int ret = -1;

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

     if(preffertype < 0||preffertype >33)

     {

         LYERRLOG("%s parameter %d error",__func__,preffertype);  

-        return ret;

+        return LYNQ_E_PARAMETER_ANONALY;

     }     

-    

-    lynq_resp_t head; 

+

     Parcel* p=NULL;

-      

-    ret=lynq_get_common_request(RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE,5,p,1,"%d",preffertype);

-    if(ret==0)

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_SET_PREFERRED_NETWORK_TYPE,1,"%d",preffertype);

+     

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error %d",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-        LYINFLOG("%s set %d suc",__func__,preffertype);     

-        delete p;

-        return 0;

-    }

-

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;

-

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

+    

+    LYINFLOG("%s set %d suc",__func__,preffertype);     

+    delete p;

+    return RESULT_OK;  

+   

 }

 

 int lynq_query_cell_info(uint64_t cellinfo[CELLINFO_MAX_NUM],int tac[CELLINFO_MAX_NUM],int earfcn[CELLINFO_MAX_NUM],int * realNum)

 {

-    int ret = -1;

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

     if(NULL == realNum)

     {

         LYERRLOG("%s there is parameter is NULL",__func__);  

-        return ret;

+        return LYNQ_E_PARAMETER_ANONALY;

     }      

     

-    lynq_resp_t head; 

-    Parcel* p=NULL;

-      

-    ret=lynq_get_common_request(RIL_REQUEST_GET_CELL_INFO_LIST,5,p,0,"");

-    if(ret==0)

+    Parcel* p=NULL;      

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

+    

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error %d",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

+    

+    int num;

 

-        int num;

-

-        p->readInt32(&num);

-        LYINFLOG("cell info num:%d",num);

-        *realNum = num;

-        for(int i = 0;i<num;i++)

-        {

-            copyCellInfoList(p,&cellinfo[i],&tac[i],&earfcn[i]);

-        }

-        

-        LYINFLOG("%s suc",__func__); 

-        delete p;

-        return 0;

+    p->readInt32(&num);

+    LYINFLOG("cell info num:%d",num);

+    *realNum = num;

+    for(int i = 0;i<num;i++)

+    {

+        copyCellInfoList(p,&cellinfo[i],&tac[i],&earfcn[i]);

     }

-

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;

-

+    

+    LYINFLOG("%s suc",__func__); 

+    delete p;

+    return RESULT_OK;  

 }

 

 int lynq_set_unsol_cell_info_listrate(const int rate)

 {

-    int ret = -1; 

-    lynq_resp_t head; 

-    Parcel* p=NULL;

-      

-    ret=lynq_get_common_request(RIL_REQUEST_SET_UNSOL_CELL_INFO_LIST_RATE,5,p,1,"%d",rate);

-    if(ret==0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error %d",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-        LYINFLOG("%s set %d suc",__func__,rate);    

-        delete p;

-        return 0;

+        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_UNSOL_CELL_INFO_LIST_RATE,1,"%d",rate);

 

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

+    

+    LYINFLOG("%s set %d suc",__func__,rate);    

+    delete p;

+    return RESULT_OK;      

 }

 

 int lynq_set_band_mode(const int bandmode)

 {

-    int ret = -1; 

-    lynq_resp_t head; 

-    Parcel* p=NULL;

-      

-    ret=lynq_get_common_request(RIL_REQUEST_SET_BAND_MODE,5,p,1,"%d",bandmode);

-    if(ret==0)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error %d",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-        LYINFLOG("%s set %d suc",__func__,bandmode);    

-        delete p;

-        return 0;

+        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_BAND_MODE,1,"%d",bandmode);

 

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

+    

+    LYINFLOG("%s set %d suc",__func__,bandmode);    

+    delete p;

+    return RESULT_OK;  

 }

 

 int lynq_query_available_bandmode(int availBanMode[])

 {

-    int ret=-1;   

-        

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

     if(NULL == availBanMode)

     {

         LYERRLOG("%s parameter is NULL",__func__);  

-        return ret;

+        return LYNQ_E_PARAMETER_ANONALY;

     }

 

-    lynq_resp_t head; 

     Parcel* p=NULL;

-

-    ret=lynq_get_common_request(RIL_REQUEST_QUERY_AVAILABLE_BAND_MODE,5,p,0,"");

-    if(ret==0)

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

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-

-        int num = 0;

-        int res = 0;

-        int i;

-

-        p->readInt32(&num);

-        LYINFLOG("num = %d",num);

-        availBanMode[0] = num;

-        for(i=1 ;i<=num;i++)

-        {

-            p->readInt32(&res);

-            availBanMode[i]=res;

-        }

-     

-        LYINFLOG("%s suc",__func__);  

-        delete p;

-        return 0;           

-    }

-

-    LYERRLOG("%s send request error %d",__func__,ret);  

-

-    return ret;

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }   

     

+    int num = 0;

+    int res = 0;

+    int i;

+

+    p->readInt32(&num);

+    LYINFLOG("num = %d",num);

+    availBanMode[0] = num;

+    for(i=1 ;i<=num;i++)

+    {

+        p->readInt32(&res);

+        availBanMode[i]=res;

+    }

+ 

+    LYINFLOG("%s suc",__func__);  

+    delete p;

+    return RESULT_OK;                

 }

 

 int lynq_radio_on(const int data)

-{    

-    int ret = -1;

+{     

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

     if (data < 0 || data > 1)

     {

         LYERRLOG("%s parameter %d error",__func__,data);  

-        return ret;

+        return LYNQ_E_PARAMETER_ANONALY;

     }     

     

-    lynq_resp_t head; 

-    Parcel* p=NULL;

-      

-    ret=lynq_get_common_request(RIL_REQUEST_RADIO_POWER,65,p,1,"%d",data);

-    if(ret==0)

-    {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error %d",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-        LYINFLOG("%s set %d suc",__func__,data);  

-        delete p;

-        return 0;

-    }

+    Parcel* p=NULL;      

+    int ret=lynq_send_common_request(p,65,RIL_REQUEST_RADIO_POWER,1,"%d",data);

 

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }       

+

+    LYINFLOG("%s set %d suc",__func__,data);  

+    delete p;

+    return RESULT_OK;  

 }

 

 const char * lynq_get_raw_data(Parcel* &p, int* data_len) 

 {

-    int32_t len;

+    int32_t len;
     int status;

     char *data;

 

     *data_len=0;

-

+
     status = p->readInt32(&len);

-

+
     if (status != 0) {

         LYERRLOG("%s status is %d",__func__,status);

         return NULL;

-    }

-

-    // The java code writes -1 for null arrays

+    }
+
+    // The java code writes -1 for null arrays
     if (((int)len) == -1 || ((int)len) == 0) 

     {

         LYERRLOG("%s len is %d",__func__,len);

         return NULL;

     }

     LYINFLOG("%s len is %d",__func__,len);

-

+
     data = (char*) p->readInplace(len); 

     *data_len=len;

-

+
     return data;

 }

 

 int lynq_query_radio_state(int *radio_state)

 {

-    int ret=-1;   

-        

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

     if(NULL == radio_state)

     {

         LYERRLOG("%s radio state is NULL",__func__);  

-        return ret;

+        return LYNQ_E_PARAMETER_ANONALY;

     }

 

-    lynq_resp_t head; 

     Parcel* p=NULL;

-

-    ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"%s","AT+CFUN");

-    if(ret==0)

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s","AT+CFUN");

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }           

 

-        int bfind=false;

-        const char* data;

-        int data_len;

-        char* data_str;

-        char* start;

-        int length;

-        int i;

-        int num_start;

-        data = lynq_get_raw_data(p,&data_len);

-        if(data==NULL || data_len == 0)

-        {

-            LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);    

-            delete p;

-            return -1; 

-        }

-        data_str = (char*) calloc(1,data_len+1);

-        if (NULL == data_str) 

-        {

-             LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);         

-             delete p;

-             return -1;

-        }

-        memmove(data_str, data, data_len);     

-        data_str[data_len]='\0';           

-        LYINFLOG("%s return string is %s",__func__,data_str);  

-        start = strstr(data_str,"CFUN");

-        if(start!=NULL)

-        {

-             start=start+4;

-             length=strlen(start);

-             for(i=0; i<length;i++)

-             {

-                 if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))

-                 {

-                     bfind=true;  

-                     num_start=i;

-                 }

-                 else if(bfind && ((start[i] < '0') || (start[i] > '9')))

-                 {

-                    start[i]='\0';

-                    break;

-                 }

-             }

-             if(bfind)

-             {                    

-                 (*radio_state) = atoi(start+num_start);

-                 LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);  

-                 free(data_str);

-                 delete p;

-                 return 0;                        

-             }

-        }             

-        LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);  

-        free(data_str);

+    int bfind=false;

+    const char* data;

+    int data_len;

+    char* data_str;

+    char* start;

+    int length;

+    int i;

+    int num_start;

+    data = lynq_get_raw_data(p,&data_len);

+    if(data==NULL || data_len == 0)

+    {

+        LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);    

         delete p;

-        return -1;           

+        return LYNQ_E_INNER_ERROR; 

     }

-

-    LYERRLOG("%s send request error %d",__func__,ret);  

-

-    return ret;

+    data_str = (char*) calloc(1,data_len+1);

+    if (NULL == data_str) 

+    {

+         LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);         

+         delete p;

+         return LYNQ_E_MALLOC_ERROR;

+    }

+    memmove(data_str, data, data_len);     

+    data_str[data_len]='\0';           

+    LYINFLOG("%s return string is %s",__func__,data_str);  

+    start = strstr(data_str,"CFUN");

+    if(start!=NULL)

+    {

+         start=start+4;

+         length=strlen(start);

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

+         {

+             if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))

+             {

+                 bfind=true;  

+                 num_start=i;

+             }

+             else if(bfind && ((start[i] < '0') || (start[i] > '9')))

+             {

+                start[i]='\0';

+                break;

+             }

+         }

+         if(bfind)

+         {                    

+             (*radio_state) = atoi(start+num_start);

+             LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);  

+             free(data_str);

+             delete p;

+             return RESULT_OK;                         

+         }

+    }             

+    LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);  

+    free(data_str);

+    delete p;

+    return LYNQ_E_INNER_ERROR;              

 }

 

 int lynq_query_radio_tech(int* radioTech)

 {

-    int ret = -1;

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

     if(NULL == radioTech)

     {

         LYERRLOG("%s radio tech is NULL",__func__);  

-        return ret;   

+        return LYNQ_E_PARAMETER_ANONALY;   

     }    

 

-    lynq_resp_t head; 

     Parcel* p=NULL;

-

-    ret=lynq_get_common_request(RIL_REQUEST_VOICE_RADIO_TECH,5,p,0,"");

-    if(ret==0)

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

+    

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }              

          

-        int num;

-        p->readInt32(&num);

-        p->readInt32(radioTech);

+    int num;

+    p->readInt32(&num);

+    p->readInt32(radioTech);

 

-        LYINFLOG("%s suc",__func__);  

-        delete p;

-        return head.error;

-    }

-    return ret;   

+    LYINFLOG("%s suc",__func__);  

+    delete p;

+    return RESULT_OK;   

 }

 

 int lynq_solicited_signal_strength(signalStrength_t *solSigStren)

 {

-    int ret=-1;   

-        

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

     if(NULL == solSigStren)

     {

         LYERRLOG("%s parameter is NULL",__func__);  

-        return ret;

+        return LYNQ_E_PARAMETER_ANONALY;

     }

 

-    lynq_resp_t head; 

     Parcel* p=NULL;

-

-    ret=lynq_get_common_request(RIL_REQUEST_SIGNAL_STRENGTH,8,p,0,"");

-    if(ret==0)

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

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }            

+    

+    int sum = 0;

+    int LTE_signalstrength = 0;

+    int WCDMA_signalstrength = 0;

+    int none = 0;

 

-        int sum = 0;

-        int LTE_signalstrength = 0;

-        int WCDMA_signalstrength = 0;

-        int none = 0;

-

-        p->readInt32(&solSigStren->rssi);

-        if((solSigStren->rssi!=99)&&(solSigStren->rssi!=0))

-        {

-            solSigStren->gw_sig_valid = 1;

-        }else{

-            solSigStren->gw_sig_valid = 0;

-        }

-

-        p->readInt32(&none);

-        p->readInt32(&none);

-        p->readInt32(&none);

-        p->readInt32(&none);

-        p->readInt32(&none);

-        p->readInt32(&none);

-        p->readInt32(&none);

-        p->readInt32(&LTE_signalstrength);

-        // p->readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);

-        p->readInt32(&solSigStren->rsrp);

-        p->readInt32(&solSigStren->rsrq);

-        p->readInt32(&solSigStren->rssnr);

-        LYINFLOG("LTE_signalstrength:%d",LTE_signalstrength);

-        if((LTE_signalstrength!=99)&&(LTE_signalstrength!=0))

-        {

-            solSigStren->lte_sig_valid = 1;

-        }else{

-            solSigStren->lte_sig_valid = 0;

-        }

-

-        p->readInt32(&none);

-        p->readInt32(&none);

-        p->readInt32(&none);

-        p->readInt32(&none);

-        p->readInt32(&none);

-        p->readInt32(&WCDMA_signalstrength);

-        p->readInt32(&none);

-        p->readInt32(&solSigStren->rscp);

-        p->readInt32(&solSigStren->ecno);

-        LYINFLOG("WCDMA_signalstrength:%d",WCDMA_signalstrength);

-        if((WCDMA_signalstrength!=99)&&(WCDMA_signalstrength!=0))

-        {

-            solSigStren->wcdma_sig_valid = 1;

-        }else{

-            solSigStren->wcdma_sig_valid = 0;

-        }

-        /*bug fix*/

-        p->readInt32(&solSigStren->ssRsrp);

-        p->readInt32(&solSigStren->ssRsrq);

-        p->readInt32(&solSigStren->ssSinr);

-        p->readInt32(&solSigStren->csiRsrp);

-        p->readInt32(&solSigStren->csiRsrq);

-        p->readInt32(&solSigStren->csiSinr);

-        sum = (solSigStren->ssRsrp) + (solSigStren->ssRsrq) + (solSigStren->ssSinr) + (solSigStren->csiRsrp)+\

-        (solSigStren->csiRsrq) + (solSigStren->csiSinr);

-        if(sum != 0)

-        {

-            solSigStren->nr_sig_valid = 1;

-        }else{

-            LYERRLOG("None of NR signal info");

-        }        

-

-        LYINFLOG("%s suc",__func__);  

-        delete p;

-        return 0;           

+    p->readInt32(&solSigStren->rssi);

+    if((solSigStren->rssi!=99)&&(solSigStren->rssi!=0))

+    {

+        solSigStren->gw_sig_valid = 1;

+    }else{

+        solSigStren->gw_sig_valid = 0;

     }

 

-    LYERRLOG("%s send request error %d",__func__,ret);  

+    p->readInt32(&none);

+    p->readInt32(&none);

+    p->readInt32(&none);

+    p->readInt32(&none);

+    p->readInt32(&none);

+    p->readInt32(&none);

+    p->readInt32(&none);

+    p->readInt32(&LTE_signalstrength);

+    // p->readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);

+    p->readInt32(&solSigStren->rsrp);

+    p->readInt32(&solSigStren->rsrq);

+    p->readInt32(&solSigStren->rssnr);

+    LYINFLOG("LTE_signalstrength:%d",LTE_signalstrength);

+    if((LTE_signalstrength!=99)&&(LTE_signalstrength!=0))

+    {

+        solSigStren->lte_sig_valid = 1;

+    }else{

+        solSigStren->lte_sig_valid = 0;

+    }

 

-    return ret;

+    p->readInt32(&none);

+    p->readInt32(&none);

+    p->readInt32(&none);

+    p->readInt32(&none);

+    p->readInt32(&none);

+    p->readInt32(&WCDMA_signalstrength);

+    p->readInt32(&none);

+    p->readInt32(&solSigStren->rscp);

+    p->readInt32(&solSigStren->ecno);

+    LYINFLOG("WCDMA_signalstrength:%d",WCDMA_signalstrength);

+    if((WCDMA_signalstrength!=99)&&(WCDMA_signalstrength!=0))

+    {

+        solSigStren->wcdma_sig_valid = 1;

+    }else{

+        solSigStren->wcdma_sig_valid = 0;

+    }

+    /*bug fix*/

+    p->readInt32(&solSigStren->ssRsrp);

+    p->readInt32(&solSigStren->ssRsrq);

+    p->readInt32(&solSigStren->ssSinr);

+    p->readInt32(&solSigStren->csiRsrp);

+    p->readInt32(&solSigStren->csiRsrq);

+    p->readInt32(&solSigStren->csiSinr);

+    sum = (solSigStren->ssRsrp) + (solSigStren->ssRsrq) + (solSigStren->ssSinr) + (solSigStren->csiRsrp)+\

+    (solSigStren->csiRsrq) + (solSigStren->csiSinr);

+    if(sum != 0)

+    {

+        solSigStren->nr_sig_valid = 1;

+    }else{

+        LYERRLOG("None of NR signal info");

+    }        

+

+    LYINFLOG("%s suc",__func__);  

+    delete p;

+    return RESULT_OK;    

 }

 

 int lynq_set_ims(const int ims_mode)

 {

-    if(ims_mode == -1000)

+    if(g_module_init_flag != MODULE_RUNNING)

     {

-        g_inner_test = 1;

-        return 0;

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

+        return LYNQ_E_CONFLICT;

     }

-

-    int ret = -1;

     if (ims_mode < 0 || ims_mode > 1)

     {

         LYERRLOG("%s parameter %d error",__func__,ims_mode);  

-        return ret;

+        return LYNQ_E_PARAMETER_ANONALY;

     }     

-    

-    lynq_resp_t head; 

-    Parcel* p=NULL;

-      

-    ret=lynq_get_common_request(RIL_REQUEST_SET_IMS_ENABLE,65,p,1,"%d",ims_mode);

-    if(ret==0)

-    {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error %d",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-        LYINFLOG("%s set %d suc",__func__,ims_mode);    

-        delete p;

-        return 0;

-    }

 

-    LYERRLOG("%s get response from modem failure, ret is %d",__func__,ret);

-    return ret;

+    Parcel* p=NULL;

+    int ret = lynq_send_common_request(p,65,RIL_REQUEST_SET_IMS_ENABLE,1,"%d",ims_mode);

+    if(ret!=RESULT_OK)

+    {

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }        

+    

+    LYINFLOG("%s set %d suc",__func__,ims_mode);    

+    delete p;

+    return RESULT_OK;   

 }

 

+/*Used to get urc info*/

+int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)

+{

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+    LYDBGLOG("start get urc info");

+    if(handle != RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED &&handle != RIL_UNSOL_SIGNAL_STRENGTH)

+    {

+        LYINFLOG("invalid handle!!!");

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+    if((handle ==RIL_UNSOL_SIGNAL_STRENGTH && NULL == solSigStren) || 

+        (handle ==RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED && NULL == slot_id))

+    {

+        LYINFLOG("incoming solSigStren or slot_id is NULL!!!");

+        return LYNQ_E_PARAMETER_ANONALY;

+    }

+    switch(handle)

+    {

+        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED: //1002

+        {

+            LYDBGLOG("get state update to VOICE");

+            *slot_id = s_module_urc_slot_id;

+            LYINFLOG("slot_id = %d",s_module_urc_slot_id);

+            break;

+        }

+        case RIL_UNSOL_SIGNAL_STRENGTH: //1009

+        {

+            LYDBGLOG("get state update to signal info");

+            solSigStren->gw_sig_valid = s_network_urc_solSigStren.gw_sig_valid;

+            solSigStren->rssi = s_network_urc_solSigStren.rssi;

+            solSigStren->wcdma_sig_valid = s_network_urc_solSigStren.wcdma_sig_valid;

+            solSigStren->rscp = s_network_urc_solSigStren.rscp;

+            solSigStren->ecno = s_network_urc_solSigStren.ecno;

+            solSigStren->lte_sig_valid = s_network_urc_solSigStren.lte_sig_valid;

+            solSigStren->rsrp = s_network_urc_solSigStren.rsrp;

+            solSigStren->rsrq = s_network_urc_solSigStren.rsrq;

+            solSigStren->rssnr = s_network_urc_solSigStren.rssnr;

+            solSigStren->nr_sig_valid = s_network_urc_solSigStren.nr_sig_valid;

+            solSigStren->ssRsrp = s_network_urc_solSigStren.ssRsrp;

+            solSigStren->ssRsrq = s_network_urc_solSigStren.ssRsrq;

+            solSigStren->ssSinr = s_network_urc_solSigStren.ssSinr;

+            solSigStren->csiRsrp = s_network_urc_solSigStren.csiRsrp;

+            solSigStren->csiRsrq = s_network_urc_solSigStren.csiRsrq;

+            solSigStren->csiSinr = s_network_urc_solSigStren.csiSinr;

+            break;

+        }

+    }

+    return RESULT_OK;   

+}

+

+static pthread_mutex_t urc_signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;

+static pthread_cond_t urc_signal_state_change_cond = PTHREAD_COND_INITIALIZER;

+

+int wait_urc_signal_changes()

+{

+    pthread_mutex_lock(&urc_signal_state_change_mutex);

+    pthread_cond_wait(&urc_signal_state_change_cond,&urc_signal_state_change_mutex);

+    pthread_mutex_unlock(&urc_signal_state_change_mutex);

+    return RESULT_OK;   

+}

+

+void send_urc_signal_changes()

+{

+    pthread_mutex_lock(&urc_signal_state_change_mutex);

+    pthread_cond_signal(&urc_signal_state_change_cond);

+    pthread_mutex_unlock(&urc_signal_state_change_mutex);

+    return;

+}

+

+void urc_msg_process(Parcel *p)

+{ 

+    int resp_type; 

+    int none = 0;

+    int NR_sum = 0;

+    int urc_LTE_signalstrength = 0;

+    int urc_WCDMA_signalstrength = 0;

+

+    p->readInt32(&resp_type);

+    p->readInt32(&s_module_wait_urc_id);

+    p->readInt32(&s_module_urc_slot_id);

+    LYINFLOG("urc id = %d, slot_id = %d",s_module_wait_urc_id,s_module_urc_slot_id);

+    switch(s_module_wait_urc_id)

+    {

+        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:

+        {

+            set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,false);

+            send_urc_signal_changes();

+            break;

+        }

+        case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:

+        {                    

+            set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_DATA_REG,false);

+            send_urc_signal_changes();

+            break;

+        }

+        case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:

+        {                   

+            set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_IMS_REG,false);                                       

+            send_urc_signal_changes();

+            break;

+        }

+        case RIL_UNSOL_SIGNAL_STRENGTH:

+        {

+            p->readInt32(&s_network_urc_solSigStren.rssi);

+            if((s_network_urc_solSigStren.rssi!=99)&&(s_network_urc_solSigStren.rssi!=0))

+            {

+                s_network_urc_solSigStren.gw_sig_valid = 1;

+            }else{

+                s_network_urc_solSigStren.gw_sig_valid = 0;

+            }

+            if(s_network_urc_solSigStren.gw_sig_valid == 1)

+            {

+                LYINFLOG("urc_GSM_signalstrength:%d",s_network_urc_solSigStren.rssi);

+            }

+            p->readInt32(&none);

+            p->readInt32(&none);

+            p->readInt32(&none);

+            p->readInt32(&none);

+            p->readInt32(&none);

+            p->readInt32(&none);

+            p->readInt32(&none);

+            p->readInt32(&urc_LTE_signalstrength);

+            // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);

+            p->readInt32(&s_network_urc_solSigStren.rsrp);

+            p->readInt32(&s_network_urc_solSigStren.rsrq);

+            p->readInt32(&s_network_urc_solSigStren.rssnr);

+            if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))

+            {

+                s_network_urc_solSigStren.lte_sig_valid = 1;

+            }else{

+                s_network_urc_solSigStren.lte_sig_valid = 0;

+            }

+            if(s_network_urc_solSigStren.lte_sig_valid == 1)

+            {

+                LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);

+            }

+            p->readInt32(&none);

+            p->readInt32(&none);

+            p->readInt32(&none);

+            p->readInt32(&none);

+            p->readInt32(&none);

+            p->readInt32(&urc_WCDMA_signalstrength);

+            p->readInt32(&none);

+            p->readInt32(&s_network_urc_solSigStren.rscp);

+            p->readInt32(&s_network_urc_solSigStren.ecno);

+            if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))

+            {

+                s_network_urc_solSigStren.wcdma_sig_valid = 1;

+            }else{

+                s_network_urc_solSigStren.wcdma_sig_valid = 0;

+            }

+            if(s_network_urc_solSigStren.wcdma_sig_valid == 1)

+            {

+                LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);

+            }

+            p->readInt32(&s_network_urc_solSigStren.ssRsrp);

+            p->readInt32(&s_network_urc_solSigStren.ssRsrq);

+            p->readInt32(&s_network_urc_solSigStren.ssSinr);

+            p->readInt32(&s_network_urc_solSigStren.csiRsrp);

+            p->readInt32(&s_network_urc_solSigStren.csiRsrq);

+            p->readInt32(&s_network_urc_solSigStren.csiSinr);

+            NR_sum = (s_network_urc_solSigStren.ssRsrp) + (s_network_urc_solSigStren.ssRsrq) + (s_network_urc_solSigStren.ssSinr) + (s_network_urc_solSigStren.csiRsrp)+\

+            (s_network_urc_solSigStren.csiRsrq) + (s_network_urc_solSigStren.csiSinr);

+            if(NR_sum != 0)

+            {

+                s_network_urc_solSigStren.nr_sig_valid = 1;

+            }else{

+                s_network_urc_solSigStren.nr_sig_valid = 0;

+            }

+            if(s_network_urc_solSigStren.nr_sig_valid == 1)

+            {

+                LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\

+                s_network_urc_solSigStren.ssRsrp,s_network_urc_solSigStren.ssRsrq,s_network_urc_solSigStren.ssSinr, \

+                s_network_urc_solSigStren.csiRsrp,s_network_urc_solSigStren.csiRsrq,s_network_urc_solSigStren.csiSinr);

+            }             

+            send_urc_signal_changes();

+            break;

+        }

+    }

+}

 

 /*Used to wait for an update signal*/

 int lynq_wait_signalchanges(int *handle)

@@ -1904,61 +1232,15 @@
     if(NULL == handle)

     {

         LYERRLOG("illegal input");

-        return -1;

+        return LYNQ_E_PARAMETER_ANONALY;

     }

-    wait_signal_changes();

+    wait_urc_signal_changes();

     LYDBGLOG("get signalchanges");

-    *handle = network_wait_urc_id;

-    return 0;

-}

-/*Used to get urc info*/

-int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id)

-{

-    LYDBGLOG("start get urc info");

-    if(handle != 1002&&handle != 1009)

-    {

-        LYINFLOG("invalid handle!!!");

-        return -1;

-    }

-    if(NULL == solSigStren && NULL == slot_id)

-    {

-        LYINFLOG("incoming solSigStren or slot_id is NULL!!!");

-        return -1;

-    }

-    switch(handle)

-    {

-        case 1002: //RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED

-        {

-            LYDBGLOG("get state update to VOICE");

-            *slot_id = network_urc_slot_id;

-            LYINFLOG("slot_id = %d",network_urc_slot_id);

-            break;

-        }

-        case 1009: //RIL_UNSOL_SIGNAL_STRENGTH

-        {

-            LYDBGLOG("get state update to signal info");

-            solSigStren->gw_sig_valid = network_urc_solSigStren.gw_sig_valid;

-            solSigStren->rssi = network_urc_solSigStren.rssi;

-            solSigStren->wcdma_sig_valid = network_urc_solSigStren.wcdma_sig_valid;

-            solSigStren->rscp = network_urc_solSigStren.rscp;

-            solSigStren->ecno = network_urc_solSigStren.ecno;

-            solSigStren->lte_sig_valid = network_urc_solSigStren.lte_sig_valid;

-            solSigStren->rsrp = network_urc_solSigStren.rsrp;

-            solSigStren->rsrq = network_urc_solSigStren.rsrq;

-            solSigStren->rssnr = network_urc_solSigStren.rssnr;

-            solSigStren->nr_sig_valid = network_urc_solSigStren.nr_sig_valid;

-            solSigStren->ssRsrp = network_urc_solSigStren.ssRsrp;

-            solSigStren->ssRsrq = network_urc_solSigStren.ssRsrq;

-            solSigStren->ssSinr = network_urc_solSigStren.ssSinr;

-            solSigStren->csiRsrp = network_urc_solSigStren.csiRsrp;

-            solSigStren->csiRsrq = network_urc_solSigStren.csiRsrq;

-            solSigStren->csiSinr = network_urc_solSigStren.csiSinr;

-            break;

-        }

-    }

-    return 0;

+    *handle = s_module_wait_urc_id;

+    return RESULT_OK;   

 }

 

+#ifdef MODEM_GEN97

 /**@brief parse at response,return error code,and the response

 * @param response [IN] <response>:original at response,This parameter must be a character array.

 

@@ -1976,7 +1258,7 @@
     if(response == NULL || value == NULL)

     {

         LYERRLOG("parameter invalid");

-        return -1;

+        return LYNQ_E_PARAMETER_ANONALY;

     }

     if(strstr(response,"ERROR"))

     {

@@ -2064,158 +1346,123 @@
                 memcpy(value,temp_buf,strlen(temp_buf));

             }

         }

-        return 0;

+        return RESULT_OK;   

     }

     else

     {

         LYINFLOG("%s this response invalid\n",response);

-        return -1;

+        return LYNQ_E_INNER_ERROR;

     }

 }

-#ifdef MODEM_GEN97

 

 int lynq_oos_recover_timer_interval(int mode, char interval[LY_RECOVER_TIMER_INTERVAL],char result[LY_RECOVER_TIMER_INTERVAL])

 {

-    int ret=-1; 

-    

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+

     if((mode < 0) || (mode >1) || (mode == 0 && NULL == interval) || (NULL == result))

     {

         LYERRLOG("%s mode %d interval %s result %s error",__func__,mode,interval,result);  

-        return -1;

+        return LYNQ_E_PARAMETER_ANONALY;

     }

 

-    lynq_resp_t head; 

     Parcel* p=NULL;

+    int ret;

 

     if(mode == 0)

     {

-        ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"AT+ERSCFG=%s",interval);

+        ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ERSCFG=%s",interval);

     }

     else 

     {

-        ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"AT+ERSCFG?");

+        ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ERSCFG?");

     }

 

-    if(ret==0)

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-     

-        int recv_len;    

-        char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};

-        char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }        

 

+    int recv_len;    

+    char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};

+    char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};

 

-        LYINFLOG("get recover timer interval");

-        p->readInt32(&recv_len);

-        if(recv_len == -1)

-        {

-            LYINFLOG("no responset");

-            delete p;

-            return -1;

-        }

-        else

-        {

-            LYINFLOG("recv_len:%d",recv_len);

-            p->read(response_interval,recv_len);

-        }

-        LYINFLOG("response_interval:%s",response_interval);

-        ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);

-        if(mode == 1)

-        {

-            if(strlen(res_data) <= LY_RECOVER_TIMER_INTERVAL)

-            {

-                memcpy(result,res_data,strlen(res_data));

-            }

-        }

-        LYERRLOG("%s ret:%d",__func__,ret);

+    LYINFLOG("get recover timer interval");

+    p->readInt32(&recv_len);

+    if(recv_len == -1)

+    {

+        LYINFLOG("no responset");

         delete p;

-        return ret;         

+        return LYNQ_E_INNER_ERROR;

     }

-

-    LYERRLOG("%s send request error %d",__func__,ret);  

-

-    return ret;

+    else

+    {

+        LYINFLOG("recv_len:%d",recv_len);

+        p->read(response_interval,recv_len);

+    }

+    LYINFLOG("response_interval:%s",response_interval);

+    ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);

+    if(mode == 1)

+    {

+        if(strlen(res_data) <= LY_RECOVER_TIMER_INTERVAL)

+        {

+            memcpy(result,res_data,strlen(res_data));

+        }

+    }

+    LYERRLOG("%s ret:%d",__func__,ret);

+    delete p;

+    return ret;         

 }

 

 int lynq_oos_deep_sleep_recover_timer_interval(int recovery_threshold,int fullband_timer,int sniffer_timer,int inactive_mode)

 {

-    int ret=-1;

-

-    if(((recovery_threshold < 2) || (recovery_threshold > 10)) || ((fullband_timer < 90) || (fullband_timer > 360)) || 

+    if(g_module_init_flag != MODULE_RUNNING)

+    {

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

+        return LYNQ_E_CONFLICT;

+    }

+     if(((recovery_threshold < 2) || (recovery_threshold > 10)) || ((fullband_timer < 90) || (fullband_timer > 360)) || 

     ((sniffer_timer < 10) || (sniffer_timer > 60)) || ((inactive_mode < 0) || (inactive_mode > 1)))

     {

-        LYERRLOG("%s paramter recovery_threshold %d fullband_timer %d sniffer_timer %d inactive_mode %d fail!",__func__,recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);

-        return ret;

+        LYERRLOG("%s paramter recovery_threshold %d fullband_timer %d sniffer_timer %d inactive_mode %d error!",__func__,recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);

+        return LYNQ_E_PARAMETER_ANONALY;

     }

 

-    lynq_resp_t head; 

     Parcel* p=NULL;

+    int ret=lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"AT+ESRVREC=%d,%d,%d,%d",recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);

 

-    ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"AT+ESRVREC=%d,%d,%d,%d",recovery_threshold,fullband_timer,sniffer_timer,inactive_mode);

-    if(ret==0)

+    if(ret!=RESULT_OK)

     {

-        if(p==NULL)

-        {

-            LYERRLOG("%s get p error",__func__);

-            return -1;

-        }

-        ret=GetHeader(p,head);

-        if(ret!=0)

-        {

-            LYERRLOG("%s get head error",__func__,ret);

-            delete p;

-            return -1;

-        }

-        if(head.error!=0)

-        {

-            LYERRLOG("%s mdm return head error %d",__func__,head.error);

-            delete p;

-            return head.error;

-        }

-

-        int recv_len;   

-        char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};

-        char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};

-     

-        p->readInt32(&recv_len);

-        if(recv_len == -1)

-        {

-            LYINFLOG("no responset");

-            delete p;

-            return -1;

-        }

-        else

-        {

-            LYINFLOG("recv_len:%d",recv_len);

-            p->read(response_interval,recv_len);

-        }

-        LYINFLOG("response_interval:%s",response_interval);

-        ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);

-        LYERRLOG("%s ret:%d",__func__,ret);

+        LYERRLOG("%s call lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }        

+ 

+    int recv_len;   

+    char res_data[LY_RECOVER_TIMER_INTERVAL] = {0};

+    char response_interval[LY_RECOVER_TIMER_INTERVAL*2] = {0};

+ 

+    p->readInt32(&recv_len);

+    if(recv_len == -1)

+    {

+        LYINFLOG("no responset");

         delete p;

-        return ret;      

+        return LYNQ_E_INNER_ERROR;

     }

-

-    LYERRLOG("%s send request error %d",__func__,ret);  

-

-    return ret;

+    else

+    {

+        LYINFLOG("recv_len:%d",recv_len);

+        p->read(response_interval,recv_len);

+    }

+    LYINFLOG("response_interval:%s",response_interval);

+    ret = parse_at_result(response_interval,res_data,LY_RECOVER_TIMER_INTERVAL);

+    LYERRLOG("%s ret:%d",__func__,ret);

+    delete p;

+    return ret;      

+ 

 }

 #endif