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);
+ }
+
+}
+