[Feature][T8TSK-97][AT]at+leapnmod(modify apn info)

Change-Id: Icd40907bc3b21e6b27c5260de0badf45d1e0952f
diff --git a/framework/lynq-ril-service/src/common.cpp b/framework/lynq-ril-service/src/common.cpp
index 2f61845..bf45112 100755
--- a/framework/lynq-ril-service/src/common.cpp
+++ b/framework/lynq-ril-service/src/common.cpp
@@ -194,6 +194,26 @@
 
 static int regCodeToRadioTechnology(int request, int code, int slot);
 
+void lynq_output_info(const char* format,...)
+{
+    if(ttyGS3_fd < 0)
+    {
+        return;
+    }
+    char buf[1024] = {0};
+    int n;
+    va_list args;
+    va_start(args, format);
+    vsnprintf(buf, sizeof(buf), format, args);
+    va_end(args);
+    n=write(ttyGS3_fd, buf, strlen(buf));
+    if(n < 0)
+    {
+        perror("lynq resp write:");
+    }
+    return;
+}
+
 void update_call_state(void *response, size_t responselen, int slot) {
     int num = responselen / sizeof(RIL_Call *);
     if(num == 0) {
diff --git a/framework/lynq-ril-service/src/common.h b/framework/lynq-ril-service/src/common.h
index b7623c6..aa9d89c 100755
--- a/framework/lynq-ril-service/src/common.h
+++ b/framework/lynq-ril-service/src/common.h
@@ -163,6 +163,14 @@
     int request;
 } COMMAND;
 
+/**
+ * @brief lei add for output imformation on elt(at port)
+ * 
+ * @param format 
+ * @param ... 
+ */
+void lynq_output_info(const char* format,...);
+
 void updateCardStatusV6(RIL_CardStatus_v6 *card_status,int slot);
 char* getAid(int slot);
 
diff --git a/framework/lynq-ril-service/src/data/data_gdbus.cpp b/framework/lynq-ril-service/src/data/data_gdbus.cpp
index 7d1f582..151e2ef 100755
--- a/framework/lynq-ril-service/src/data/data_gdbus.cpp
+++ b/framework/lynq-ril-service/src/data/data_gdbus.cpp
@@ -428,6 +428,9 @@
     RLOGD("modifyApnDB_method_cb reason %s", ((reason == NULL)? "":reason));
     printf("modify apn db success, return message: %s\n", ((reason == NULL)? "":reason));
     //printf("modifyApnDB_method_cb reason %s\n", ((reason == NULL)? "":reason));
+    /*lei add for at+lmdapn*/
+    lynq_output_info("+LEAPNMOD:%s\n", ((reason == NULL)? "":reason));
+    /*lei add for at+lmdapn*/
     g_variant_unref(result);
     lynq_data_modify_apn(reason,LYNQ_URC_MODIFY_APNDB);
 }
diff --git a/framework/lynq-ril-service/src/lynq_at_transfer_table.h b/framework/lynq-ril-service/src/lynq_at_transfer_table.h
index d616973..46b73fc 100755
--- a/framework/lynq-ril-service/src/lynq_at_transfer_table.h
+++ b/framework/lynq-ril-service/src/lynq_at_transfer_table.h
@@ -18,4 +18,5 @@
 {LYNQ_REQUEST_INSIDE_VERSION,"CGIR",7},

 {LYNQ_REQUEST_FACTORY,"CGSN",7},

 {LYNQ_REQUEST_TEMP,"LYNQMTSM",1},

+{LYNQ_REQUEST_APN,"LEAPNMOD",7},

 {-1,NULL,0},
\ No newline at end of file
diff --git a/framework/lynq-ril-service/src/lynq_commands.h b/framework/lynq-ril-service/src/lynq_commands.h
index 9481977..d1dfd31 100755
--- a/framework/lynq-ril-service/src/lynq_commands.h
+++ b/framework/lynq-ril-service/src/lynq_commands.h
@@ -18,4 +18,5 @@
 /*lei modify :Low power consumption for factory test only*/
 {LYNQ_PLAT_LGMDS,"LYNQ_PLAT_LGMDS","LGMDS",NULL,getMDstate},
 {LYNQ_REQUEST_INSIDE_VERSION,"LYNQ_PLAT_LGMDS","CGIR",NULL,lynq_get_inside_version},
