GF_EXPORT void gf_xml_dom_node_del(GF_XMLNode *node) { if (node->attributes) { while (gf_list_count(node->attributes)) { GF_XMLAttribute *att = (GF_XMLAttribute *)gf_list_last(node->attributes); gf_list_rem_last(node->attributes); if (att->name) gf_free(att->name); if (att->value) gf_free(att->value); gf_free(att); } gf_list_del(node->attributes); } if (node->content) { while (gf_list_count(node->content)) { GF_XMLNode *child = (GF_XMLNode *)gf_list_last(node->content); gf_list_rem_last(node->content); gf_xml_dom_node_del(child); } gf_list_del(node->content); } if (node->ns) gf_free(node->ns); if (node->name) gf_free(node->name); gf_free(node); }
static void gf_xml_dom_reset(GF_DOMParser *dom, Bool full_reset) { if (full_reset && dom->parser) { gf_xml_sax_del(dom->parser); dom->parser = NULL; } if (dom->stack) { while (gf_list_count(dom->stack)) { GF_XMLNode *n = (GF_XMLNode *)gf_list_last(dom->stack); gf_list_rem_last(dom->stack); if (dom->root==n) dom->root = NULL; gf_xml_dom_node_del(n); } gf_list_del(dom->stack); dom->stack = NULL; } if (full_reset && dom->root) { gf_xml_dom_node_del(dom->root); dom->root = NULL; } }
static void on_dom_node_end(void *cbk, const char *name, const char *ns) { GF_DOMParser *par = (GF_DOMParser *)cbk; GF_XMLNode *last = (GF_XMLNode *)gf_list_last(par->stack); gf_list_rem_last(par->stack); if (!last || strcmp(last->name, name) || (!ns && last->ns) || (ns && !last->ns) || (ns && strcmp(last->ns, ns) ) ) { par->parser->suspended = 1; gf_xml_dom_node_del(last); if (last==par->root) par->root=NULL; return; } if (last != par->root) { GF_XMLNode *node = (GF_XMLNode *)gf_list_last(par->stack); assert(node->content); assert(gf_list_find(node->content, last) == -1); gf_list_add(node->content, last); } }
static void on_dom_node_end(void *cbk, const char *name, const char *ns) { GF_DOMParser *par = (GF_DOMParser *)cbk; GF_XMLNode *last = (GF_XMLNode *)gf_list_last(par->stack); gf_list_rem_last(par->stack); if (!last || strcmp(last->name, name) || (!ns && last->ns) || (ns && !last->ns) || (ns && strcmp(last->ns, ns) ) ) { format_sax_error(par->parser, 0, "Invalid node stack: closing node is %s but %s was expected", name, last->name); par->parser->suspended = 1; gf_xml_dom_node_del(last); if (last==par->root) par->root=NULL; return; } if (last != par->root) { GF_XMLNode *node = (GF_XMLNode *)gf_list_last(par->stack); assert(node->content); assert(gf_list_find(node->content, last) == -1); gf_list_add(node->content, last); } }
static Bool validator_xvs_open(GF_Validator *validator) { GF_Err e; GF_LOG(GF_LOG_DEBUG, GF_LOG_MODULE, ("[Validator] Opening Validation Script: %s\n", validator->xvs_filename)); validator->snapshot_number = 0; validator->xvs_parser = gf_xml_dom_new(); e = gf_xml_dom_parse(validator->xvs_parser, validator->xvs_filename, NULL, NULL); if (e != GF_OK) { if (validator->is_recording) { GF_SAFEALLOC(validator->xvs_node, GF_XMLNode); validator->xvs_node->name = gf_strdup("TestValidationScript"); validator->xvs_node->attributes = gf_list_new(); validator->xvs_node->content = gf_list_new(); } else { gf_xml_dom_del(validator->xvs_parser); validator->xvs_parser = NULL; return 0; } } else { validator->xvs_node = gf_xml_dom_get_root(validator->xvs_parser); } /* Get the file name from the XVS if not found in the XVL */ if (!validator->test_filename) { GF_XMLAttribute *att; GF_XMLAttribute *att_file; u32 att_index = 0; att_file = NULL; while (1) { att = gf_list_get(validator->xvs_node->attributes, att_index); if (!att) { break; } else if (!strcmp(att->name, "file")) { att_file = att; } att_index++; } if (!att_file) { gf_xml_dom_del(validator->xvs_parser); validator->xvs_parser = NULL; validator->xvs_node = NULL; return 0; } else { char *sep; sep = strrchr(att_file->value, GF_PATH_SEPARATOR); if (!sep) { validator->test_filename = att_file->value; } else { sep[0] = 0; validator->test_base = gf_strdup(att_file->value); sep[0] = GF_PATH_SEPARATOR; validator->test_filename = sep+1; } } } if (validator->is_recording) { GF_XMLNode *node; /* Removing prerecorded interactions */ while (gf_list_count(validator->xvs_node->content)) { GF_XMLNode *child = (GF_XMLNode *)gf_list_last(validator->xvs_node->content); gf_list_rem_last(validator->xvs_node->content); gf_xml_dom_node_del(child); } /* adding an extra text node for line break in serialization */ GF_SAFEALLOC(node, GF_XMLNode); node->type = GF_XML_TEXT_TYPE; node->name = gf_strdup("\n"); gf_list_add(validator->xvs_node->content, node); } else { validator->xvs_result = 1; } return 1; }