From 897a91d11ada063e669cdc475d0d97b74726ac18 Mon Sep 17 00:00:00 2001 From: suvendhu Date: Wed, 20 Sep 2023 15:51:50 +0530 Subject: [PATCH] xml output indentation --- src/common.c | 2 +- src/xml.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/xml.h | 2 ++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/common.c b/src/common.c index a2c86be..f827a19 100755 --- a/src/common.c +++ b/src/common.c @@ -134,7 +134,7 @@ void add_dm_parameter_to_list(struct list_head *head, char *param_name, char *pa list_for_each_entry(dm_parameter, head, list) { if (CWMP_STRCMP(param_name, dm_parameter->name) == 0) { - if (CWMP_STRCMP(dm_parameter->value, param_val) != 0) { + if (param_val && CWMP_STRCMP(dm_parameter->value, param_val) != 0) { FREE(dm_parameter->value); dm_parameter->value = strdup(param_val); } diff --git a/src/xml.c b/src/xml.c index 3db49b5..e77b87a 100644 --- a/src/xml.c +++ b/src/xml.c @@ -26,6 +26,8 @@ static const char *soap_enc_url = "http://schemas.xmlsoap.org/soap/encoding/"; static const char *xsd_url = "http://www.w3.org/2001/XMLSchema"; static const char *xsi_url = "http://www.w3.org/2001/XMLSchema-instance"; +char *g_tab_space = NULL; + const char *cwmp_urls[] = { "urn:dslforum-org:cwmp-1-0", "urn:dslforum-org:cwmp-1-1", "urn:dslforum-org:cwmp-1-2", "urn:dslforum-org:cwmp-1-2", "urn:dslforum-org:cwmp-1-2", "urn:dslforum-org:cwmp-1-2", NULL }; struct xml_node_data xml_nodes_data[] = { @@ -1376,7 +1378,9 @@ int xml_send_message(struct rpc *rpc) if (cwmp_main->session->tree_out) { unsigned char *zmsg_out; - msg_out = mxmlSaveAllocString(cwmp_main->session->tree_out, MXML_NO_CALLBACK); + + msg_out = mxmlSaveAllocString(cwmp_main->session->tree_out, whitespace_cb); + FREE(g_tab_space); if (msg_out == NULL) { CWMP_LOG(ERROR, "Received tree_out is empty"); return -1; @@ -1773,3 +1777,55 @@ void load_response_xml_schema(mxml_node_t **schema) *schema = xml; } + +const char *get_node_tab_space(mxml_node_t *node) +{ + int count = 0; + + while ((node = mxmlGetParent(node))) { + count = count + 1; + } + + if (!count) + return ""; + + FREE(g_tab_space); + unsigned int size = count * sizeof(CWMP_MXML_TAB_SPACE) + 1; + g_tab_space = (char *)malloc(size); + if (!g_tab_space) { + CWMP_LOG(ERROR, "Not able to allocate memory of size %u", size); + return ""; + } + + memset(g_tab_space, 0, size); + snprintf(g_tab_space, size, "%*s", size - 1, ""); + + return g_tab_space; +} + +const char *whitespace_cb(mxml_node_t *node, int where) +{ + if (mxmlGetType(node) != MXML_ELEMENT) + return NULL; + + switch (where) { + case MXML_WS_BEFORE_CLOSE: + if (mxmlGetFirstChild(node) && mxmlGetType(mxmlGetFirstChild(node)) != MXML_ELEMENT) + return NULL; + + return get_node_tab_space(node); + case MXML_WS_BEFORE_OPEN: + if (where == MXML_WS_BEFORE_CLOSE && mxmlGetFirstChild(node) && mxmlGetType(mxmlGetFirstChild(node)) != MXML_ELEMENT) + return NULL; + + return get_node_tab_space(node); + case MXML_WS_AFTER_OPEN: + return ((mxmlGetFirstChild(node) == NULL || mxmlGetType(mxmlGetFirstChild(node)) == MXML_ELEMENT) ? "\n" : NULL); + case MXML_WS_AFTER_CLOSE: + return "\n"; + default: + return NULL; + } + + return NULL; +} diff --git a/src/xml.h b/src/xml.h index 4bca89e..0d2deb3 100644 --- a/src/xml.h +++ b/src/xml.h @@ -346,4 +346,6 @@ int build_backup_cdu_option(mxml_node_t *cdu, struct xml_data_struct *xml_attrs) int get_soap_enc_array_type(mxml_node_t *node, struct xml_data_struct *xml_attrs); char *get_xml_node_name_switch(char *node_name); char *get_xml_node_name_by_switch_name(char *switch_node_name); +const char *whitespace_cb(mxml_node_t *node, int where); +const char *get_node_tab_space(mxml_node_t *node); #endif