+{LYNQ_REQUEST_APN,"RIL_REQUEST_MODIFY_APN","LEAPNMOD",lynq_modify_apn_info,NULL},
 {-1,NULL,NULL,NULL,NULL},
diff --git a/framework/lynq-ril-service/src/lynq_common.cpp b/framework/lynq-ril-service/src/lynq_common.cpp
index ca5bfe9..bd14e4f 100755
--- a/framework/lynq-ril-service/src/lynq_common.cpp
+++ b/framework/lynq-ril-service/src/lynq_common.cpp
@@ -83,8 +83,10 @@
         case LYNQ_REQUEST_LAPNACT:
         case LYNQ_REQUEST_ELAPNACT:
         case LYNQ_REQUEST_SCREEN_STATE:
+        case LYNQ_REQUEST_APN:
         case LYNQ_REQUEST_SWITCH_SIM:
         {
+            printf("__FUNCTION__ %s __LINE__ %d\n", __FUNCTION__, __LINE__);
             return LYNQ_GOTO_TELE_REQ;
         }
         case LYNQ_REQUEST_SEND_LOG_DATA:
@@ -485,6 +487,184 @@
     }
     return 0;
 }
+
+int insert_apn_char(char *agc, char *id,char *mcc, char *mnc, char *apn, char *apntype, char *user, char *password, char *normalprotocol, char *roamingprotocol, char *carrier)
+{
+    char strtmp[10][32];
+    if (!strcmp(id,"null"))
+    {
+        sprintf(strtmp[0], "id=;");
+    }
+    else
+    {
+        sprintf(strtmp[0], "id=%s;", id);
+    }
+    if (!strcmp(mcc,"null"))
+    {
+        sprintf(strtmp[1], "mcc=;");
+    }
+    else
+    {
+        sprintf(strtmp[1], "mcc=%s;", mcc);
+    }
+    if (!strcmp(mnc,"null"))
+    {
+        sprintf(strtmp[2], "mnc=;");
+    }
+    else
+    {
+        sprintf(strtmp[2], "mnc=%s;", mnc);
+    }
+    if (!strcmp(apn,"null"))
+    {
+        sprintf(strtmp[3], "apn=;");
+    }
+    else
+    {
+        sprintf(strtmp[3], "apn=%s;", apn);
+    }
+    if (!strcmp(apntype,"null"))
+    {
+        sprintf(strtmp[4], "apntype=;");
+    }
+    else
+    {
+        sprintf(strtmp[4], "type=%s;", apntype);
+    }
+    if (!strcmp(user,"null"))
+    {
+        sprintf(strtmp[5], "user=;");
+    }
+    else
+    {
+        sprintf(strtmp[5], "user=%s;", user);
+    }
+    if (!strcmp(password,"null"))
+    {
+        sprintf(strtmp[6], "password=;");
+    }
+    else
+    {
+        sprintf(strtmp[6], "password=%s;", password);
+    }
+    if (!strcmp(normalprotocol,"null"))
+    {
+        sprintf(strtmp[7], "protocol=;");
+    }
+    else
+    {
+        sprintf(strtmp[7], "normalprotocol=%s;", normalprotocol);
+    }
+    if (!strcmp(roamingprotocol,"null"))
+    {
+        sprintf(strtmp[8], "roamingprotocol=;");
+    }
+    else
+    {
+        sprintf(strtmp[8], "roamingprotocol=%s;", roamingprotocol);
+    }
+    if (!strcmp(carrier,"null"))
+    {
+        sprintf(strtmp[9], "carrier=;");
+    }
+    else
+    {
+        sprintf(strtmp[9], "carrier=%s;", carrier);
+    }
+    sprintf(agc, "%s%s%s%s%s%s%s%s%s%s",strtmp[0], strtmp[1], strtmp[2], strtmp[3], strtmp[4], strtmp[5], strtmp[6], strtmp[7], strtmp[8], strtmp[9]);
+    return 0;
+}
+
+int lynq_modify_apn_info(int argc,char*argv[],char *rilReq, int uToken)
+{
+    /*
+        argv[4];//id argv[5];//mcc argv[6];//mnc argv[7];//apn argv[8];//apntype argv[9];//user
+        argv[10];//password  argv[11] normalprotocol argv[12] roamingprotocol
+    */
+    int operate = 0;
+    int ret = -1;
+    if(argc < 3)
+    {
+        RLOGD("parameter error!!!");
+        return 1;
+    }
+    if(argv[3] == NULL)
+    {
+        syncRespToUsb(100);
+        return -1;
+    }
+    char *new_argv[10] = {};
+    char apn_info[512];
+    operate = atoi(argv[3]);
+    new_argv[0] = (char *)rilReq;
+    if(operate == 0)//insert apn db
+    {
+        for(int i = 4; i < 14; i++)
+        {
+            printf("argv[%d] %s\n", i,argv[i]);
+            if(argv[i] == NULL)
+            {
+                syncRespToUsb(100);
+                return -1;
+            }
+        }
+        insert_apn_char(apn_info, argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13]);
+        new_argv[1] = "0";
+        new_argv[2] = apn_info;
+        android::lynqSendToRil(3,new_argv,uToken);
+        usleep(100*1000);
+        syncRespToUsb(0);
+    }
+    else if(operate == 1)//delete apn db
+    {
+        if(argv[4] == NULL)
+        {
+            syncRespToUsb(100);
+            return -1;
+        }
+        sprintf(apn_info, "id=%s", argv[4]);
+        new_argv[1] = "1";
+        new_argv[2] = apn_info;
+        android::lynqSendToRil(3,new_argv,uToken);
+        usleep(100*1000);
+        syncRespToUsb(0);
+    }
+    else if(operate == 2)//query apn db
+    {
+        if(argv[4] == NULL)
+        {
+            syncRespToUsb(100);
+            return -1;
+        }
+        sprintf(apn_info, "id=%s", argv[4]);
+        new_argv[1] = "2";
+        new_argv[2] = apn_info;
+        android::lynqSendToRil(3,new_argv,uToken);
+        usleep(100*1000);
+        syncRespToUsb(0);
+    }
+    else if(operate == 3)//modify apn db
+    {
+        for(int i = 4; i < 14; i++)
+        {
+            printf("argv[%d] %s\n", i,argv[i]);
+            if(argv[i] == NULL)
+            {
+                syncRespToUsb(100);
+                return -1;
+            }
+        }
+        insert_apn_char(apn_info, argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13]);
+        //sprintf(new_argv[1], "%d", operate);
+        new_argv[1] = "3";
+        new_argv[2] = apn_info;
+        android::lynqSendToRil(3,new_argv,uToken);
+        usleep(100*1000);
+        syncRespToUsb(0);
+    }
+    return 0;
+}
+
 int switchSim(int argc,char*argv[],char *rilReq, int uToken)
 {
     int slot = 0;
diff --git a/framework/lynq-ril-service/src/lynq_common.h b/framework/lynq-ril-service/src/lynq_common.h
index b733d2e..7b2daae 100755
--- a/framework/lynq-ril-service/src/lynq_common.h
+++ b/framework/lynq-ril-service/src/lynq_common.h
@@ -65,6 +65,7 @@
 #define LYNQ_REQUEST_INSIDE_VERSION (LYNQ_VERSION +20)
 /*rita add*/
 #define LYNQ_REQUEST_TEMP (LYNQ_VERSION +26)
+#define LYNQ_REQUEST_APN (LYNQ_VERSION +27)
 #define LYNQ_USER_REQUEST_GNSS (LYNQ_VERSION +100)
 #define LYNQ_USER_REQUEST_OTHRE (LYNQ_VERSION +101)
 
@@ -115,4 +116,7 @@
 void lynqAtRespWatingEvent();
 int syncRespToUsb(int error_code);
 void lynqInfo(char*argv[]);
+int lynq_modify_apn_info(int argc,char*argv[],char *rilReq, int uToken);
+void sendSignalApnChange();
+int waitApnResult();
 #endif