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 * );
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;
}
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",
{
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 );
}
#define XMLPARSER_HPP
#include "../src/skin_common.hpp"
+#include "vlc_block.h"
+#include "vlc_stream.h"
#include "vlc_xml.h"
#include <map>
/// Reader context
xml_t *m_pXML;
xml_reader_t *m_pReader;
+ stream_t *m_pStream;
};
#endif
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 * );
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
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;
}
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 );
+}
#include <vlc/vlc.h>
#include "vlc_xml.h"
+#include "vlc_block.h"
+#include "vlc_stream.h"
#include <ctype.h>
#include <string.h>
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 * );
/*****************************************************************************
* 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;
}
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;
}