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

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/ap/lib/libatext/ext_ftp_func.c b/ap/lib/libatext/ext_ftp_func.c
new file mode 100755
index 0000000..60425af
--- /dev/null
+++ b/ap/lib/libatext/ext_ftp_func.c
@@ -0,0 +1,387 @@
+/**
+ * @file ext_ftp_func.c
+ * @brief zte_ftpÏà¹ØÀ©Õ¹at×¢²á¼°´¦ÀíʵÏÖ
+ *
+ * Copyright (C) 2017 Sanechips Technology Co., Ltd.
+ * @author
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef CONFIG_MIN_8M_VERSION
+/*******************************************************************************
+ *                           Include header files                              *
+ ******************************************************************************/
+#include "ext_regist.h"
+#include "at_utils.h"
+#include "softap_api.h"
+#include "ext_ftp_func.h"
+
+/*******************************************************************************
+ *                             Macro definitions                               *
+ ******************************************************************************/
+
+/*******************************************************************************
+ *                             Type definitions                                *
+ ******************************************************************************/
+/*******************************************************************************
+ *                        Local function declarations                          *
+ ******************************************************************************/
+/*******************************************************************************
+ *                         Local variable definitions                          *
+ ******************************************************************************/
+/*
+ $MYFTPOPEN=<channel>,<destination_ip/url>,<username>,<password>,<mode>,<Tout>,<FTPtype>
+*/
+static int ext_ftpopen_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen)
+{
+	struct zteftp_open_reqmsg  *reqmsg = malloc(sizeof(struct zteftp_open_reqmsg));
+	assert(reqmsg);
+	char *p[7] = {
+		&reqmsg->channel,
+		reqmsg->destination,
+		reqmsg->username,
+		reqmsg->password,
+		&reqmsg->mode,
+		&reqmsg->tout,
+		&reqmsg->ftptype
+	};
+	memset(reqmsg, 0x00, sizeof(struct zteftp_open_reqmsg));
+	parse_param2("%d,%s,%s,%s,%d,%d,%d", at_paras, p);
+	at_print(AT_NORMAL, "ext_ftpopen_req %d,%s,%s,%s,%d,%d,%d\n", reqmsg->channel,
+	         reqmsg->destination,
+	         reqmsg->username,
+	         reqmsg->password,
+	         reqmsg->mode,
+	         reqmsg->tout,
+	         reqmsg->ftptype);
+	*res_msg = reqmsg;
+	*res_msglen = sizeof(struct zteftp_open_reqmsg);
+	return AT_CONTINUE;
+}
+/*
+  <CR><LF>OK<CR><LF>
+  <CR><LF>ERROR:<err><CR><LF>
+*/
+static int ext_ftpopen_rsp(void *rsp_msg, void**ret, int *retlen)
+{
+	struct zteftp_open_rspmsg *rspmsg = (struct zteftp_open_rspmsg*)rsp_msg;
+	char *at_str = malloc(32);
+	assert(at_str);
+	memset(at_str, 0x00, 32);
+
+	at_print(AT_NORMAL, "result %d\n", rspmsg->result);
+	if (rspmsg->result < 0) {
+		sprintf(at_str, "\r\nERROR: %d\r\n", rspmsg->err);
+	} else {
+		sprintf(at_str, "\r\nOK\r\n");
+	}
+	*ret = at_str;
+	*retlen = strlen(at_str);
+	return AT_END;
+}
+/*
+  at$MYFTPOPEN?
+*/
+static int ext_ftpstate_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen)
+{
+	return AT_CONTINUE;
+}
+/*
+  <CR><LF>$MYFTPOPEN:<connect_status>
+  <CR><LF>OK<CR><LF>
+*/
+static int ext_ftpstate_rsp(void *rsp_msg, void**ret, int *retlen)
+{
+	struct zteftp_query_rspmsg *rspmsg = (struct zteftp_query_rspmsg*)rsp_msg;
+	char *at_str = malloc(32);
+	assert(at_str);
+	memset(at_str, 0x00, 32);
+
+	sprintf(at_str, "\r\n$MYFTPOPEN: %d\r\nOK\r\n", rspmsg->connect_status);
+
+	*ret = at_str;
+	*retlen = strlen(at_str);
+	return AT_END;
+}
+
+/*
+  at$MYFTPOPEN=?
+
+  <CR><LF>OK<CR><LF>
+*/
+static int ext_ftpstate_confirm(int at_fd, char *at_paras, void ** res_msg, int *res_msglen)
+{
+	char *at_str = malloc(32);
+	assert(at_str);
+	memset(at_str, 0x00, 32);
+
+	sprintf(at_str, "\r\nOK\r\n");
+
+	*res_msg = at_str;
+	*res_msglen = strlen(at_str);
+	return AT_END;
+}
+
+/*
+  at$MYFTPCLOSE
+*/
+static int ext_ftpclose_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen)
+{
+	return AT_CONTINUE;
+}
+/*
+  <CR><LF>OK<CR><LF>
+  <CR><LF>ERROR:<err><CR><LF>
+*/
+static int ext_ftpclose_rsp(void *rsp_msg, void**ret, int *retlen)
+{
+	struct zteftp_close_rspmsg *rspmsg = (struct zteftp_close_rspmsg*)rsp_msg;
+	char *at_str = malloc(32);
+	assert(at_str);
+	memset(at_str, 0x00, 32);
+
+	if (rspmsg->result < 0) {
+		sprintf(at_str, "\r\nERROR\r\n");
+	} else {
+		sprintf(at_str, "\r\nOK\r\n");
+	}
+
+	*ret = at_str;
+	*retlen = strlen(at_str);
+	return AT_END;
+}
+
+/*
+  at$MYFTPSIZE=<File_Name>
+*/
+static int ext_ftpsize_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen)
+{
+	struct zteftp_size_reqmsg  *reqmsg = malloc(sizeof(struct zteftp_size_reqmsg));
+	assert(reqmsg);
+	char *p[5] = {reqmsg->file_name};
+	memset(reqmsg, 0x00, sizeof(struct zteftp_size_reqmsg));
+	parse_param2("%s", at_paras, p);
+	at_print(AT_NORMAL, "ext_ftpsize_req %s", reqmsg->file_name);
+	*res_msg = reqmsg;
+	*res_msglen = sizeof(struct zteftp_size_reqmsg);
+	return AT_CONTINUE;
+}
+/*
+  <CR><LF>$MYFTPSIZE:<file_lenth>
+  <CR><LF>OK<CR><LF>
+
+  <CR><LF>ERROR:<err><CR><LF>
+
+  <CR><LF>$MYURLFTP:<status><CR><LF>
+*/
+static int ext_ftpsize_rsp(void *rsp_msg, void**ret, int *retlen)
+{
+	struct zteftp_size_rspmsg *rspmsg = (struct zteftp_size_rspmsg*)rsp_msg;
+	int offset = 0;
+	char *at_str = malloc(64);
+	assert(at_str);
+	memset(at_str, 0x00, 64);
+
+	if (rspmsg->file_lenth < 0) {
+		offset += sprintf(at_str, "\r\nERROR\r\n");
+	} else {
+		offset += sprintf(at_str, "\r\n$MYFTPSIZE: %d\r\nOK\r\n", rspmsg->file_lenth);
+#if 0
+		offset += sprintf(at_str + offset, "\r\n$MYURCFTP:1\r\n");/*Êý¾ÝÁ¬½Ó¶Ï¿ª*/
+#endif
+	}
+
+	*ret = at_str;
+	*retlen = strlen(at_str);
+	return AT_END;
+}
+
+/*
+  at$MYFTPSIZE=<File_Name>[,<data_offset>,<data_lenth>]
+*/
+static int ext_ftpget_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen)
+{
+	struct zteftp_get_reqmsg  *reqmsg = malloc(sizeof(struct zteftp_get_reqmsg));
+	assert(reqmsg);
+	char *p[5] = {reqmsg->file_name, &reqmsg->data_offset, &reqmsg->data_lenth};
+	memset(reqmsg, 0x00, sizeof(struct zteftp_get_reqmsg));
+	parse_param2("%s,%d,%d", at_paras, p);
+	at_print(AT_NORMAL, "ext_ftpget_req %s,%d,%d", reqmsg->file_name, reqmsg->data_offset, reqmsg->data_lenth);
+	*res_msg = reqmsg;
+	*res_msglen = sizeof(struct zteftp_get_reqmsg);
+	return AT_CONTINUE;
+}
+/*
+  <CR><LF>CONNECT<CR><LF>
+  <CR><LF><file_content>
+  <CR><LF>OK<CR><LF>
+
+  <CR><LF>ERROR<CR><LF>
+
+  <CR><LF>CONNECT<CR><LF>
+  <CR><LF><file_content>
+  <CR><LF>ERROR<CR><LF>
+*/
+static int ext_ftpget_rsp(void *rsp_msg, void**ret, int *retlen)
+{
+	struct zteftp_get_rspmsg *rspmsg = (struct zteftp_get_rspmsg*)rsp_msg;
+	char *at_str = NULL;
+	int offset = 0;
+
+	if (rspmsg->result < 0) {
+		at_str = malloc(64);
+		assert(at_str);
+		memset(at_str, 0x00, 64);
+		offset += sprintf(at_str, "\r\nERROR\r\n");
+	} else {
+		at_str = malloc(64 + rspmsg->data_lenth);
+		assert(at_str);
+		memset(at_str, 0x00, 64 + rspmsg->data_lenth);
+#if 1
+		offset += sprintf(at_str, "\r\nCONNECT");
+#else
+		offset += sprintf(at_str, "\r\nCONNECT\r\n");
+		/*Êý¾Ýͨ¹ýpassthrough·¢ËÍ*/
+		//offset += sprintf(at_str+offset, "%s",rspmsg->file_content);
+		memcpy(at_str + offset, rspmsg->file_content, rspmsg->data_lenth);
+		offset += rspmsg->data_lenth;
+		offset += sprintf(at_str + offset, "\r\nOK\r\n");
+#endif
+	}
+
+	*ret = at_str;
+	*retlen = offset;//strlen(at_str);
+
+	return AT_END;
+}
+/*
+  at$MYFTPSIZE=<File_Name>,<data_lenth>,<EOF>
+*/
+static int ext_ftpput_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen)
+{
+	struct zteftp_put_reqmsg  *reqmsg = malloc(sizeof(struct zteftp_put_reqmsg));
+	assert(reqmsg);
+	char *p[5] = {reqmsg->file_name, &reqmsg->data_lenth, &reqmsg->eof};
+	memset(reqmsg, 0x00, sizeof(struct zteftp_put_reqmsg));
+	parse_param2("%s,%d,%d", at_paras, p);
+	at_print(AT_NORMAL, "ext_ftpput_req %s,%d,%d\n", reqmsg->file_name, reqmsg->data_lenth, reqmsg->eof);
+	*res_msg = reqmsg;
+	*res_msglen = sizeof(struct zteftp_put_reqmsg);
+	return AT_CONTINUE;
+}
+/*
+  <CR><LF>CONNECT<CR><LF>
+  <CR><LF><file_content>
+  <CR><LF>OK<CR><LF>
+
+  <CR><LF>ERROR<CR><LF>
+*/
+static int ext_ftpput_rsp(void *rsp_msg, void**ret, int *retlen)
+{
+	struct zteftp_put_rspmsg *rspmsg = (struct zteftp_put_rspmsg*)rsp_msg;
+	char *at_str = malloc(32);
+	assert(at_str);
+
+	memset(at_str, 0x00, 32);
+	if (rspmsg->ret < 0) {
+		sprintf(at_str, "\r\nERROR\r\n");
+	} else if (rspmsg->ret == 0) {
+		sprintf(at_str, "\r\nCONNECT\r\n");
+	} else if (rspmsg->ret == 1) {
+		sprintf(at_str, "\r\nOK\r\n");
+	}
+
+	*ret = at_str;
+	*retlen = strlen(at_str);
+
+	return AT_END;
+}
+
+/*
+  at+FTPFOTA
+*/
+static int ext_ftpfota_req(int at_fd, char *at_paras, void ** res_msg, int *res_msglen)
+{
+	struct zteftp_fota_reqmsg  *reqmsg = malloc(sizeof(struct zteftp_fota_reqmsg));
+	assert(reqmsg);
+	char *p[7] = {
+		&reqmsg->channel,
+		reqmsg->destination,
+		reqmsg->file_name,
+		reqmsg->username,
+		reqmsg->password
+	};
+	memset(reqmsg, 0x00, sizeof(struct zteftp_fota_reqmsg));
+	parse_param2("%d,%s,%s,%s,%s", at_paras, p);
+	at_print(AT_NORMAL, "zteftp_fota_reqmsg %d,%s,%s,%s,%s\n", reqmsg->channel,
+	         reqmsg->destination,
+	         reqmsg->file_name,
+	         reqmsg->username,
+	         reqmsg->password
+	        );
+	*res_msg = reqmsg;
+	*res_msglen = sizeof(struct zteftp_fota_reqmsg);
+	return AT_CONTINUE;
+}
+/*
+  <CR><LF>OK<CR><LF>
+  <CR><LF>ERROR<CR><LF>
+*/
+static int ext_ftpfota_rsp(void *rsp_msg, void**ret, int *retlen)
+{
+	struct zteftp_fota_rspmsg *rspmsg = (struct zteftp_fota_rspmsg*)rsp_msg;
+	char *at_str = malloc(32);
+	assert(at_str);
+	memset(at_str, 0x00, 32);
+
+	if (rspmsg->result < 0) {
+		sprintf(at_str, "\r\nERROR\r\n");
+	} else {
+		sprintf(at_str, "\r\nOK\r\n");
+	}
+
+	*ret = at_str;
+	*retlen = strlen(at_str);
+	return AT_END;
+}
+/*******************************************************************************
+ *                        Global variable definitions                          *
+ ******************************************************************************/
+/**
+ * @brief ×¢²áftpÏà¹ØÀ©Õ¹at
+ * @param
+ * @return
+ * @retval
+ */
+int ext_ftp_regist(void)
+{
+//#ifdef GUODIAN
+	if (g_customer_type == CUSTOMER_GUODIAN) {
+		register_serv_func2("MYFTPOPEN=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPOPEN_REQ, MSG_CMD_FTPOPEN_RSP, ext_ftpopen_req,	ext_ftpopen_rsp);
+		register_serv_func2("MYFTPOPEN?", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPSTATE_REQ, MSG_CMD_FTPSTATE_RSP, ext_ftpstate_req,	ext_ftpstate_rsp);
+		register_serv_func2("MYFTPOPEN=?", MODULE_ID_SOCKET_PROXY, 0, 0, ext_ftpstate_confirm,	NULL);
+		register_serv_func2("MYFTPCLOSE", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPCLOSE_REQ, MSG_CMD_FTPCLOSE_RSP, ext_ftpclose_req,	ext_ftpclose_rsp);
+		register_serv_func2("MYFTPSIZE=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPSIZE_REQ, MSG_CMD_FTPSIZE_RSP, ext_ftpsize_req,	ext_ftpsize_rsp);
+		register_serv_func2("MYFTPGET=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPGET_REQ, MSG_CMD_FTPGET_RSP, ext_ftpget_req,	ext_ftpget_rsp);
+		register_serv_func2("MYFTPPUT=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPPUT_REQ, MSG_CMD_FTPPUT_RSP, ext_ftpput_req,	ext_ftpput_rsp);
+
+		register_serv_func2("FOTAFTP=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPFOTA_REQ, MSG_CMD_FTPFOTA_RSP, ext_ftpfota_req, ext_ftpfota_rsp);
+	} else if (g_customer_type == CUSTOMER_NANDIAN) {
+
+		register_serv_func2("MYFTPOPEN=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPOPEN_REQ, MSG_CMD_FTPOPEN_RSP, ext_ftpopen_req,	ext_ftpopen_rsp);
+		register_serv_func2("MYFTPOPEN?", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPSTATE_REQ, MSG_CMD_FTPSTATE_RSP, ext_ftpstate_req, ext_ftpstate_rsp);
+		register_serv_func2("MYFTPOPEN=?", MODULE_ID_SOCKET_PROXY, 0, 0, ext_ftpstate_confirm,	NULL);
+		register_serv_func2("MYFTPCLOSE", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPCLOSE_REQ, MSG_CMD_FTPCLOSE_RSP, ext_ftpclose_req, ext_ftpclose_rsp);
+		register_serv_func2("MYFTPSIZE=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPSIZE_REQ, MSG_CMD_FTPSIZE_RSP, ext_ftpsize_req,	ext_ftpsize_rsp);
+		register_serv_func2("MYFTPGET=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPGET_REQ, MSG_CMD_FTPGET_RSP, ext_ftpget_req,	ext_ftpget_rsp);
+		register_serv_func2("MYFTPPUT=", MODULE_ID_SOCKET_PROXY, MSG_CMD_FTPPUT_REQ, MSG_CMD_FTPPUT_RSP, ext_ftpput_req,	ext_ftpput_rsp);
+	}
+//#endif
+	return 0;
+
+}
+#endif