T108:解决Bug85748/Bug85747/Bug85784/Bug85787/Bug85794/Bug85100

Change-Id: Ie6db4410a018eab847e98e63b787b0ce7c880abf
diff --git a/mbtk/liblynq_lib/src/lynq_data_call.c b/mbtk/liblynq_lib/src/lynq_data_call.c
index 9e42d85..8b4d78a 100755
--- a/mbtk/liblynq_lib/src/lynq_data_call.c
+++ b/mbtk/liblynq_lib/src/lynq_data_call.c
@@ -40,6 +40,7 @@
 static qser_data_call_evt_cb_t qser_net_status_cb = NULL;
 static qser_apn_info_s qser_apn_info[QSER_APN_NUM] = {0};
 static bool qser_apn_info_state[QSER_APN_NUM] = {0};
+static bool qser_idx_pdp_state[QSER_APN_NUM];
 static char qser_apn_add_save_state[QSER_APN_NUM + 1] = {0};
 static char qser_apn_auth_state[QSER_APN_NUM + 1] = {0};
 #if defined(MBTK_ALL_CID_SUPPORT)
@@ -285,7 +286,58 @@
 /*Check parameter*/
 int qser_check_apn_name_type(qser_apn_info_s *apn)
 {
-    int pdp_type_tmp = 0;
+    if(apn == NULL)
+    {
+        LOGE("[qser_data_call] qser_check_apn_type apn is NULL!");
+        return QSER_RESULT_FAIL;
+    }
+
+    //check default idx = 0
+    int apn_name_length = strlen(apn->apn_name);
+    //LOGE("[qser_data_call] qser_apn_info[0].apn_name: %s!", qser_apn_info[0].apn_name);
+    char *p = strchr(qser_apn_info[0].apn_name, '.');
+    if(p == NULL)
+    {
+        LOGE("[qser_data_call] qser_check_apn_type not find!");
+        //return QSER_RESULT_FAIL;
+    }
+    else
+    {
+        int default_apn_name_length = p - (qser_apn_info[0].apn_name);
+        //LOGE("[qser_data_call] qser_check_apn_type default_apn_name_length = [%d]!", default_apn_name_length);
+        if(default_apn_name_length == apn_name_length)
+        {
+            int i = 0;
+            while(i < default_apn_name_length)
+            {
+                if(isalpha(qser_apn_info[0].apn_name[i]) && isalpha(apn->apn_name[i]))
+                {
+                    if(tolower(qser_apn_info[0].apn_name[i]) != tolower(apn->apn_name[i]))
+                    {
+                        break;
+                    }
+                }
+                else
+                {
+                    //LOGE("[qser_data_call] not char!");
+                    if(qser_apn_info[0].apn_name[i] != apn->apn_name[i])
+                    {
+                        break;
+                    }
+                }
+                
+                i++;
+            }
+
+            if(i == default_apn_name_length)
+            {
+                LOGE("[qser_data_call] apn_name is same!idx = [0]");
+                return QSER_RESULT_FAIL;
+            }
+        }
+    }
+    //check 1 -6
+    int pdp_type_tmp = 1;
     for (;pdp_type_tmp < QSER_APN_NUM; pdp_type_tmp++)
     {
         if(pdp_type_tmp == apn->profile_idx)
@@ -294,11 +346,25 @@
         }
         if( (qser_apn_add_save_state[pdp_type_tmp] == '1') || (qser_apn_add_save_state[pdp_type_tmp] == '2') )
         {
-            if (strcmp(qser_apn_info[pdp_type_tmp].apn_name, apn->apn_name) == 0 || strcmp(qser_apn_info[pdp_type_tmp].apn_type, apn->apn_type) == 0)
+            if(strcmp(qser_apn_info[pdp_type_tmp].apn_type, apn->apn_type) == 0)
             {
-                LOGE("[qser_data_call] qser_check_apn_name_type error!");
+                LOGE("[qser_data_call] apn_type is same!idx = [%d]", pdp_type_tmp);
                 return QSER_RESULT_FAIL;
             }
+            if (strcmp(qser_apn_info[pdp_type_tmp].apn_name, apn->apn_name) == 0)
+            {
+                if(qser_apn_info[pdp_type_tmp].pdp_type == QSER_APN_PDP_TYPE_IPV4V6)
+                {
+                    LOGE("[qser_data_call] apn_name is same and pdp_type is IPV4V6!idx = [%d]", pdp_type_tmp);
+                    return QSER_RESULT_FAIL;
+                }
+
+                if(qser_apn_info[pdp_type_tmp].pdp_type == apn->pdp_type)
+                {
+                    LOGE("[qser_data_call] pdp_type is same and pdp_type is same!idx = [%d]", pdp_type_tmp);
+                    return QSER_RESULT_FAIL;
+                }
+            }
         }
     }
 
@@ -348,6 +414,7 @@
             {
                 qser_default_pdp_idx = -1;
             }
+            qser_idx_pdp_state[idx] = false;
 
             if(qser_net_status_cb != NULL)
             {
@@ -481,7 +548,13 @@
             {
                 if(qser_apn_add_save_state[apns[i].cid - 1] == '0')
                 {
-                    LOGE("[qser_data_call] idx no open.");
+                    //LOGE("[qser_data_call] idx no open.");
+#if defined(MBTK_ALL_CID_SUPPORT)
+                    if(apns[i].cid - 1 == 0)
+                    {
+                        qser_apn_info_param_convert(apns[i].cid - 1, &qser_apn_info[apns[i].cid - 1], &apns[i]);
+                    }
+#endif
                     continue;
                 }
 
@@ -506,6 +579,12 @@
             }
         }
     }
+
+    int idx = 0;
+    for(;idx < QSER_APN_NUM; idx++)
+    {
+        qser_idx_pdp_state[idx] = false;
+    }
     LOGE("[qser_data_call] mbtk_info_handle_get() success.");
     return QSER_RESULT_SUCCESS;
 }
@@ -623,6 +702,7 @@
     }
         
 #endif
+    qser_idx_pdp_state[data_call->profile_idx] = true;
 
     return QSER_RESULT_SUCCESS;
 }
@@ -756,6 +836,7 @@
         qser_default_pdp_idx = -1;
     }
 #endif
+    qser_idx_pdp_state[profile_idx] = false;
 
     return QSER_RESULT_SUCCESS;
 }
@@ -1176,6 +1257,12 @@
         LOGE("[qser_data_call] handle is NULL.");
         return QSER_RESULT_FAIL;
     }
+    
+    if(qser_idx_pdp_state[profile_idx] == true)
+    {
+        LOGE("[qser_data_call] profile_idx[%d] open pdp.", profile_idx);
+        return QSER_RESULT_FAIL;
+    }
 
     if(qser_check_profile_idx(profile_idx) < 0)
     {
@@ -1241,7 +1328,7 @@
                         continue;
                     }
                 }
-                if(qser_apn_info_param_convert(apns[i].cid - 1, &apn_list->apn[i], &apns[i]) != 0)
+                if(qser_apn_info_param_convert(apns[i].cid - 1, &apn_list->apn[apn_list->cnt], &apns[i]) != 0)
                 {
                     LOGE("[qser_data_call] qser_apn_info_param_convert fail");
                     return QSER_RESULT_FAIL;