1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2024-11-03 04:17:17 -05:00

Feature: Added reportxml_database_build_fragment()

This commit is contained in:
Philipp Schafft 2020-10-14 10:45:00 +00:00
parent 0fb71d4b98
commit 2af9830c92
2 changed files with 66 additions and 0 deletions

View File

@ -1420,3 +1420,67 @@ reportxml_t * reportxml_database_build_report(reportxml_database_t *db
return ret; return ret;
} }
reportxml_node_t * reportxml_database_build_fragment(reportxml_database_t *db, const char *id, ssize_t depth, reportxml_node_type_t type)
{
reportxml_node_t *definition;
reportxml_node_t *ret;
reportxml_node_type_t got;
ssize_t count;
size_t i;
if (!db || !id)
return NULL;
/* first find the definition itself. This will be some REPORTXML_NODE_TYPE_DEFINITION node. */
definition = __reportxml_database_build_node_ext(db, id, depth, &got);
if (!definition) {
ICECAST_LOG_WARN("No matching definition for \"%H\"", id);
return NULL;
}
/* Let's see how many children we have. */
count = reportxml_node_count_child(definition);
if (count < 0) {
refobject_unref(definition);
ICECAST_LOG_ERROR("Can not get child count from definition. BAD.");
return NULL;
} else if (count == 0) {
/* Empty definition? Not exactly an exciting report... */
ICECAST_LOG_WARN("Empty definition for \"%H\". Returning empty node. This is likely an error.", id);
refobject_unref(definition);
return reportxml_node_new(type, NULL, id, NULL);
} else if (count == 1 && got == type) {
ret = reportxml_node_get_child(definition, 0);
refobject_unref(definition);
return ret;
} else if (got == type) {
refobject_unref(definition);
ICECAST_LOG_ERROR("Definition lists multiple childs of target type. BAD.");
return NULL;
}
ret = reportxml_node_new(type, NULL, NULL, NULL);
if (!ret) {
refobject_unref(definition);
ICECAST_LOG_ERROR("Can not allocate new node. BAD.");
return NULL;
}
for (i = 0; i < (size_t)count; i++) {
reportxml_node_t *child = reportxml_node_get_child(definition, i);
/* we can directly attach as it's a already a copy. */
if (reportxml_node_add_child(ret, child) != 0) {
refobject_unref(definition);
refobject_unref(ret);
ICECAST_LOG_ERROR("Can not attach child #%zu (%p) to attachment point (%p). BAD.", i, child, ret);
return NULL;
}
refobject_unref(child);
}
refobject_unref(definition);
return ret;
}

View File

@ -143,5 +143,7 @@ int reportxml_database_add_report(reportxml_database_t *db,
reportxml_node_t * reportxml_database_build_node(reportxml_database_t *db, const char *id, ssize_t depth); reportxml_node_t * reportxml_database_build_node(reportxml_database_t *db, const char *id, ssize_t depth);
/* This does the same as reportxml_database_build_node() except that a new report document is returned. */ /* This does the same as reportxml_database_build_node() except that a new report document is returned. */
reportxml_t * reportxml_database_build_report(reportxml_database_t *db, const char *id, ssize_t depth); reportxml_t * reportxml_database_build_report(reportxml_database_t *db, const char *id, ssize_t depth);
/* This does the same reportxml_database_add_report() but does not return a node of a given type compiled from the definition. */
reportxml_node_t * reportxml_database_build_fragment(reportxml_database_t *db, const char *id, ssize_t depth, reportxml_node_type_t type);
#endif #endif