]> git.sesse.net Git - vlc/commitdiff
all: ported xml parsers to stream_t
authorSigmund Augdal Helberg <sigmunau@videolan.org>
Fri, 1 Apr 2005 22:39:10 +0000 (22:39 +0000)
committerSigmund Augdal Helberg <sigmunau@videolan.org>
Fri, 1 Apr 2005 22:39:10 +0000 (22:39 +0000)
include/vlc_xml.h
modules/gui/skins2/parser/xmlparser.cpp
modules/gui/skins2/parser/xmlparser.hpp
modules/misc/xml/libxml.c
modules/misc/xml/xtag.c

index daa770e7101c7a74b8cd259eee315c6c13562e5a..abcde2a5af0cf5c7a473830a60955ee9c8568abc 100644 (file)
@@ -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 * );
index 1d9734116d1394504b2b146648accc60d994d140..3cdd832af950d0c45a9d16e7989e8f9a62fffa36 100644 (file)
@@ -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 );
 }
 
 
index a4c3f11de04d9621145948625cf81893518049a1..a6f3fa6d713a33f94989591a24d9ea040119c3c3 100644 (file)
@@ -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 <map>
 
@@ -67,6 +69,7 @@ class XMLParser: public SkinObject
         /// Reader context
         xml_t *m_pXML;
         xml_reader_t *m_pReader;
+        stream_t *m_pStream;
 };
 
 #endif
index 13243c5b7d29f0cdd33c59fb6e9f8802defabf92..9fc4913c3285a392c722ab255813759ed3cf4cf8 100644 (file)
@@ -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 );    
+}
index e7a8b7b5aedadd28eb5e01a74c7070868fd3523e..dad8b198d9552ef6847ad9458036ecae6378e650 100644 (file)
@@ -30,6 +30,8 @@
 #include <vlc/vlc.h>
 
 #include "vlc_xml.h"
+#include "vlc_block.h"
+#include "vlc_stream.h"
 
 #include <ctype.h>
 #include <string.h>
@@ -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;
     }