[vlc-devel] [RFC] vlc_xml: add copy node function
Rémi Denis-Courmont
remi at remlab.net
Thu Feb 23 23:08:39 CET 2017
Le torstaina 23. helmikuuta 2017, 11.39.21 EET Nicolas Bertrand a écrit :
> Add a copy node function to the XML parser.
> Will be used to send in, XML format, parts of subs XML files from demux to
> codec.
Well, switching away from streaming model look nice from programming point of
view. But it will cause problems unless you ensure that a given part data is
reasonably small.
> The goal is to limit the use of libxml2 function in module/misc/xml/libxml.c
>
>
> ---
> include/vlc_xml.h | 7 +++++++
> modules/misc/xml/libxml.c | 40 ++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 47 insertions(+)
>
> diff --git a/include/vlc_xml.h b/include/vlc_xml.h
> index 661e76d..fd14ab6 100644
> --- a/include/vlc_xml.h
> +++ b/include/vlc_xml.h
> @@ -75,6 +75,7 @@ struct xml_reader_t
>
> int (*pf_use_dtd) ( xml_reader_t * );
> int (*pf_is_empty) ( xml_reader_t * );
> + int (*pf_copy_node) ( xml_reader_t *, const char **);
If there is only one error case (or no need to distinguish errors), then you
are better off returning a char * directly.
And something looks fishy here. How can the result be constant? What´s the
life cycle?
> };
>
> VLC_API xml_reader_t * xml_ReaderCreate(vlc_object_t *, stream_t *)
> VLC_USED; @@ -106,6 +107,12 @@ static inline int xml_ReaderIsEmptyElement(
> xml_reader_t *reader ) return reader->pf_is_empty( reader );
> }
>
> +static inline int xml_ReaderCopyNode( xml_reader_t *reader,
> + const char ** psz_text)
> +{
> + return reader->pf_copy_node( reader, psz_text);
> +}
> +
> enum {
> XML_READER_ERROR=-1,
> XML_READER_NONE=0,
> diff --git a/modules/misc/xml/libxml.c b/modules/misc/xml/libxml.c
> index 059c269..5487ab4 100644
> --- a/modules/misc/xml/libxml.c
> +++ b/modules/misc/xml/libxml.c
> @@ -34,6 +34,7 @@
>
> #include <libxml/xmlreader.h>
> #include <libxml/catalog.h>
> +#include <libxml/parser.h>
>
> /**************************************************************************
> *** * Module descriptor
> @@ -65,6 +66,7 @@ static const char *ReaderNextAttr( xml_reader_t *, const
> char ** ); static int ReaderIsEmptyElement( xml_reader_t *);
>
> static int ReaderUseDTD ( xml_reader_t * );
> +static int ReaderCopyNode( xml_reader_t *, const char ** );
>
> static void CatalogLoad( xml_t *, const char * );
> static void CatalogAdd( xml_t *, const char *, const char *, const char *
> ); @@ -178,6 +180,7 @@ static int ReaderOpen( vlc_object_t *p_this )
> p_reader->pf_next_attr = ReaderNextAttr;
> p_reader->pf_is_empty = ReaderIsEmptyElement;
> p_reader->pf_use_dtd = ReaderUseDTD;
> + p_reader->pf_copy_node = ReaderCopyNode;
>
> return VLC_SUCCESS;
> }
> @@ -294,3 +297,40 @@ static int ReaderIsEmptyElement( xml_reader_t *p_reader
> ) {
> return xmlTextReaderIsEmptyElement( p_reader->p_sys->xml );
> }
> +
> +static int ReaderCopyNode(xml_reader_t *p_reader, const char **psz_text)
> +{
> + xmlDocPtr doc;
> + xmlNode *p_cur_node = NULL;
> + xmlNode *p_copy_node = NULL;
> + xmlNode *p_root_node = NULL;
> + xmlChar *xmlbuff;
> + int xmlbuffsize;
> + const char *p_text;
> +
> + xmlTextReaderPtr xml = p_reader->p_sys->xml;
> +
> + p_cur_node = xmlTextReaderExpand(xml);
> + if (!p_cur_node)
> + return VLC_EGENERIC;
> +
> + p_copy_node = xmlCopyNode(p_cur_node,1);
> + if (!p_copy_node)
> + return VLC_EGENERIC;
> +
> + /* create new XML doc */
> + doc = xmlNewDoc(BAD_CAST "1.0");
> + p_root_node = xmlDocSetRootElement(doc, p_copy_node);
> + if (p_root_node)
> + /* No previous root node */
> + return VLC_EGENERIC;
> +
> + xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &xmlbuffsize, "UTF-8", 0);
> +
> + if( psz_text != NULL )
> + *psz_text = strdup( (char *) xmlbuff);
> +
> + xmlFree(xmlbuff);
> + xmlFreeDoc(doc);
> + return VLC_SUCCESS;
> +}
--
雷米‧德尼-库尔蒙
https://www.remlab.net/
More information about the vlc-devel
mailing list