[API-1054][T8TSK-214][DATA]after flash with ā€œ-sā€, the first data call fail, and cannot recover

Change-Id: Ie2ced17f361d59c3d71c69f7b0cff0b3ac7fbfd7
diff --git a/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h b/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
index a54a7b4..d56e0d5 100755
--- a/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
+++ b/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
@@ -55,6 +55,12 @@
     char apn[LYNQ_APN_MAX_LEN];
     char apnType[LYNQ_APN_TYPE_MAX_LEN];
 }lynq_apn_info;
+typedef struct
+{
+    int handle;
+    char apn[LYNQ_APN_MAX_LEN];
+    char apnType[LYNQ_APN_TYPE_MAX_LEN];
+}lynq_apn_msg_t;
 
 int lynq_init_data(int uToken);
 int lynq_deinit_data();
@@ -67,6 +73,8 @@
 int lynq_modify_apn_db(const int cmd,char *id,char *mcc,char *mnc,char *apn,char *apntype,char *user,char *password,char *normalprotocol,char *roamingprotocol,char *carrier,char *out);
 int lynq_reset_apn(char *result);
 int lynq_get_apn_table(int *size,lynq_apn_info **list);
+int lynq_get_apn_msg(int handle,lynq_apn_msg_t *apn_msg);
+
 
 #ifdef __cplusplus
 }
diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index 96882e4..4a629cd 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -25,6 +25,8 @@
 #define USER_LOG_TAG "LYNQ_DATA"
 
 #define LYNQ_DATA_UCI_BUF 258
+#define LYNQ_DATA_TIME_OUT 1000*180
+
 
 #define LYNQ_ADDRESS "127.0.0.1"
 
