From 70f70fd0a78c63a4d9f030e4c897aea559f7c34b Mon Sep 17 00:00:00 2001 From: Sigmund Augdal Helberg Date: Fri, 1 Apr 2005 22:39:10 +0000 Subject: [PATCH] all: ported xml parsers to stream_t --- include/vlc_xml.h | 2 +- modules/gui/skins2/parser/xmlparser.cpp | 14 +++++++++++-- modules/gui/skins2/parser/xmlparser.hpp | 3 +++ modules/misc/xml/libxml.c | 19 ++++++++++++++---- modules/misc/xml/xtag.c | 26 +++++++++---------------- 5 files changed, 40 insertions(+), 24 deletions(-) diff --git a/include/vlc_xml.h b/include/vlc_xml.h index daa770e710..abcde2a5af 100644 --- a/include/vlc_xml.h +++ b/include/vlc_xml.h @@ -36,7 +36,7 @@ struct xml_t module_t *p_module; xml_sys_t *p_sys; - xml_reader_t * (*pf_reader_create) ( xml_t *, const char * ); + xml_reader_t * (*pf_reader_create) ( xml_t *, stream_t * ); void (*pf_reader_delete) ( xml_reader_t * ); void (*pf_catalog_load) ( xml_t *, const char * ); diff --git a/modules/gui/skins2/parser/xmlparser.cpp b/modules/gui/skins2/parser/xmlparser.cpp index 1d9734116d..3cdd832af9 100644 --- a/modules/gui/skins2/parser/xmlparser.cpp +++ b/modules/gui/skins2/parser/xmlparser.cpp @@ -32,11 +32,13 @@ static bool m_initialized = false; XMLParser::XMLParser( intf_thread_t *pIntf, const string &rFileName ): SkinObject( pIntf ) { + m_pReader = NULL; + m_pStream = NULL; + m_pXML = xml_Create( pIntf ); if( !m_pXML ) { msg_Err( getIntf(), "Failed to open XML parser" ); - m_pReader = NULL; return; } @@ -47,7 +49,14 @@ XMLParser::XMLParser( intf_thread_t *pIntf, const string &rFileName ): m_initialized = true; } - m_pReader = xml_ReaderCreate( m_pXML, rFileName.c_str() ); + m_pStream = stream_UrlNew( pIntf, rFileName.c_str() ); + if( !m_pStream ) + { + msg_Err( getIntf(), "Failed to open %s for reading", + rFileName.c_str() ); + return; + } + m_pReader = xml_ReaderCreate( m_pXML, m_pStream ); if( !m_pReader ) { msg_Err( getIntf(), "Failed to open %s for parsing", @@ -61,6 +70,7 @@ XMLParser::~XMLParser() { if( m_pReader && m_pXML ) xml_ReaderDelete( m_pXML, m_pReader ); if( m_pXML ) xml_Delete( m_pXML ); + if( m_pStream ) stream_Delete( m_pStream ); } diff --git a/modules/gui/skins2/parser/xmlparser.hpp b/modules/gui/skins2/parser/xmlparser.hpp index a4c3f11de0..a6f3fa6d71 100644 --- a/modules/gui/skins2/parser/xmlparser.hpp +++ b/modules/gui/skins2/parser/xmlparser.hpp @@ -25,6 +25,8 @@ #define XMLPARSER_HPP #include "../src/skin_common.hpp" +#include "vlc_block.h" +#include "vlc_stream.h" #include "vlc_xml.h" #include @@ -67,6 +69,7 @@ class XMLParser: public SkinObject /// Reader context xml_t *m_pXML; xml_reader_t *m_pReader; + stream_t *m_pStream; }; #endif diff --git a/modules/misc/xml/libxml.c b/modules/misc/xml/libxml.c index 13243c5b7d..9fc4913c32 100644 --- a/modules/misc/xml/libxml.c +++ b/modules/misc/xml/libxml.c @@ -49,7 +49,7 @@ struct xml_reader_sys_t xmlTextReaderPtr p_reader; }; -static xml_reader_t *ReaderCreate( xml_t *, const char * ); +static xml_reader_t *ReaderCreate( xml_t *, stream_t * ); static void ReaderDelete( xml_reader_t * ); static int ReaderRead( xml_reader_t * ); static int ReaderNodeType( xml_reader_t * ); @@ -59,6 +59,7 @@ static int ReaderNextAttr( xml_reader_t * ); static void CatalogLoad( xml_t *, const char * ); static void CatalogAdd( xml_t *, const char *, const char *, const char * ); +static int StreamRead( void *p_context, char *p_buffer, int i_buffer ); /***************************************************************************** * Module initialization @@ -111,16 +112,20 @@ static void ReaderErrorHandler( void *p_arg, const char *p_msg, msg_Err( p_reader->p_xml, "XML parser error (line %d) : %s", line, p_msg ); } -static xml_reader_t *ReaderCreate( xml_t *p_xml, const char *psz_filename ) +static xml_reader_t *ReaderCreate( xml_t *p_xml, stream_t *p_stream ) { xml_reader_t *p_reader; xml_reader_sys_t *p_sys; xmlTextReaderPtr p_libxml_reader; + xmlParserInputBufferPtr p_read_context; - p_libxml_reader = xmlNewTextReaderFilename( psz_filename ); + p_read_context = malloc( sizeof( xmlParserInputBuffer ) ); + + p_libxml_reader = xmlReaderForIO( StreamRead, NULL, p_stream, + NULL, NULL, 0 ); if( !p_libxml_reader ) { - msg_Err( p_xml, "failed to open file %s for parsing", psz_filename ); + msg_Err( p_xml, "failed to create xml parser" ); return 0; } @@ -214,3 +219,9 @@ static int ReaderNextAttr( xml_reader_t *p_reader ) return ( xmlTextReaderMoveToNextAttribute( p_reader->p_sys->p_reader ) == 1 ) ? VLC_SUCCESS : VLC_EGENERIC; } + +static int StreamRead( void *p_context, char *p_buffer, int i_buffer ) +{ + stream_t *s = (stream_t*)p_context; + return stream_Read( s, p_buffer, i_buffer ); +} diff --git a/modules/misc/xml/xtag.c b/modules/misc/xml/xtag.c index e7a8b7b5ae..dad8b198d9 100644 --- a/modules/misc/xml/xtag.c +++ b/modules/misc/xml/xtag.c @@ -30,6 +30,8 @@ #include #include "vlc_xml.h" +#include "vlc_block.h" +#include "vlc_stream.h" #include #include @@ -98,7 +100,7 @@ struct xml_reader_sys_t vlc_bool_t b_endtag; }; -static xml_reader_t *ReaderCreate( xml_t *, const char * ); +static xml_reader_t *ReaderCreate( xml_t *, stream_t * ); static void ReaderDelete( xml_reader_t * ); static int ReaderRead( xml_reader_t * ); static int ReaderNodeType( xml_reader_t * ); @@ -158,34 +160,24 @@ static void CatalogAdd( xml_t *p_xml, const char *psz_arg1, /***************************************************************************** * Reader functions *****************************************************************************/ -static xml_reader_t *ReaderCreate( xml_t *p_xml, const char *psz_filename ) +static xml_reader_t *ReaderCreate( xml_t *p_xml, stream_t *s ) { xml_reader_t *p_reader; xml_reader_sys_t *p_sys; char *p_buffer; int i_buffer; - FILE *file; XTag *p_root; /* Open and read file */ - file = fopen( psz_filename, "rt" ); - if( !file ) - { - msg_Warn( p_xml, "could not open file '%s'", psz_filename ); - return 0; - } - fseek( file, 0L, SEEK_END ); - i_buffer = ftell( file ); - fseek( file, 0L, SEEK_SET ); + i_buffer = stream_Size( s ); p_buffer = malloc( i_buffer + 1 ); - i_buffer = fread( p_buffer, 1, i_buffer, file ); - p_buffer[i_buffer] = 0; - fclose( file ); + i_buffer = stream_Read( s, p_buffer, i_buffer ); + p_buffer[ i_buffer ] = 0; if( !i_buffer ) { - msg_Dbg( p_xml, "file '%s' is empty", psz_filename ); + msg_Dbg( p_xml, "empty xml" ); free( p_buffer ); return 0; } @@ -193,7 +185,7 @@ static xml_reader_t *ReaderCreate( xml_t *p_xml, const char *psz_filename ) p_root = xtag_new_parse( p_buffer, i_buffer ); if( !p_root ) { - msg_Warn( p_xml, "couldn't parse file '%s'", psz_filename ); + msg_Warn( p_xml, "couldn't parse xml" ); free( p_buffer ); return 0; } -- 2.39.2