[Feature][T8TSK-81]Merged and upload MR3.0 New Modify content,merged meta-sdk,modem
Change-Id: Idb6c80fcf349c0db72e7ca3fa5b1fd7944ec1290
diff --git a/src/lynq/lib/liblynq-call/lynq_call.cpp b/src/lynq/lib/liblynq-call/lynq_call.cpp
index 0270aa1..d1e2293 100755
--- a/src/lynq/lib/liblynq-call/lynq_call.cpp
+++ b/src/lynq/lib/liblynq-call/lynq_call.cpp
@@ -74,9 +74,9 @@
 static int s_module_isDial = 0;
 static pthread_mutex_t call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t call_state_change_cond = PTHREAD_COND_INITIALIZER;
-static int s_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 int s_CallId = 0;
+static pthread_mutex_t s_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t s_call_state_change_cond = PTHREAD_COND_INITIALIZER;
 
 static int s_module_call_state =CALL_OFF;
 static int s_call_auto_answer = 0;
@@ -299,6 +299,8 @@
     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++)
@@ -329,15 +331,15 @@
     callList->direction = direction;   
     return;
 }
-int waitIncomingCall()
+
+void wait_call_state()
 {
-    LYINFLOG("wait incming call");
-    int ret = 0;
-    pthread_mutex_lock(&s_incoming_call_mutex);
-    ret = pthread_cond_wait(&s_incoming_call_cond,&s_incoming_call_mutex);
-    pthread_mutex_unlock(&s_incoming_call_mutex);
-    return ret;
+    LYINFLOG("call state changed");
+    pthread_mutex_lock(&s_call_state_change_mutex);
+    pthread_cond_wait(&s_call_state_change_cond,&s_call_state_change_mutex);
+    pthread_mutex_unlock(&s_call_state_change_mutex);
 }
+
 int checkHasCall(char addr[])
 {
     for(int i = 0;i<LYNQ_CALL_MAX;i++)
@@ -384,18 +386,25 @@
     pthread_cond_signal(&call_state_change_cond);
     pthread_mutex_unlock(&call_state_change_mutex);
 }
-void sendSignalIncomingCall()
+void send_call_state_change()
 {
-    LYINFLOG("send incoming call signal");
-    pthread_mutex_lock(&s_incoming_call_mutex);
-    pthread_cond_signal(&s_incoming_call_cond);
-    pthread_mutex_unlock(&s_incoming_call_mutex);
+    LYINFLOG("send call state change");
+    pthread_mutex_lock(&s_call_state_change_mutex);
+    pthread_cond_signal(&s_call_state_change_cond);
+    pthread_mutex_unlock(&s_call_state_change_mutex);
 }
 
 void cleanup_call_list_mutex(void *arg)
 {
     pthread_mutex_unlock(&s_notice_get_call_list_mutex);
 }
+
+void update_end_state(int lynq_call_id)
+{
+    LYINFLOG("update_end_state 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_state = (int)LYNQ_CALL_END;
+}
+
 void *triggerGetCallList(void *parg)
 {
     int ret=0;
@@ -447,8 +456,11 @@
                 }
                 if(call_end == 0)
                 {
-                    LYINFLOG("MT hungup,then clean call info local idx is %d id is %d",i, s_call_lists[i].call_id);
-                    cleanCallList(i);                   
+                    LYINFLOG("MT/MO hungup,then clean call info local idx is %d id is %d",i, s_call_lists[i].call_id);
+                    //update_end_state(i);//lei modify for:update end state for this call
+                    cleanCallList(i);
+                    send_call_state_change();//means mt/mo call is end
+                    //cleanCallList(i);
                 }
             } //fix bug API-54
             else 
@@ -494,8 +506,8 @@
                 {
                     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();
+                    s_CallId = call_list[i].call_id;
+                    send_call_state_change();
                 }
                 else if(s_call_lists[n].call_state == call_list[i].call_state)
                 {
@@ -507,15 +519,16 @@
                         **fix bug API-54
                         */
                         LYINFLOG("resend incoming call signal");
-                        sendSignalIncomingCall();
+                        send_call_state_change();
                     }
                 }
                 else 
                 {
                     LYINFLOG("state changed from %d to %d",s_call_lists[n].call_state,call_list[i].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);
-                }                               
+                    updateCallList(&s_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);//update mt call
+                    send_call_state_change();
+                }                            
             }
             else
             {     
@@ -527,17 +540,18 @@
                     {
                         if(s_call_lists[n].call_id==0)
                         {
-                             LYINFLOG("add a call id");
-                             update=1;
+                            LYINFLOG("add a call id");
+                            update=1;//for send sigal
+                            s_CallId = call_list[i].call_id;
                         }
                         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;
+                        send_call_state_change();//means mo call is success
                         break;
                     }                    
                 }
-
-                if(call_end == 0)
+                if(call_end == 0)//1.there is no space to use 2.can't find addr in buffer 3.call_id not equal   eg:when call is error return 8004/handle <= 0 will into this
                 {  
                     LYINFLOG("need to hangup id %d", call_list[i].call_id);
 #ifdef ECALL_SUPPORT
@@ -550,6 +564,7 @@
                     LYINFLOG("hang up service call id %d",call_list[i].call_id); 
                     lynq_call_hungup(&(call_list[i].call_id));
                 }
+
             }
             LYDBGLOG("servie idx %d end",i);
         }
@@ -751,7 +766,7 @@
 
     g_module_Global_uToken = utoken; 
 
-    int ret = lynq_urc_socket_start();
+    int ret = lynq_start_all_urc_socket_thread();
     if(ret != RESULT_OK)
     {
         LYERRLOG("init socket urc fail!!!");
@@ -759,11 +774,11 @@
         return LYNQ_E_INNER_ERROR;
     }
 
