/* * GPAC - Multimedia Framework C SDK * * Authors: Jean Le Feuvre * Copyright (c) Telecom ParisTech 2000-2012 * All rights reserved * * This file is part of GPAC / common tools sub-project * * GPAC is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GPAC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */ #ifndef _XML_PARSER_H_ #define _XML_PARSER_H_ #ifdef __cplusplus extern "C" { #endif #include <gpac/tools.h> #include <gpac/list.h> #ifndef GPAC_DISABLE_CORE_TOOLS /*! * \file <gpac/xml.h> * \brief XML functions. */ /*! * \addtogroup xml_grp XML * \ingroup utils_grp * \brief XML Parsing functions * *This section documents the XML functions of the GPAC framework. * @{ */ typedef struct { /*name or namespace:name*/ char *name; /*value*/ char *value; } GF_XMLAttribute; /*XML node types*/ enum { GF_XML_NODE_TYPE = 0, GF_XML_TEXT_TYPE, GF_XML_CDATA_TYPE, }; typedef struct _xml_node { u32 type; /* For DOM nodes: name For other (text, css, cdata), element content */ char *name; /*for DOM nodes only*/ char *ns; /*namespace*/ GF_List *attributes; GF_List *content; } GF_XMLNode; /* SAX XML Parser */ typedef struct _tag_sax_parser GF_SAXParser; typedef void (*gf_xml_sax_node_start)(void *sax_cbck, const char *node_name, const char *name_space, const GF_XMLAttribute *attributes, u32 nb_attributes); typedef void (*gf_xml_sax_node_end)(void *sax_cbck, const char *node_name, const char *name_space); typedef void (*gf_xml_sax_text_content)(void *sax_cbck, const char *content, Bool is_cdata); typedef void (*gf_xml_sax_progress)(void *cbck, u64 done, u64 tot); /*creates new sax parser - all callbacks are optionals*/ GF_SAXParser *gf_xml_sax_new(gf_xml_sax_node_start on_node_start, gf_xml_sax_node_end on_node_end, gf_xml_sax_text_content on_text_content, void *cbck); /*destroys sax parser */ void gf_xml_sax_del(GF_SAXParser *parser); /*inits parser with BOM. BOM must be 4 char string with 0 terminaison. If BOM is NULL, parsing will assume UTF-8 compatible coding*/ GF_Err gf_xml_sax_init(GF_SAXParser *parser, unsigned char *BOM); /*parses input string data. string data MUST be terminated by the 0 character (eg 2 0s for UTF-16)*/ GF_Err gf_xml_sax_parse(GF_SAXParser *parser, const void *string_bytes); /*suspends/resume sax parsing. When resuming on file, the function will run until suspended/end of file/error When resuming on steram, the function will simply return */ GF_Err gf_xml_sax_suspend(GF_SAXParser *parser, Bool do_suspend); /*parses file (potentially gzipped). OnProgress is optional, used to get progress callback*/ GF_Err gf_xml_sax_parse_file(GF_SAXParser *parser, const char *fileName, gf_xml_sax_progress OnProgress); /*get current line number*/ u32 gf_xml_sax_get_line(GF_SAXParser *parser); /*get file size - may be inaccurate if gzipped (only compressed file size is known)*/ u32 gf_xml_sax_get_file_size(GF_SAXParser *parser); /*get current file position*/ u32 gf_xml_sax_get_file_pos(GF_SAXParser *parser); /*peeks a node forward in the file. May be used to pick the attribute of the first node found matching a given (attributeName, attributeValue) couple*/ char *gf_xml_sax_peek_node(GF_SAXParser *parser, char *att_name, char *att_value, char *substitute, char *get_attr, char *end_pattern, Bool *is_substitute); /*file mode only, returns 1 if file is compressed, 0 otherwise*/ Bool gf_xml_sax_binary_file(GF_SAXParser *parser); const char *gf_xml_sax_get_error(GF_SAXParser *parser); char *gf_xml_get_root_type(const char *file, GF_Err *ret_code); u32 gf_xml_sax_get_node_start_pos(GF_SAXParser *parser); u32 gf_xml_sax_get_node_end_pos(GF_SAXParser *parser); typedef struct _tag_dom_parser GF_DOMParser; GF_DOMParser *gf_xml_dom_new(); void gf_xml_dom_del(GF_DOMParser *parser); GF_Err gf_xml_dom_parse(GF_DOMParser *parser, const char *file, gf_xml_sax_progress OnProgress, void *cbk); GF_Err gf_xml_dom_parse_string(GF_DOMParser *dom, char *string); const char *gf_xml_dom_get_error(GF_DOMParser *parser); u32 gf_xml_dom_get_line(GF_DOMParser *parser); u32 gf_xml_dom_get_root_nodes_count(GF_DOMParser *parser); GF_XMLNode *gf_xml_dom_get_root_idx(GF_DOMParser *parser, u32 idx); /* *\brief Serialize a node * * Flush a node in a char * *\param node the node to flush *\param content_only Whether to include or not the parent node *\return The resulting serialization */ char *gf_xml_dom_serialize(GF_XMLNode *node, Bool content_only); /* *\brief Create the root element of the DOM * * Create the root element -- the only top level element -- of the document. * *\param parser the DOM structure *\return The created node if creation occurs properly, otherwise NULL; */ GF_XMLNode *gf_xml_dom_create_root(GF_DOMParser *parser, const char* name); /* *\brief Get the root element of the DOM * * Get the root element -- the only top level element -- of the document. * *\param parser the DOM structure *\return The corresponding node if exists, otherwise NULL; */ GF_XMLNode *gf_xml_dom_get_root(GF_DOMParser *parser); /* *\brief Return and detach the root element of the DOM * * Return and detach the root element of the DOM * *\param parser the DOM structure *\return The corresponding node if exists, otherwise NULL; */ GF_XMLNode *gf_xml_dom_detach_root(GF_DOMParser *parser); /* *\brief Sets an attribute value for this element. * * Sets an attribute value for this element * *\param node the GF_XMLNode node *\param name the name of the attribute *\param value the value of the attribute *\return The created attribute if setting occurs properly, otherwise NULL; */ GF_XMLAttribute *gf_xml_dom_set_attribute(GF_XMLNode *node, const char* name, const char* value); /* *\brief Gets the attribute for this element with the given name. * * Gets the attribute for this element with the given name. * *\param node the GF_XMLNode node *\param name the attribute name *\return The corresponding attribute if exists, otherwise NULL; */ GF_XMLAttribute *gf_xml_dom_get_attribute(GF_XMLNode *node, const char* name); /* *\brief Adds the node to the end of the list of children of this node. * * Adds the node to the end of the list of children of this node. * *\param node the GF_XMLNode node *\param child the GF_XMLNode child to append *\return GF_OK if append occurs properly, otherwise a GF_Err */ GF_Err gf_xml_dom_append_child(GF_XMLNode *node, GF_XMLNode *child); /* *\brief Removes the node to the list of children of this node. * * Removes the node to the list of children of this node. * Doesn't free the memory of the removed children. * *\param node the GF_XMLNode node *\param child the GF_XMLNode child to remove *\return GF_OK if removal occurs properly, otherwise a GF_Err */ GF_Err gf_xml_dom_rem_child(GF_XMLNode *node, GF_XMLNode *child); /* *\brief Node constructor. * * Creates a node with the given name and namespace URI. * *\param ns the node namespace *\param name the name namespace *\return The created GF_XMLNode if creation occurs properly, otherwise NULL; */ GF_XMLNode* gf_xml_dom_node_new(const char* ns, const char* name); /* *\brief Node destructor. * * Free a node, its attributes and its childs. * *\param node the node to free */ void gf_xml_dom_node_del(GF_XMLNode *node); /* *\brief bitsequence parser. * * inspects all child elements of the node and converts <BS> children into bits. BS take the following attributes:. *bits: value gives the number of bits used to code a value or a length *value: value is a 32 bit signed value *dataOffset: value gives an offset into a file *dataLength: value gives the number of bits bytes to copy in a file *dataFile: value gives the name of the source file *textmode: indicates whether the file shall be opened in text or binary mode before reading *text: or string: value gives a string (length is first coded on number of bits in bits attribute) *fcc: value gives a four character code, coded on 32 bits *ID128: value gives a 128 bit vlue in hexadecimal *data64: value gives data coded as base64 *data: value gives data coded in hexa * * * *\param node the root node of the bitstream to create *\param out_data pointer to output buffer allocated by the function to store the result *\param out_data_size pointer to output buffer size allocated by the function to store the result *\return error code or GF_OK */ GF_Err gf_xml_parse_bit_sequence(GF_XMLNode *bsroot, char **out_data, u32 *out_data_size); /* *\brief get the element and check that the namespace is known ('xmlns'-only supported for now) *\param n the node to process *\param expected_node_name optional expected name for node n *\param expected_ns_prefix optional expected namespace prefix for node n *\return error code or GF_OK */ GF_Err gf_xml_get_element_check_namespace(const GF_XMLNode *n, const char *expected_node_name, const char *expected_ns_prefix); /*! @} */ #ifdef __cplusplus } #endif #endif /*GPAC_DISABLE_CORE_TOOLS*/ #endif /*_XML_PARSER_H_*/