#include "xmlparser.hpp"
#include "../src/os_factory.hpp"
+#include <vlc_url.h>
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
-// Static variable to avoid initializing catalogs twice
-static bool m_initialized = false;
-
XMLParser::XMLParser( intf_thread_t *pIntf, const string &rFileName,
bool useDTD ):
SkinObject( pIntf )
m_pReader = NULL;
m_pStream = NULL;
- m_pXML = xml_Create( pIntf );
- if( !m_pXML )
+ if( useDTD )
{
- msg_Err( getIntf(), "failed to open XML parser" );
- return;
+ m_pXML = xml_Create( pIntf );
+ if( m_pXML )
+ LoadCatalog();
+ else
+ {
+ msg_Err( getIntf(), "DTD not supported" );
+ useDTD = false;
+ }
}
+ else
+ m_pXML = NULL;
- // Avoid duplicate initialization (mutex needed ?)
- if( !m_initialized )
- {
- LoadCatalog();
- m_initialized = true;
- }
+ char* psz_uri = make_URI( rFileName.c_str(), NULL );
+ m_pStream = stream_UrlNew( pIntf, psz_uri );
+ free( psz_uri );
- m_pStream = stream_UrlNew( pIntf, rFileName.c_str() );
if( !m_pStream )
{
msg_Err( getIntf(), "failed to open %s for reading",
return;
}
- xml_ReaderUseDTD( m_pReader, useDTD ? true : false );
-
+ xml_ReaderUseDTD( m_pReader, useDTD );
}
XMLParser::~XMLParser()
{
- if( m_pReader && m_pXML ) xml_ReaderDelete( m_pXML, m_pReader );
+ if( m_pReader ) xml_ReaderDelete( m_pReader );
if( m_pXML ) xml_Delete( m_pXML );
if( m_pStream ) stream_Delete( m_pStream );
}
{
char *name = xml_ReaderName( m_pReader );
char *value = xml_ReaderValue( m_pReader );
- if( !name || !value ) return false;
+ if( !name || !value )
+ {
+ free( name );
+ free( value );
+ return false;
+ }
attributes[name] = value;
}