-    ret = lynq_server_socket_start();
+    ret = lynq_start_all_rc_socket_thread();
     if(ret !=RESULT_OK)
     {
         LYERRLOG("init socket client fail!!!");
-        lynq_close_urc_thread();
+        lynq_close_all_urc_socket_thread();
         g_module_init_flag = MODULE_CLOSED;
         return LYNQ_E_INNER_ERROR;
     }
@@ -773,8 +788,8 @@
     if(ret != RESULT_OK)
     {
         LYERRLOG("lynq_start_call_list_loop fail!!!");
-        lynq_close_urc_thread();
-        lynq_close_rc_thread();
+        lynq_close_all_urc_socket_thread();
+        lynq_close_all_rc_socket_thread();
         g_module_init_flag = MODULE_CLOSED;
         return LYNQ_E_INNER_ERROR;
     }      
@@ -795,8 +810,8 @@
     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_close_all_urc_socket_thread();
+    lynq_close_all_rc_socket_thread();    
     lynq_stop_call_list_loop();
     g_module_init_flag = MODULE_CLOSED;
     return 0;
@@ -891,6 +906,7 @@
     return s_module_isDial;
 }
 
+
 int lynq_call(int* handle,char addr[])
 {
     if(g_module_init_flag != MODULE_RUNNING)
@@ -921,25 +937,23 @@
         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);       
+        cleanCallList(lynq_call_id);  
         return ret;      
-    }
-    
-    delete p;        
- 
+    }       
+    delete p;
     s_module_isDial = 1;
     if(waitCallstateChange(6000)==ETIMEDOUT)//6000ms
     {
         //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);            
+        cleanCallList(lynq_call_id);
+        send_call_state_change();
         return LYNQ_E_TIME_OUT;
     }
     s_module_isDial = 0;
@@ -952,10 +966,12 @@
     else 
     {   
         LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);
-        cleanCallList(lynq_call_id);      
+        cleanCallList(lynq_call_id);
+        send_call_state_change();
         return LYNQ_E_INVALID_ID_ANONALY;
-    }                 
+    }        
 }
+
 int lynq_call_answer()
 {
     if(g_module_init_flag != MODULE_RUNNING)
@@ -972,6 +988,7 @@
     }        
     return ret;
 }
+
 int lynq_call_hungup(int* handle)
 {
     if(g_module_init_flag != MODULE_RUNNING)
@@ -1018,17 +1035,18 @@
     }        
     return ret;   
 }
-int lynq_wait_incoming_call(int *handle)
+
+int lynq_wait_call_state_change(int *handle)
 {
     if(g_module_init_flag != MODULE_RUNNING)
     {
         LYERRLOG("%s module state %d error",__func__,g_module_init_flag);
         return LYNQ_E_CONFLICT;
     }
-    waitIncomingCall();
-    *handle = s_IncomingCallId;
-    LYINFLOG("lynq incoming call id:%d",s_IncomingCallId);
-    return RESULT_OK;   
+    wait_call_state();
+    *handle = s_CallId;
+    LYINFLOG("lynq mo/mt call id:%d",s_CallId);
+    return RESULT_OK;
 }
 
 int lynq_set_auto_answercall(const int mode)
@@ -1042,6 +1060,19 @@
     LYINFLOG("auto answer call mode =%d",mode);
     return RESULT_OK;   
 }
+
+int lynq_find_already_end()
+{
+    for(int i=0;i < LYNQ_CALL_MAX; i++)
+    {
+        if(s_call_lists[i].call_state == 6)
+        {
+            return 0;
+        }
+    }
+    return INVALID_ID;
+}
+
 int lynq_get_current_call_state(int *handle,    int *call_state,int *toa,int *direction,char addr[])
 {
     if(g_module_init_flag != MODULE_RUNNING)
@@ -1056,16 +1087,26 @@
         LYERRLOG("handle is NULL");
         return LYNQ_E_PARAMETER_ANONALY;
     }
+    LYINFLOG("lynq_get_current_call_state %d\n ", *handle);
     lynq_call_id = find_call_id_with_call_id(*handle);
     if(lynq_call_id==INVALID_ID)
     {
-        return LYNQ_E_INVALID_ID_ANONALY;
+        //find end state
+        if((*handle) >= 0)
+        {
+            *call_state = (int)LYNQ_CALL_END;
+            return RESULT_OK; 
+        }
+        else
+        {
+            return LYNQ_E_INVALID_ID_ANONALY;
+        }
     }
     *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;   
+    return RESULT_OK;
 }
 
 int lynq_get_current_call_number()
@@ -1389,16 +1430,36 @@
 }
 /*audio end*/
 
+
+
+bool is_support_urc(int urc_id)
+{
+    switch(urc_id)
+    {
+        case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
+        case RIL_UNSOL_CALL_RING:
+        case RIL_UNSOL_RINGBACK_TONE:
+        case RIL_UNSOL_CALL_INFO_INDICATION:
+#ifdef ECALL_SUPPORT
+        case RIL_UNSOL_ECALL_INDICATIONS://9502        
+#endif
+            return true;                
+        default:
+            return false;
+    }    
+}
+
 void urc_msg_process(Parcel *p)
 { 
     int resp_type;
     int urcid;
     int slot_id;
-    
+
+    int size=p->dataSize();
     p->readInt32(&resp_type);
     p->readInt32(&urcid);
     p->readInt32(&slot_id);
-    LYINFLOG("urc id = %d, slot_id = %d",urcid,slot_id);
+    LYINFLOG("%s urc id = %d, slot_id = %d, size is %d, msg is %s",__func__, urcid,slot_id,size,requestToString(urcid));
     switch (urcid)
     {
         case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED://1001