[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/app/goahead/interface5.0/zte_web_ussd.c b/ap/app/goahead/interface5.0/zte_web_ussd.c
new file mode 100644
index 0000000..e65ab24
--- /dev/null
+++ b/ap/app/goahead/interface5.0/zte_web_ussd.c
@@ -0,0 +1,303 @@
+/******************************************************************
+* Description:  provide functions about the ussd management
+* Modify Date      Version     Author         Modification
+* 2012/04/06        V1.0      chenyi        create
+******************************************************************/
+
+//header file
+#include "zte_web_interface.h"
+//#include "zte_topsw_ussd.h"
+//#include "libzte_ussd.h"
+//constant
+
+#define USSD_ACTION "ussd_action"
+#define USSD_DCS "ussd_dcs"
+#define USSD_DATA "ussd_data"
+
+#define ZTE_WEB_USSD_SEND               "ussd_send"
+#define ZTE_WEB_USSD_CANCEL           "ussd_cancel"
+#define ZTE_WEB_USSD_REPLY              "ussd_reply"
+#define ZTE_WEB_USSD_FIRST              "ussd"
+#define ZTE_WEB_USSD_OVER               "ussd_over"
+
+#ifndef ZTE_USSD_NV
+#define ZTE_USSD_NV  "ussd_write_flag"
+#endif
+
+#ifndef ZTE_MAX_USSD_CHAR
+#define ZTE_MAX_USSD_CHAR  160
+#endif
+
+#define USSD_OPERATING "15"
+#define USSD_FIRST_CANCEL "17"
+#define USSD_OVER ""
+
+typedef struct {
+	int ussd_action;
+	int ussd_dcs;
+	unsigned char ussd_data[ZTE_USSD_DATA_TO_WEB_LEN];
+} zte_ussd_data_to_web_type;
+static void zte_web_ussd_cancel(webs_t wp);
+static void zte_web_ussd_send(webs_t wp);
+static void zte_web_ussd_reply(webs_t wp);
+void zte_web_ussd(webs_t wp);
+static void zte_web_ussd_over(webs_t wp);
+
+//functions
+
+/**********************************************************************
+* Function:         zte_goform_ussd_process
+* Description:
+* Input:            web para
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120406    V1.0        chenyi        first version
+**********************************************************************/
+void zte_goform_ussd_process(webs_t wp)
+{
+	char_t *ussd_operator = NULL;
+
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_ussd-> invalid input..\n"); /*lint !e26*/
+		return;
+	}
+
+	ussd_operator = websGetVar(wp, T("USSD_operator"), T(""));
+	slog(MISC_PRINT, SLOG_DEBUG, "ussd_operator is [%s].\n", ussd_operator); /*lint !e26*/
+
+	if (0 == strcmp(ussd_operator, ZTE_WEB_USSD_SEND)) {
+		zte_web_ussd_send(wp);
+	} else if (0 == strcmp(ussd_operator, ZTE_WEB_USSD_CANCEL)) {
+		zte_web_ussd_cancel(wp);
+	} else if (0 == strcmp(ussd_operator, ZTE_WEB_USSD_REPLY)) {
+		zte_web_ussd_reply(wp);
+	} else if (0 == strcmp(ussd_operator, ZTE_WEB_USSD_FIRST)) {
+		zte_web_ussd(wp);
+	} else if (0 == strcmp(ussd_operator, ZTE_WEB_USSD_OVER)) {
+		zte_web_ussd_over(wp);
+	} else {
+		slog(MISC_PRINT, SLOG_DEBUG, "invalid ussd_operator[%s].\n", ussd_operator); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+	}
+}
+/**********************************************************************
+* Function:         zte_web_ussd_send(webs_t wp)
+* Description:
+* Input:            web para
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120406    V1.0        chenyi        first version
+**********************************************************************/
+static void zte_web_ussd_send(webs_t wp)
+{
+	unsigned char ussd_data[ZTE_MAX_USSD_CHAR] = {0};
+	unsigned char *ussd_send_number = NULL;
+
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_ussd_send: invalid input..\n"); /*lint !e26*/
+		return;
+	}
+
+	ussd_send_number = websGetVar(wp, T("USSD_send_number"), T(""));
+	slog(MISC_PRINT, SLOG_DEBUG, "ussd_send_number is [%s].\n", ussd_send_number); /*lint !e26*/
+
+	if (0 == strcmp(ussd_send_number, "")) {
+		slog(MISC_PRINT, SLOG_ERR, "ussd number is empty.\n"); /*lint !e26*/
+		zte_write_result_to_web(wp, FAILURE);
+		return;
+	}
+
+	strncpy(ussd_data, ussd_send_number, sizeof(ussd_data) - 1);
+	slog(MISC_PRINT, SLOG_DEBUG, "ussd_data is [%s].\n", ussd_data); /*lint !e26*/
+
+	//update the current state
+	(void)zte_web_write(ZTE_USSD_NV, USSD_OPERATING);
+	(void)zte_web_write("ussd_operater", "send");
+	(void)zte_web_write("ussd_string", ussd_data);
+
+	/*handler to mc*/
+	if (0 == ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_USSD_SET_REQ, 0, NULL, 0)) {
+		slog(MISC_PRINT, SLOG_NORMAL, "zte_web_ussd_send:  successful.\n"); /*lint !e26*/
+	} else {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_ussd_send:  failed.\n"); /*lint !e26*/
+	}
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+/**********************************************************************
+* Function:         zte_web_ussd_cancel(webs_t wp)
+* Description:     to cancel the ussd operation
+* Input:            web para
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120406    V1.0        chenyi        first version
+**********************************************************************/
+static void zte_web_ussd_cancel(webs_t wp)
+{
+	/*check input*/
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_ussd_cancel invalid input..\n"); /*lint !e26*/
+		return;
+	}
+
+	(void)zte_web_write(ZTE_USSD_NV, USSD_OPERATING);
+
+	(void)zte_web_write("ussd_operater", "cancel");
+
+	/*handler to mc*/
+	if (0 == ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_USSD_CANCEL_REQ, 0, NULL, 0)) {
+		slog(MISC_PRINT, SLOG_NORMAL, "zte_web_ussd_cancel: zte_topsw_mc_ussd_send successful.\n"); /*lint !e26*/
+	} else {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_ussd_cancel: zte_topsw_mc_ussd_send failed.\n"); /*lint !e26*/
+	}
+
+	zte_write_result_to_web(wp, SUCCESS);
+}
+/**********************************************************************
+* Function:         zte_web_ussd_over(webs_t wp)
+* Description:     to reset the ussd_write_flag
+* Input:            web para
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120406    V1.0        chenyi        first version
+**********************************************************************/
+static void zte_web_ussd_over(webs_t wp)
+{
+	/*check input*/
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_ussd_over invalid input..\n"); /*lint !e26*/
+		return;
+	}
+
+	(void)zte_web_write(ZTE_USSD_NV, USSD_OVER);
+	zte_write_result_to_web(wp, SUCCESS);
+}
+/**********************************************************************
+* Function:         zte_web_ussd_reply(webs_t wp)
+* Description:      to reply(send)  the ussd cmd
+* Input:
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120406    V1.0        chenyi        first version
+**********************************************************************/
+static void zte_web_ussd_reply(webs_t wp)
+{
+	/*data get from page*/
+	unsigned char ussd_data_reply[ZTE_MAX_USSD_CHAR] = {0};
+
+	/*check input*/
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_ussd_reply: invalid input..\n"); /*lint !e26*/
+		return;
+	}
+
+	/*set data */
+	strncpy(ussd_data_reply, websGetVar(wp, T("USSD_reply_number"), T("")), sizeof(ussd_data_reply) - 1);
+
+	/*handler to mc*/
+	(void)zte_web_write(ZTE_USSD_NV, USSD_OPERATING);
+	(void)zte_web_write("ussd_string", ussd_data_reply);
+
+	(void)zte_web_write("ussd_operater", "send");
+
+	if (0 == ipc_send_message(MODULE_ID_WEB_CGI, MODULE_ID_AT_CTL, MSG_CMD_USSD_SET_REQ, 0, NULL, 0)) {
+		slog(MISC_PRINT, SLOG_NORMAL, "zte_web_ussd_reply: successful.\n"); /*lint !e26*/
+	} else {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_ussd_reply: failed.\n"); /*lint !e26*/
+	}
+	zte_write_result_to_web(wp, SUCCESS);
+}
+/**********************************************************************
+* Function:         zte_web_ussd(webs_t wp)
+* Description:      to cancel the ussd cmd
+* Input:            web para
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 20120406    V1.0        chenyi        first version
+**********************************************************************/
+
+void zte_web_ussd(webs_t wp)
+{
+	if (NULL == wp) {
+		slog(MISC_PRINT, SLOG_ERR, "zte_web_ussd: invalid input..\n"); /*lint !e26*/
+		return;
+	}
+	slog(MISC_PRINT, SLOG_DEBUG, "zte_web_ussd: ok\n"); /*lint !e26*/
+
+	(void)zte_web_write(ZTE_USSD_NV, USSD_FIRST_CANCEL);
+	zte_write_result_to_web(wp, SUCCESS);
+}
+int zte_ussd_get_to_web_data(zte_ussd_data_to_web_type *para)
+{
+	char buf[NV_ITEM_STRING_LEN_20] = {0};
+
+	if (NULL == para) {
+		slog(MISC_PRINT, SLOG_DEBUG, "para is null\n"); /*lint !e26*/
+		return -1;
+	}
+
+	sc_cfg_get("ussd_mode", buf, sizeof(buf));
+	para->ussd_action = atoi(buf);
+	slog(MISC_PRINT, SLOG_DEBUG, "ussd_operater is %d\n", para->ussd_action); /*lint !e26*/
+
+	memset(&buf, 0, sizeof(buf));
+	sc_cfg_get("ussd_dcs", buf, sizeof(buf));
+	para->ussd_dcs = atoi(buf);
+	slog(MISC_PRINT, SLOG_DEBUG, "ussd_dcs is %d\n", para->ussd_dcs); /*lint !e26*/
+
+	sc_cfg_get("ussd_content", (para->ussd_data), sizeof(para->ussd_data));
+
+	slog(MISC_PRINT, SLOG_DEBUG, "ussd_data is %s\n", para->ussd_data); /*lint !e26*/
+
+	return 0;
+
+}
+/**********************************************************************
+* Function:         zte_get_ussd_data_info
+* Description:      to get the ussd data info
+* Input:            the web para
+* Output:
+* Return:
+* Others:
+* Modify Date   Version     Author          Modification
+* -----------------------------------------------
+* 2012/04/16    V1.0        chenyi       first version
+**********************************************************************/
+void zte_get_ussd_data_info(webs_t wp)
+{
+	zte_ussd_data_to_web_type ussd_data_info;
+	int result = 0;
+
+	memset(&ussd_data_info, 0, sizeof(zte_ussd_data_to_web_type));
+	result = zte_ussd_get_to_web_data(&ussd_data_info);
+#if 0 // kw 3 return  -1 branch is unreachable 	
+	if (-1 == result) {
+		slog(MISC_PRINT, SLOG_ERR, "call zte_ussd_get_to_web_data fail.\n"); /*lint !e26*/
+		web_feedback_header(wp);
+		(void)websWrite(wp, T("[]"));
+		return ;
+	}
+#endif
+
+	web_feedback_header(wp);
+	(void)websWrite(wp, T("{\"%s\":\"%d\",\"%s\":\"%d\",\"%s\":\"%s\"}"), USSD_ACTION, ussd_data_info.ussd_action, USSD_DCS, ussd_data_info.ussd_dcs, \
+	                USSD_DATA, ussd_data_info.ussd_data);
+}