1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2025-02-02 15:07:36 -05:00

Feature: Allow attaching XML to extentions

This commit is contained in:
Philipp Schafft 2018-06-27 10:40:25 +00:00
parent 86a62889d2
commit 52429c714f
2 changed files with 106 additions and 27 deletions

View File

@ -39,6 +39,8 @@ struct reportxml_node_tag {
reportxml_node_type_t type; reportxml_node_type_t type;
reportxml_node_t **childs; reportxml_node_t **childs;
size_t childs_len; size_t childs_len;
xmlNodePtr *xml_childs;
size_t xml_childs_len;
char *content; char *content;
}; };
@ -290,8 +292,13 @@ static void __report_node_free(refobject_t self, void **userdata)
refobject_unref(node->childs[i]); refobject_unref(node->childs[i]);
} }
for (i = 0; i < node->xml_childs_len; i++) {
xmlFreeNode(node->xml_childs[i]);
}
free(node->content); free(node->content);
free(node->childs); free(node->childs);
free(node->xml_childs);
} }
reportxml_node_t * reportxml_node_new(reportxml_node_type_t type, const char *id, const char *definition, const char *akindof) reportxml_node_t * reportxml_node_new(reportxml_node_type_t type, const char *id, const char *definition, const char *akindof)
@ -388,40 +395,47 @@ reportxml_node_t * reportxml_node_parse_xmlnode(xmlNodePtr xmlnode)
xmlNodePtr cur = xmlnode->xmlChildrenNode; xmlNodePtr cur = xmlnode->xmlChildrenNode;
do { do {
reportxml_node_t *child; if (node->type == REPORTXML_NODE_TYPE_EXTENSION) {
if (reportxml_node_add_xml_child(node, cur) != 0) {
refobject_unref(node);
return NULL;
}
} else {
reportxml_node_t *child;
if (xmlIsBlankNode(cur)) if (xmlIsBlankNode(cur))
continue; continue;
if (cur->type == XML_COMMENT_NODE) if (cur->type == XML_COMMENT_NODE)
continue; continue;
if (cur->type == XML_TEXT_NODE) { if (cur->type == XML_TEXT_NODE) {
xmlChar *value = xmlNodeListGetString(xmlnode->doc, cur, 1); xmlChar *value = xmlNodeListGetString(xmlnode->doc, cur, 1);
if (!value) { if (!value) {
refobject_unref(node);
return NULL;
}
if (reportxml_node_set_content(node, (const char *)value) != 0) {
refobject_unref(node);
return NULL;
}
xmlFree(value);
continue;
}
child = reportxml_node_parse_xmlnode(cur);
if (!child) {
refobject_unref(node); refobject_unref(node);
return NULL; return NULL;
} }
if (reportxml_node_set_content(node, (const char *)value) != 0) { if (reportxml_node_add_child(node, child) != 0) {
refobject_unref(node); refobject_unref(node);
return NULL; return NULL;
} }
xmlFree(value);
continue;
}
child = reportxml_node_parse_xmlnode(cur);
if (!child) {
refobject_unref(node);
return NULL;
}
if (reportxml_node_add_child(node, child) != 0) {
refobject_unref(node);
return NULL;
} }
} while ((cur = cur->next)); } while ((cur = cur->next));
} }
@ -492,15 +506,20 @@ reportxml_node_t * reportxml_node_copy(reportxml_node_t *node)
xmlNodePtr reportxml_node_render_xmlnode(reportxml_node_t *node) xmlNodePtr reportxml_node_render_xmlnode(reportxml_node_t *node)
{ {
xmlNodePtr ret; xmlNodePtr ret;
ssize_t count; ssize_t child_count;
ssize_t xml_child_count;
size_t i; size_t i;
xmlChar *definition; xmlChar *definition;
if (!node) if (!node)
return NULL; return NULL;
count = reportxml_node_count_child(node); child_count = reportxml_node_count_child(node);
if (count < 0) if (child_count < 0)
return NULL;
xml_child_count = reportxml_node_count_xml_child(node);
if (xml_child_count < 0)
return NULL; return NULL;
ret = xmlCopyNode(node->xmlnode, 2); ret = xmlCopyNode(node->xmlnode, 2);
@ -514,7 +533,7 @@ xmlNodePtr reportxml_node_render_xmlnode(reportxml_node_t *node)
xmlFree(definition); xmlFree(definition);
} }
for (i = 0; i < (size_t)count; i++) { for (i = 0; i < (size_t)child_count; i++) {
reportxml_node_t *child = reportxml_node_get_child(node, i); reportxml_node_t *child = reportxml_node_get_child(node, i);
xmlNodePtr xmlchild; xmlNodePtr xmlchild;
@ -544,6 +563,18 @@ xmlNodePtr reportxml_node_render_xmlnode(reportxml_node_t *node)
xmlAddChild(ret, xmlchild); xmlAddChild(ret, xmlchild);
} }
for (i = 0; i < (size_t)xml_child_count; i++) {
xmlNodePtr xmlchild = reportxml_node_get_xml_child(node, i);
if (!xmlchild) {
xmlFreeNode(ret);
return NULL;
}
xmlAddChild(ret, xmlchild);
}
return ret; return ret;
} }
@ -731,6 +762,51 @@ char * reportxml_node_get_content(reportxml_node_t *node)
} }
} }
int reportxml_node_add_xml_child(reportxml_node_t *node, xmlNodePtr child)
{
xmlNodePtr *n;
if (!node || !child)
return -1;
n = realloc(node->xml_childs, sizeof(*n)*(node->xml_childs_len + 1));
if (!n)
return -1;
node->xml_childs = n;
node->xml_childs[node->xml_childs_len] = xmlCopyNode(child, 2);
if (node->xml_childs[node->xml_childs_len] == NULL)
return -1;
node->xml_childs_len++;
return 0;
}
ssize_t reportxml_node_count_xml_child(reportxml_node_t *node)
{
if (!node)
return -1;
return node->xml_childs_len;
}
xmlNodePtr reportxml_node_get_xml_child(reportxml_node_t *node, size_t idx)
{
xmlNodePtr ret;
if (!node)
return NULL;
if (idx >= node->xml_childs_len)
return NULL;
ret = xmlCopyNode(node->xml_childs[idx], 2);
return ret;
}
static void __database_free(refobject_t self, void **userdata) static void __database_free(refobject_t self, void **userdata)
{ {
reportxml_database_t *db = REFOBJECT_TO_TYPE(self, reportxml_database_t *); reportxml_database_t *db = REFOBJECT_TO_TYPE(self, reportxml_database_t *);

View File

@ -53,6 +53,9 @@ reportxml_node_t * reportxml_node_get_child(reportxml_node_t *node, size_t
reportxml_node_t * reportxml_node_get_child_by_attribute(reportxml_node_t *node, const char *key, const char *value, int include_definitions); reportxml_node_t * reportxml_node_get_child_by_attribute(reportxml_node_t *node, const char *key, const char *value, int include_definitions);
int reportxml_node_set_content(reportxml_node_t *node, const char *value); int reportxml_node_set_content(reportxml_node_t *node, const char *value);
char * reportxml_node_get_content(reportxml_node_t *node); char * reportxml_node_get_content(reportxml_node_t *node);
int reportxml_node_add_xml_child(reportxml_node_t *node, xmlNodePtr child);
ssize_t reportxml_node_count_xml_child(reportxml_node_t *node);
xmlNodePtr reportxml_node_get_xml_child(reportxml_node_t *node, size_t idx);
reportxml_database_t * reportxml_database_new(void); reportxml_database_t * reportxml_database_new(void);
int reportxml_database_add_report(reportxml_database_t *db, reportxml_t *report); int reportxml_database_add_report(reportxml_database_t *db, reportxml_t *report);