]> git.sesse.net Git - vlc/blobdiff - modules/demux/playlist/itml.c
XML: simplify demuxers
[vlc] / modules / demux / playlist / itml.c
index dfa93ad8ed29d2396dd21b5b7aff531fe62dea88..bc37dd6a8b6bf055eab283d14a81b87d6e604482 100644 (file)
@@ -67,19 +67,14 @@ void Close_iTML( vlc_object_t *p_this )
  */
 int Demux( demux_t *p_demux )
 {
-    xml_t *p_xml;
-    xml_reader_t *p_xml_reader = NULL;
+    xml_reader_t *p_xml_reader;
     char *psz_name = NULL;
 
-    INIT_PLAYLIST_STUFF;
+    input_item_t *p_current_input = GetCurrentItem(p_demux);
     p_demux->p_sys->i_ntracks = 0;
 
     /* create new xml parser from stream */
-    p_xml = xml_Create( p_demux );
-    if( !p_xml )
-        goto end;
-
-    p_xml_reader = xml_ReaderCreate( p_xml, p_demux->s );
+    p_xml_reader = xml_ReaderCreate( p_demux, p_demux->s );
     if( !p_xml_reader )
         goto end;
 
@@ -101,19 +96,19 @@ int Demux( demux_t *p_demux )
         goto end;
     }
 
+    input_item_node_t *p_subitems = input_item_node_Create( p_current_input );
     xml_elem_hnd_t pl_elements[] =
         { {"dict",    COMPLEX_CONTENT, {.cmplx = parse_plist_dict} } };
