]> git.sesse.net Git - vlc/blobdiff - modules/gui/skins2/parser/xmlparser.cpp
skins2: don't load XML catalog if DTD not requested
[vlc] / modules / gui / skins2 / parser / xmlparser.cpp
index 58441b95d6f0e33701f8bf4d7e6cff17eeb69d43..ca287da27f95484e2f8d27f3ba838bcbfa26dd0f 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 #include "xmlparser.hpp"
 #include "../src/os_factory.hpp"
+#include <vlc_url.h>
 
 #ifdef HAVE_SYS_STAT_H
 #   include <sys/stat.h>
 // Static variable to avoid initializing catalogs twice
 static bool m_initialized = false;
 
-XMLParser::XMLParser( intf_thread_t *pIntf, const string &rFileName ):
+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 )
-    {
-        msg_Err( getIntf(), "Failed to open XML parser" );
-        return;
-    }
 
-    // Avoid duplicate initialization (mutex needed ?)
-    if( !m_initialized )
+    if( useDTD )
     {
-        LoadCatalog();
-        m_initialized = true;
+        m_pXML = xml_Create( pIntf );
+        if( m_pXML )
+            LoadCatalog();
+        else
+        {
+            msg_Err( getIntf(), "DTD not supported" );
+            useDTD = false;
+        }
     }
+    else
+        m_pXML = NULL;
+
+    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",
+        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",
+        msg_Err( getIntf(), "failed to open %s for parsing",
                  rFileName.c_str() );
         return;
     }
 
-    xml_ReaderUseDTD( m_pReader, VLC_TRUE );
-
+    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 );
 }
@@ -114,7 +118,7 @@ void XMLParser::LoadCatalog()
         if( !stat( path.c_str(), &statBuf ) )
         {
             // DTD found
-            msg_Dbg( getIntf(), "Using DTD %s", path.c_str() );
+            msg_Dbg( getIntf(), "using DTD %s", path.c_str() );
 
             // Add an entry in the default catalog
             xml_CatalogAdd( m_pXML, "public",
@@ -125,7 +129,7 @@ void XMLParser::LoadCatalog()
     }
     if( it == resPath.end() )
     {
-        msg_Err( getIntf(), "Cannot find the skins DTD !");
+        msg_Err( getIntf(), "cannot find the skins DTD");
     }
 #endif
 }
@@ -162,7 +166,12 @@ bool XMLParser::parse()
                 {
                     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;
                 }