all: ported xml parsers to stream_t

parent 2cdb935b
...@@ -36,7 +36,7 @@ struct xml_t ...@@ -36,7 +36,7 @@ struct xml_t
module_t *p_module; module_t *p_module;
xml_sys_t *p_sys; 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_reader_delete) ( xml_reader_t * );
void (*pf_catalog_load) ( xml_t *, const char * ); void (*pf_catalog_load) ( xml_t *, const char * );
......
...@@ -32,11 +32,13 @@ static bool m_initialized = false; ...@@ -32,11 +32,13 @@ static bool m_initialized = false;
XMLParser::XMLParser( intf_thread_t *pIntf, const string &rFileName ): XMLParser::XMLParser( intf_thread_t *pIntf, const string &rFileName ):
SkinObject( pIntf ) SkinObject( pIntf )
{ {
m_pReader = NULL;
m_pStream = NULL;
m_pXML = xml_Create( pIntf ); m_pXML = xml_Create( pIntf );
if( !m_pXML ) if( !m_pXML )
{ {
msg_Err( getIntf(), "Failed to open XML parser" ); msg_Err( getIntf(), "Failed to open XML parser" );
m_pReader = NULL;
return; return;
} }
...@@ -47,7 +49,14 @@ XMLParser::XMLParser( intf_thread_t *pIntf, const string &rFileName ): ...@@ -47,7 +49,14 @@ XMLParser::XMLParser( intf_thread_t *pIntf, const string &rFileName ):
m_initialized = true; 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 ) if( !m_pReader )
{ {
msg_Err( getIntf(), "Failed to open %s for parsing", msg_Err( getIntf(), "Failed to open %s for parsing",
...@@ -61,6 +70,7 @@ XMLParser::~XMLParser() ...@@ -61,6 +70,7 @@ XMLParser::~XMLParser()
{ {
if( m_pReader && m_pXML ) xml_ReaderDelete( m_pXML, m_pReader ); if( m_pReader && m_pXML ) xml_ReaderDelete( m_pXML, m_pReader );
if( m_pXML ) xml_Delete( m_pXML ); if( m_pXML ) xml_Delete( m_pXML );
if( m_pStream ) stream_Delete( m_pStream );
} }
......
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#define XMLPARSER_HPP #define XMLPARSER_HPP
#include "../src/skin_common.hpp" #include "../src/skin_common.hpp"
#include "vlc_block.h"
#include "vlc_stream.h"
#include "vlc_xml.h" #include "vlc_xml.h"
#include <map> #include <map>
...@@ -67,6 +69,7 @@ class XMLParser: public SkinObject ...@@ -67,6 +69,7 @@ class XMLParser: public SkinObject
/// Reader context /// Reader context
xml_t *m_pXML; xml_t *m_pXML;
xml_reader_t *m_pReader; xml_reader_t *m_pReader;
stream_t *m_pStream;
}; };
#endif #endif
...@@ -49,7 +49,7 @@ struct xml_reader_sys_t ...@@ -49,7 +49,7 @@ struct xml_reader_sys_t
xmlTextReaderPtr p_reader; 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 void ReaderDelete( xml_reader_t * );
static int ReaderRead( xml_reader_t * ); static int ReaderRead( xml_reader_t * );
static int ReaderNodeType( xml_reader_t * ); static int ReaderNodeType( xml_reader_t * );
...@@ -59,6 +59,7 @@ static int ReaderNextAttr( xml_reader_t * ); ...@@ -59,6 +59,7 @@ static int ReaderNextAttr( xml_reader_t * );
static void CatalogLoad( xml_t *, const char * ); static void CatalogLoad( xml_t *, const char * );
static void CatalogAdd( xml_t *, const char *, const char *, 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 * Module initialization
...@@ -111,16 +112,20 @@ static void ReaderErrorHandler( void *p_arg, const char *p_msg, ...@@ -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 ); 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_t *p_reader;
xml_reader_sys_t *p_sys; xml_reader_sys_t *p_sys;
xmlTextReaderPtr p_libxml_reader; 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 ) 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; return 0;
} }
...@@ -214,3 +219,9 @@ static int ReaderNextAttr( xml_reader_t *p_reader ) ...@@ -214,3 +219,9 @@ static int ReaderNextAttr( xml_reader_t *p_reader )
return ( xmlTextReaderMoveToNextAttribute( p_reader->p_sys->p_reader ) return ( xmlTextReaderMoveToNextAttribute( p_reader->p_sys->p_reader )
== 1 ) ? VLC_SUCCESS : VLC_EGENERIC; == 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 );
}
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
#include <vlc/vlc.h> #include <vlc/vlc.h>
#include "vlc_xml.h" #include "vlc_xml.h"
#include "vlc_block.h"
#include "vlc_stream.h"
#include <ctype.h> #include <ctype.h>
#include <string.h> #include <string.h>
...@@ -98,7 +100,7 @@ struct xml_reader_sys_t ...@@ -98,7 +100,7 @@ struct xml_reader_sys_t
vlc_bool_t b_endtag; 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 void ReaderDelete( xml_reader_t * );
static int ReaderRead( xml_reader_t * ); static int ReaderRead( xml_reader_t * );
static int ReaderNodeType( xml_reader_t * ); static int ReaderNodeType( xml_reader_t * );
...@@ -158,34 +160,24 @@ static void CatalogAdd( xml_t *p_xml, const char *psz_arg1, ...@@ -158,34 +160,24 @@ static void CatalogAdd( xml_t *p_xml, const char *psz_arg1,
/***************************************************************************** /*****************************************************************************
* Reader functions * 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_t *p_reader;
xml_reader_sys_t *p_sys; xml_reader_sys_t *p_sys;
char *p_buffer; char *p_buffer;
int i_buffer; int i_buffer;
FILE *file;
XTag *p_root; XTag *p_root;
/* Open and read file */ /* 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 = stream_Size( s );
i_buffer = ftell( file );
fseek( file, 0L, SEEK_SET );
p_buffer = malloc( i_buffer + 1 ); p_buffer = malloc( i_buffer + 1 );
i_buffer = fread( p_buffer, 1, i_buffer, file ); i_buffer = stream_Read( s, p_buffer, i_buffer );
p_buffer[i_buffer] = 0; p_buffer[ i_buffer ] = 0;
fclose( file );
if( !i_buffer ) if( !i_buffer )
{ {
msg_Dbg( p_xml, "file '%s' is empty", psz_filename ); msg_Dbg( p_xml, "empty xml" );
free( p_buffer ); free( p_buffer );
return 0; return 0;
} }
...@@ -193,7 +185,7 @@ static xml_reader_t *ReaderCreate( xml_t *p_xml, const char *psz_filename ) ...@@ -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 ); p_root = xtag_new_parse( p_buffer, i_buffer );
if( !p_root ) 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 ); free( p_buffer );
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment