mirror of https://code.videolan.org/videolan/vlc
vlc_xml: change API to handle namespaces
Prefixes and namespaces are required to be able to correctly parse multiple namespaces documents or simply prefixed documents
This commit is contained in:
parent
3d1ac63351
commit
37eb94ecf7
|
@ -70,8 +70,8 @@ struct xml_reader_t
|
||||||
stream_t *p_stream;
|
stream_t *p_stream;
|
||||||
module_t *p_module;
|
module_t *p_module;
|
||||||
|
|
||||||
int (*pf_next_node) ( xml_reader_t *, const char ** );
|
int (*pf_next_node) ( xml_reader_t *, const char **, const char ** );
|
||||||
const char *(*pf_next_attr) ( xml_reader_t *, const char ** );
|
const char *(*pf_next_attr) ( xml_reader_t *, const char **, const char ** );
|
||||||
|
|
||||||
int (*pf_use_dtd) ( xml_reader_t * );
|
int (*pf_use_dtd) ( xml_reader_t * );
|
||||||
int (*pf_is_empty) ( xml_reader_t * );
|
int (*pf_is_empty) ( xml_reader_t * );
|
||||||
|
@ -83,13 +83,27 @@ VLC_API void xml_ReaderDelete(xml_reader_t *);
|
||||||
|
|
||||||
static inline int xml_ReaderNextNode( xml_reader_t *reader, const char **pval )
|
static inline int xml_ReaderNextNode( xml_reader_t *reader, const char **pval )
|
||||||
{
|
{
|
||||||
return reader->pf_next_node( reader, pval );
|
return reader->pf_next_node( reader, pval, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int xml_ReaderNextNodeNS( xml_reader_t *reader,
|
||||||
|
const char **pval,
|
||||||
|
const char **pnamespace )
|
||||||
|
{
|
||||||
|
return reader->pf_next_node( reader, pval, pnamespace );
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline const char *xml_ReaderNextAttr( xml_reader_t *reader,
|
static inline const char *xml_ReaderNextAttr( xml_reader_t *reader,
|
||||||
const char **pval )
|
const char **pval )
|
||||||
{
|
{
|
||||||
return reader->pf_next_attr( reader, pval );
|
return reader->pf_next_attr( reader, pval, NULL );
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const char *xml_ReaderNextAttrNS( xml_reader_t *reader,
|
||||||
|
const char **pval,
|
||||||
|
const char **pnamespace )
|
||||||
|
{
|
||||||
|
return reader->pf_next_attr( reader, pval, pnamespace );
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int xml_ReaderUseDTD( xml_reader_t *reader )
|
static inline int xml_ReaderUseDTD( xml_reader_t *reader )
|
||||||
|
|
|
@ -117,6 +117,7 @@ typedef struct
|
||||||
{
|
{
|
||||||
xmlTextReaderPtr xml;
|
xmlTextReaderPtr xml;
|
||||||
char *node;
|
char *node;
|
||||||
|
char *namespace;
|
||||||
} xml_reader_sys_t;
|
} xml_reader_sys_t;
|
||||||
|
|
||||||
static int ReaderUseDTD ( xml_reader_t *p_reader )
|
static int ReaderUseDTD ( xml_reader_t *p_reader )
|
||||||
|
@ -131,16 +132,19 @@ static int ReaderUseDTD ( xml_reader_t *p_reader )
|
||||||
return VLC_SUCCESS;
|
return VLC_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ReaderNextNode( xml_reader_t *p_reader, const char **pval )
|
static int ReaderNextNode( xml_reader_t *p_reader, const char **pval,
|
||||||
|
const char **pnamespace )
|
||||||
{
|
{
|
||||||
xml_reader_sys_t *p_sys = p_reader->p_sys;
|
xml_reader_sys_t *p_sys = p_reader->p_sys;
|
||||||
const xmlChar *node;
|
const xmlChar *node, *namespace = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
skip:
|
||||||
free( p_sys->node );
|
free( p_sys->node );
|
||||||
|
free( p_sys->namespace );
|
||||||
p_sys->node = NULL;
|
p_sys->node = NULL;
|
||||||
|
p_sys->namespace = NULL;
|
||||||
|
|
||||||
skip:
|
|
||||||
switch( xmlTextReaderRead( p_sys->xml ) )
|
switch( xmlTextReaderRead( p_sys->xml ) )
|
||||||
{
|
{
|
||||||
case 0: /* EOF */
|
case 0: /* EOF */
|
||||||
|
@ -153,11 +157,13 @@ skip:
|
||||||
{
|
{
|
||||||
case XML_READER_TYPE_ELEMENT:
|
case XML_READER_TYPE_ELEMENT:
|
||||||
node = xmlTextReaderConstName( p_sys->xml );
|
node = xmlTextReaderConstName( p_sys->xml );
|
||||||
|
namespace = xmlTextReaderConstNamespaceUri( p_sys->xml );
|
||||||
ret = XML_READER_STARTELEM;
|
ret = XML_READER_STARTELEM;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XML_READER_TYPE_END_ELEMENT:
|
case XML_READER_TYPE_END_ELEMENT:
|
||||||
node = xmlTextReaderConstName( p_sys->xml );
|
node = xmlTextReaderConstName( p_sys->xml );
|
||||||
|
namespace = xmlTextReaderConstNamespaceUri( p_sys->xml );
|
||||||
ret = XML_READER_ENDELEM;
|
ret = XML_READER_ENDELEM;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -177,13 +183,18 @@ skip:
|
||||||
if( unlikely(node == NULL) )
|
if( unlikely(node == NULL) )
|
||||||
return XML_READER_ERROR;
|
return XML_READER_ERROR;
|
||||||
|
|
||||||
p_sys->node = strdup( (const char *)node );
|
p_sys->node = strdup( (const char *) node );
|
||||||
|
if( namespace )
|
||||||
|
p_sys->namespace = strdup( (const char *) namespace );
|
||||||
if( pval != NULL )
|
if( pval != NULL )
|
||||||
*pval = p_sys->node;
|
*pval = p_sys->node;
|
||||||
|
if( pnamespace != NULL )
|
||||||
|
*pnamespace = p_sys->namespace;
|
||||||
return likely(p_sys->node != NULL) ? ret : XML_READER_ERROR;
|
return likely(p_sys->node != NULL) ? ret : XML_READER_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *ReaderNextAttr( xml_reader_t *p_reader, const char **pval )
|
static const char *ReaderNextAttr( xml_reader_t *p_reader, const char **pval,
|
||||||
|
const char **pnamespace )
|
||||||
{
|
{
|
||||||
xml_reader_sys_t *p_sys = p_reader->p_sys;
|
xml_reader_sys_t *p_sys = p_reader->p_sys;
|
||||||
xmlTextReaderPtr xml = p_sys->xml;
|
xmlTextReaderPtr xml = p_sys->xml;
|
||||||
|
@ -194,8 +205,11 @@ static const char *ReaderNextAttr( xml_reader_t *p_reader, const char **pval )
|
||||||
|| (value = xmlTextReaderConstValue( xml )) == NULL )
|
|| (value = xmlTextReaderConstValue( xml )) == NULL )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if( pnamespace )
|
||||||
|
*pnamespace = (const char *) xmlTextReaderConstNamespaceUri( xml );
|
||||||
|
|
||||||
*pval = (const char *)value;
|
*pval = (const char *)value;
|
||||||
return (const char *)name;
|
return (const char *) name;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int StreamRead( void *p_context, char *p_buffer, int i_buffer )
|
static int StreamRead( void *p_context, char *p_buffer, int i_buffer )
|
||||||
|
@ -244,6 +258,7 @@ static int ReaderOpen( vlc_object_t *p_this )
|
||||||
|
|
||||||
p_sys->xml = p_libxml_reader;
|
p_sys->xml = p_libxml_reader;
|
||||||
p_sys->node = NULL;
|
p_sys->node = NULL;
|
||||||
|
p_sys->namespace = NULL;
|
||||||
p_reader->p_sys = p_sys;
|
p_reader->p_sys = p_sys;
|
||||||
p_reader->pf_next_node = ReaderNextNode;
|
p_reader->pf_next_node = ReaderNextNode;
|
||||||
p_reader->pf_next_attr = ReaderNextAttr;
|
p_reader->pf_next_attr = ReaderNextAttr;
|
||||||
|
@ -260,6 +275,7 @@ static void ReaderClose( vlc_object_t *p_this )
|
||||||
|
|
||||||
xmlFreeTextReader( p_sys->xml );
|
xmlFreeTextReader( p_sys->xml );
|
||||||
free( p_sys->node );
|
free( p_sys->node );
|
||||||
|
free( p_sys->namespace );
|
||||||
free( p_sys );
|
free( p_sys );
|
||||||
|
|
||||||
/* /!\
|
/* /!\
|
||||||
|
|
Loading…
Reference in New Issue