@@ -227,14 +229,15 @@
 
 int handleCheck(int handle)
 {
-    if (lynq_apn_table[handle].hasUsed == 1)
+    if ((handle >= 0) && (handle  <= 6))
     {
-        return 0;
-    }
-    else 
-    {
+        if (lynq_apn_table[handle].hasUsed == 1)
+        {
+            return 0;
+        }
         return -1;
     }
+    return -1;
 }
 int waitApnResult()
 {
@@ -769,7 +772,7 @@
     if(error==0)
     {
         data_timelimit = 1;
-        if (waitDataCallstateChange(60000) == ETIMEDOUT) // 60s
+        if (waitDataCallstateChange(LYNQ_DATA_TIME_OUT) == ETIMEDOUT)
         {
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
@@ -944,7 +947,7 @@
     if(error==0)
     {
         data_timelimit = 1;
-        if(waitDataCallstateChange(60000)==ETIMEDOUT)//60s
+        if(waitDataCallstateChange(LYNQ_DATA_TIME_OUT)==ETIMEDOUT)
         {
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
@@ -1097,6 +1100,27 @@
     }
     return error;
 }
+
+int lynq_get_apn_msg(int handle,lynq_apn_msg_t *apn_msg)
+{
+    LYINFLOG("[lynq_get_apn_msg] enter,handle:%d",handle);
+    if((handle < 0) || (handle > 6) || (NULL == apn_msg))
+    {
+        LYERRLOG("handle value error,or apn_msg is null");
+        return LYNQ_E_NULL_ANONALY;
+    }
+    apn_msg->handle = handle;
+    if(apn_msg->apn!=NULL)
+    {
+        memcpy(apn_msg->apn,lynq_apn_table[handle].apn,LYNQ_APN_MAX_LEN);
+    }
+    if(apn_msg->apnType!=NULL)
+    {
+        memcpy(apn_msg->apnType,lynq_apn_table[handle].apnType,LYNQ_APN_TYPE_MAX_LEN);
+    }
+    return 0;
+}
+
 int lynq_get_data_call_list(int *handle,lynq_data_call_response_v11_t *dataCallList)
 {
     lynq_data_call_response_v11_t interDataCallList[LYNQ_APN_CHANNEL_MAX]={};
@@ -1104,16 +1128,17 @@
     int lynq_data_call_id = 0;
     int error = 0;
     lynq_data_call_id = *handle;
-    if(handle==NULL)
+    if((handle==NULL) || (dataCallList==NULL))
     {
-        LYERRLOG("handle is NULL");
+        LYERRLOG("[lynq_get_data_call_list] handle or datacalllist is NULL");
         return LYNQ_E_NULL_ANONALY;
     }
-    if (*handle<0 && handle>8)
+    if ((*handle < 0) || (*handle > 6))
     {
-        LYERRLOG("handle value error");
+        LYERRLOG("[lynq_get_data_call_list] handle value error");
+        return LYNQ_E_NULL_ANONALY;
     }
-    LYINFLOG("incoming handle value: %d",*handle);
+    LYINFLOG("[lynq_get_data_call_list] incoming handle value: %d",*handle);
     memset(interDataCallList,0,sizeof(interDataCallList));
     error = getDataCallLists(interDataCallList,&number);
     if(error == 0)
@@ -1443,7 +1468,58 @@
     s16 = p.readString16Inplace(&stringlen);
     return strndup16to8(s16, stringlen);
 }
-
+int get_imsi()
+{
+    Parcel p;
+    lynq_client_t client;
+    int resp_type = -1;
+    int token;
+    int request = -1;
+    int slot_id = -1;
+    int error = -1;
+    int version =0;
+    int num = 0;
+    char *temp_char = NULL;
+    char mccmnc[32] = {0};
+    char mccmnckey[64] = {0};
+    client.uToken = Global_uToken;
+    client.request = 11;//RIL_REQUEST_GET_IMSI 11
+    client.paramLen = 0;
+    bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
+    LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
+    pthread_mutex_lock(&g_lynq_data_sendto_mutex);
+    if(send_request(lynq_client_sockfd,&client)==-1)
+    {
+        LYERRLOG("send request fail");
+        perror("[LYNQ_DATA] send request fail:");
+        return -1;
+    }
+    get_response(lynq_client_sockfd,p);
+    pthread_mutex_unlock(&g_lynq_data_sendto_mutex);
+    if(p.dataAvail() > 0)
+    {
+        p.readInt32(&resp_type);
+        p.readInt32(&token);
+        p.readInt32(&request);
+        p.readInt32(&slot_id);
+        p.readInt32(&error);
+        LYINFLOG("resp_type=%d,uToken=%d,request=%d,slot_id=%d,error_code=%d",resp_type,token,request,slot_id,error);
+        if(!error)
+        {
+            char * test = lynqStrdupReadString(p);
+            memcpy(mccmnc, test,5);
+            mccmnc[5]='\0';
+            free(test);
+            sprintf(mccmnckey,"uci set radio_property.property.vendor_ril_data_gsm_mcc_mnc0=%s",mccmnc);
+            system(mccmnckey);
+        }
+        return error;
+    }
+    else
+    {
+        return -1;
+    }
+}
 int lynq_modify_apn_db(const int cmd, char *id, char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier, char *out)
 {
     if (NULL == id && NULL == mcc && NULL == mnc && NULL == apn && NULL == apntype && NULL == user && NULL == password && NULL == normalprotocol && NULL == roamingprotocol && NULL == carrier)
@@ -1453,7 +1529,19 @@
     }
     lynq_client_t client;
     char argc[512];
-    int res = 0;
+    int res = -1;
+    int count = 0;
+    while(count < 10)
+    {
+        res =  get_imsi();
+        if(res==0)
+        {
+            break;
+        }
+        sleep(1);
+        count++;
+    }
+    LYINFLOG("[%s] count is %d",__FUNCTION__,count);
     Parcel p;
     if (cmd == 0) // insert apn db
     {
@@ -1503,6 +1591,8 @@
     }
     LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
     pthread_mutex_lock(&g_lynq_data_sendto_mutex);
+    LYINFLOG("[%s] wait 4s",__FUNCTION__);
+    sleep(4);
     if(send_request(lynq_client_sockfd,&client)==-1)
     {
         LYERRLOG("send request fail");
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
index f7e89b1..137292e 100755
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
@@ -327,12 +327,18 @@
         RpApnController *apnController = (RpApnController *)findController(i,
                                     RFX_OBJ_CLASS_INFO(RpApnController));
 
-
+        char mccmncvalue[32]={0};
+        String8 mccMncKey("");
+        mccMncKey.append("vendor.ril.data.gsm_mcc_mnc");
+        mccMncKey.append(String8::format("%d", m_slot_id));
+        property_get(mccMncKey, mccmncvalue,"");
+        getStatusManager()->setString8Value(RFX_STATUS_KEY_GSM_OPERATOR_NUMERIC, String8(mccmncvalue));
+        logD(RFX_LOG_TAG, "[reloadApnDB]mccmnc: %s",mccmncvalue);
         mccmnc = getStatusManager(i)->getString8Value(RFX_STATUS_KEY_GSM_OPERATOR_NUMERIC, String8(""));
         if (!mccmnc.isEmpty()) {
             logD(RFX_LOG_TAG, "[reloadApnDB]start: %d, dataController->getApnReady() =%d", i, dataController->getApnReady());
             int count = 0;
-            while((false  == dataController->getApnReady()) && (count <20))
+            while((false  == dataController->getApnReady()) && (count <100))
             {
                 usleep(50);
                 count ++;
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.h b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.h
old mode 100644
new mode 100755