ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/marvell/webui/cgi/src/blobmsg_xml.c b/marvell/webui/cgi/src/blobmsg_xml.c
new file mode 100644
index 0000000..a07448d
--- /dev/null
+++ b/marvell/webui/cgi/src/blobmsg_xml.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2010-2012 Felix Fietkau <nbd@openwrt.org>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <libubox/blobmsg.h>
+#include <mxml.h>
+#include "blobmsg_xml.h"
+
+
+#define XML_ELEMENT_LIST_ITEM "Item"
+#define XML_LIST_ATTR_INDEX "index" 
+
+void blobmsg_format_xml(struct blob_attr *attr, int len, bool array)
+{
+	struct blob_attr *pos;
+	int rem = len;
+
+	mxml_node_t *xml;
+	mxml_node_t *rgw;
+	mxml_node_t *node;
+
+	xml = mxmlNewXML("1.0");
+	rgw = mxmlNewElement(xml,"RGW");
+	node = rgw;
+
+ 	__blob_for_each_attr(pos, attr, rem)
+	{
+		blobmsg_format_xml_element(&node, pos, array);
+	}
+}
+void blobmsg_format_xml_list_item(mxml_node_t *node, struct blob_attr *attr,  int len, bool array)
+{
+	int field;
+	mxml_node_t *cur;
+	struct blob_attr *pos;
+	int rem = len;
+	__blob_for_each_attr(pos, attr, rem)
+	{
+		//For every table item
+		blobmsg_format_xml_element(&node, pos, array);
+		//cur=mxmlNewElement(node, blobmsg_name(attr));
+		//mxmlAdd(node, MXML_ADD_AFTER, NULL, cur);
+		//mxmlNewOpaque(cur, blobmsg_data(attr));
+	}
+	return;
+
+}
+void blobmsg_format_xml_list(mxml_node_t *node, struct blob_attr *attr,  int len, bool array)
+{
+	mxml_node_t *cur;
+	int index=0;
+	struct blob_attr *pos;
+	int rem = len;
+	char index_str[10] = {'\0'};
+	int size;
+	__blob_for_each_attr(pos, attr, rem)
+	{
+		// For every table in parent array
+		//New param node <Item></Item>
+		cur=mxmlNewElement(node, XML_ELEMENT_LIST_ITEM);
+		mxmlAdd(node, MXML_ADD_AFTER, NULL, cur);
+		snprintf(index_str, 10, "%d", ++index);
+		mxmlElementSetAttr(cur, XML_LIST_ATTR_INDEX, index_str);
+		//skip blobmsg_name(pos)
+		//pass table items for further process
+		//blobmsg_format_xml_list_item(cur,blobmsg_data(pos),blobmsg_data_len(pos),false);
+		size = blob_pad_len(pos);
+		blobmsg_format_xml_list_item(cur,pos, blob_pad_len(pos),false);
+	}
+	return;
+}
+void blobmsg_format_xml_element( mxml_node_t **node, struct blob_attr *attr, bool array)
+{
+#define DEBUG_ON_OFF 1
+	const char *data_str;
+	char buf[32];
+	void *data;
+	int len;
+	int str_size;
+	mxml_node_t *cur;
+
+#if DEBUG_ON_OFF 
+	FILE *fp;
+	fp = fopen("/tmp/blob_c_xml.log", "w+");
+	if(!fp)
+	{
+		return;
+	}
+#endif 
+	if (!blobmsg_check_attr(attr, false))
+		return;
+
+	if (blobmsg_name(attr)[0]) {
+		if(!strcmp(blobmsg_name(attr), "ril_id"))
+		{
+			//for RIL response, no need RIL 
+			return;
+		}
+		if(!strcmp(blobmsg_name(attr), "module_name"))
+		{
+			cur = mxmlNewElement(*node, blobmsg_data(attr));
+			*node = cur;
+			return;
+		}
+		else
+		{
+			fprintf(fp,"tag name %s\n",blobmsg_name(attr));
+			cur = mxmlNewElement(*node, blobmsg_name(attr));
+		}
+	}
+
+	data = blobmsg_data(attr);
+	len = blobmsg_data_len(attr);
+
+	data_str = buf;
+	switch(blob_id(attr)) {
+	case BLOBMSG_TYPE_UNSPEC:
+		sprintf(buf, "null");
+		break;
+	case BLOBMSG_TYPE_BOOL:
+
+		sprintf(buf, "%s", *(uint8_t *)data ? "true" : "false");
+		fprintf(fp,"bool %s\n",buf);
+		break;
+	case BLOBMSG_TYPE_INT16:
+		sprintf(buf, "%d", be16_to_cpu(*(uint16_t *)data));
+		fprintf(fp,"INT16 %s\n",buf);
+		break;
+	case BLOBMSG_TYPE_INT32:
+		sprintf(buf, "%d", (int32_t) be32_to_cpu(*(uint32_t *)data));
+		fprintf(fp,"INT32 %s\n",buf);
+		break;
+	case BLOBMSG_TYPE_INT64:
+		sprintf(buf, "%lld", (long long int) be64_to_cpu(*(uint64_t *)data));
+		fprintf(fp,"INT64 %s\n",buf);
+		break;
+	case BLOBMSG_TYPE_STRING:
+		data_str = data;
+		fprintf(fp,"STRING %s\n",data_str);
+		break;
+	case BLOBMSG_TYPE_ARRAY:
+		fprintf(fp,"ARRAY %p %p %u\n",*node, data, len);
+		blobmsg_format_xml_list(cur, data, len, true);
+		fclose(fp);
+		return;
+	case BLOBMSG_TYPE_TABLE:
+		fprintf(fp,"TABLE %p %p %u\n",cur, data, len);
+		blobmsg_format_xml_list_item(cur, data, len, false);
+		fclose(fp);
+		return;
+	}
+	fprintf(fp,"data_str %s\n",data_str);
+	fclose(fp);
+	mxmlNewText(cur, 0, data_str);
+}
+
+void blobmsg_format_xml_tree(mxml_node_t *node, struct blob_attr *attr,  int len, bool array)
+{
+	struct blob_attr *pos;
+	int rem = len;
+
+	mxml_node_t *cur;
+	cur  = node;
+
+
+	__blob_for_each_attr(pos, attr, rem)
+	{
+		blobmsg_format_xml_element(&cur, pos, array);
+	}
+
+}
+