-    parse_plist_node( p_demux, p_current_input, NULL, p_xml_reader, "plist",
+    parse_plist_node( p_demux, p_subitems, NULL, p_xml_reader, "plist",
                       pl_elements );
+    input_item_node_PostAndDelete( p_subitems );
 
-    HANDLE_PLAY_AND_RELEASE;
+    vlc_gc_decref(p_current_input);
 
 end:
     free( psz_name );
     if( p_xml_reader )
-        xml_ReaderDelete( p_xml, p_xml_reader );
-    if( p_xml )
-        xml_Delete( p_xml );
+        xml_ReaderDelete( p_xml_reader );
 
     /* Needed for correct operation of go back */
     return 0;
@@ -129,7 +124,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
 /**
  * \brief parse the root node of the playlist
  */
-static bool parse_plist_node( demux_t *p_demux, input_item_t *p_input_item,
+static bool parse_plist_node( demux_t *p_demux, input_item_node_t *p_input_node,
                               track_elem_t *p_track, xml_reader_t *p_xml_reader,
                               const char *psz_element,
                               xml_elem_hnd_t *p_handlers )
@@ -170,7 +165,7 @@ static bool parse_plist_node( demux_t *p_demux, input_item_t *p_input_item,
     if( !b_version_found )
         msg_Warn( p_demux, "<plist> requires \"version\" attribute" );
 
-    return parse_dict( p_demux, p_input_item, NULL, p_xml_reader,
+    return parse_dict( p_demux, p_input_node, NULL, p_xml_reader,
                        "plist", p_handlers );
 }
 
@@ -178,7 +173,7 @@ static bool parse_plist_node( demux_t *p_demux, input_item_t *p_input_item,
  * \brief parse a <dict>
  * \param COMPLEX_INTERFACE
  */
-static bool parse_dict( demux_t *p_demux, input_item_t *p_input_item,
+static bool parse_dict( demux_t *p_demux, input_item_node_t *p_input_node,
                         track_elem_t *p_track, xml_reader_t *p_xml_reader,
                         const char *psz_element, xml_elem_hnd_t *p_handlers )
 {
@@ -218,7 +213,7 @@ static bool parse_dict( demux_t *p_demux, input_item_t *p_input_item,
             /* complex content is parsed in a separate function */
             if( p_handler->type == COMPLEX_CONTENT )
             {
-                if( p_handler->pf_handler.cmplx( p_demux, p_input_item, NULL,
+                if( p_handler->pf_handler.cmplx( p_demux, p_input_node, NULL,
                                                  p_xml_reader, p_handler->name,
                                                  NULL ) )
                 {
@@ -266,6 +261,7 @@ static bool parse_dict( demux_t *p_demux, input_item_t *p_input_item,
             /* special case: key */
             if( !strcmp( p_handler->name, "key" ) )
             {
+                free( psz_key );
                 psz_key = strdup( psz_value );
             }
             /* call the simple handler */
@@ -293,7 +289,7 @@ end:
     return b_ret;
 }
 
-static bool parse_plist_dict( demux_t *p_demux, input_item_t *p_input_item,
+static bool parse_plist_dict( demux_t *p_demux, input_item_node_t *p_input_node,
                               track_elem_t *p_track, xml_reader_t *p_xml_reader,
                               const char *psz_element,
                               xml_elem_hnd_t *p_handlers )
@@ -311,11 +307,11 @@ static bool parse_plist_dict( demux_t *p_demux, input_item_t *p_input_item,
           {NULL,      UNKNOWN_CONTENT, {NULL} }
         };
 
-    return parse_dict( p_demux, p_input_item, NULL, p_xml_reader,
+    return parse_dict( p_demux, p_input_node, NULL, p_xml_reader,
                        "dict", pl_elements );
 }
 
-static bool parse_tracks_dict( demux_t *p_demux, input_item_t *p_input_item,
+static bool parse_tracks_dict( demux_t *p_demux, input_item_node_t *p_input_node,
                                track_elem_t *p_track, xml_reader_t *p_xml_reader,
                                const char *psz_element,
                                xml_elem_hnd_t *p_handlers )
@@ -327,7 +323,7 @@ static bool parse_tracks_dict( demux_t *p_demux, input_item_t *p_input_item,
           {NULL,      UNKNOWN_CONTENT, {NULL} }
         };
 
-    parse_dict( p_demux, p_input_item, NULL, p_xml_reader,
+    parse_dict( p_demux, p_input_node, NULL, p_xml_reader,
                 "dict", tracks_elements );
 
     msg_Info( p_demux, "added %i tracks successfully",
@@ -336,7 +332,7 @@ static bool parse_tracks_dict( demux_t *p_demux, input_item_t *p_input_item,
     return true;
 }
 
-static bool parse_track_dict( demux_t *p_demux, input_item_t *p_input_item,
+static bool parse_track_dict( demux_t *p_demux, input_item_node_t *p_input_node,
                               track_elem_t *p_track, xml_reader_t *p_xml_reader,
                               const char *psz_element,
                               xml_elem_hnd_t *p_handlers )
@@ -344,7 +340,6 @@ static bool parse_track_dict( demux_t *p_demux, input_item_t *p_input_item,
     VLC_UNUSED(psz_element); VLC_UNUSED(p_handlers);
     input_item_t *p_new_input = NULL;
     int i_ret;
-    char *psz_uri = NULL;
     p_track = new_track();
 
     xml_elem_hnd_t track_elements[] =
@@ -358,7 +353,7 @@ static bool parse_track_dict( demux_t *p_demux, input_item_t *p_input_item,
           {NULL,      UNKNOWN_CONTENT, {NULL} }
         };
 
-    i_ret = parse_dict( p_demux, p_input_item, p_track,
+    i_ret = parse_dict( p_demux, p_input_node, p_track,
                         p_xml_reader, "dict", track_elements );
 
     msg_Dbg( p_demux, "name: %s, artist: %s, album: %s, genre: %s, trackNum: %s, location: %s",
@@ -371,32 +366,15 @@ static bool parse_track_dict( demux_t *p_demux, input_item_t *p_input_item,
         return false;
     }
 
-    psz_uri = decode_URI_duplicate( p_track->location );
-
-    if( psz_uri )
-    {
-        if( strlen( psz_uri ) > 17 &&
-            !strncmp( psz_uri, "file://localhost/", 17 ) )
-        {
-            /* remove 'localhost/' */
-            memmove( psz_uri + 7, psz_uri + 17, strlen( psz_uri ) - 9 );
-            msg_Info( p_demux, "Adding '%s'", psz_uri );
-
-            p_new_input = input_item_New( p_demux, psz_uri, NULL );
-            input_item_AddSubItem( p_input_item, p_new_input );
+    msg_Info( p_demux, "Adding '%s'", p_track->location );
+    p_new_input = input_item_New( p_demux, p_track->location, NULL );
+    input_item_node_AppendItem( p_input_node, p_new_input );
 
-            /* add meta info */
-            add_meta( p_new_input, p_track );
-            vlc_gc_decref( p_new_input );
+    /* add meta info */
+    add_meta( p_new_input, p_track );
+    vlc_gc_decref( p_new_input );
 
-            p_demux->p_sys->i_ntracks++;
-        }
-        else
-        {
-            msg_Err( p_demux, "Don't know how to handle %s", psz_uri );
-        }
-        free( psz_uri );
-    }
+    p_demux->p_sys->i_ntracks++;
 
     free_track( p_track );
     return i_ret;
@@ -487,11 +465,11 @@ static bool add_meta( input_item_t *p_input_item, track_elem_t *p_track )
 /**
  * \brief skips complex element content that we can't manage
  */
-static bool skip_element( demux_t *p_demux, input_item_t *p_input_item,
+static bool skip_element( demux_t *p_demux, input_item_node_t *p_input_node,
                           track_elem_t *p_track, xml_reader_t *p_xml_reader,
                           const char *psz_element, xml_elem_hnd_t *p_handlers )
 {
-    VLC_UNUSED(p_demux); VLC_UNUSED(p_input_item);
+    VLC_UNUSED(p_demux); VLC_UNUSED(p_input_node);
     VLC_UNUSED(p_track); VLC_UNUSED(p_handlers);
     char *psz_endname;