Commit decef1e7 authored by Jakob Leben's avatar Jakob Leben

xspf: new playlist design

parent defbc4a4
...@@ -118,7 +118,10 @@ int Demux( demux_t *p_demux ) ...@@ -118,7 +118,10 @@ int Demux( demux_t *p_demux )
} }
free( psz_name ); free( psz_name );
i_ret = parse_playlist_node( p_demux, p_current_input, input_item_node_t *p_subitems =
input_item_node_Create( p_current_input );
i_ret = parse_playlist_node( p_demux, p_subitems,
p_xml_reader, "playlist" ) ? 0 : -1; p_xml_reader, "playlist" ) ? 0 : -1;
for( int i = 0 ; i < p_demux->p_sys->i_tracklist_entries ; i++ ) for( int i = 0 ; i < p_demux->p_sys->i_tracklist_entries ; i++ )
...@@ -127,9 +130,13 @@ int Demux( demux_t *p_demux ) ...@@ -127,9 +130,13 @@ int Demux( demux_t *p_demux )
if( p_new_input ) if( p_new_input )
{ {
input_item_AddSubItem( p_current_input, p_new_input ); input_item_AddSubItem( p_current_input, p_new_input );
input_item_node_AppendItem( p_subitems, p_new_input );
} }
} }
input_item_AddSubItemTree( p_subitems );
input_item_node_Delete( p_subitems );
end: end:
vlc_gc_decref(p_current_input); vlc_gc_decref(p_current_input);
if( p_xml_reader ) if( p_xml_reader )
...@@ -155,6 +162,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -155,6 +162,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
*/ */
static bool parse_playlist_node COMPLEX_INTERFACE static bool parse_playlist_node COMPLEX_INTERFACE
{ {
input_item_t *p_input_item = p_input_node->p_item;
char *psz_name = NULL; char *psz_name = NULL;
char *psz_value = NULL; char *psz_value = NULL;
bool b_version_found = false; bool b_version_found = false;
...@@ -248,7 +256,7 @@ static bool parse_playlist_node COMPLEX_INTERFACE ...@@ -248,7 +256,7 @@ static bool parse_playlist_node COMPLEX_INTERFACE
{ {
FREE_VALUE(); FREE_VALUE();
if( p_handler->pf_handler.cmplx( p_demux, if( p_handler->pf_handler.cmplx( p_demux,
p_input_item, p_input_node,
p_xml_reader, p_xml_reader,
p_handler->name ) ) p_handler->name ) )
{ {
...@@ -349,8 +357,8 @@ static bool parse_tracklist_node COMPLEX_INTERFACE ...@@ -349,8 +357,8 @@ static bool parse_tracklist_node COMPLEX_INTERFACE
free( psz_eltname ); free( psz_eltname );
/* parse the track data in a separate function */ /* parse the track data in a separate function */
if( parse_track_node( p_demux, p_input_item, p_xml_reader, if( parse_track_node( p_demux, p_input_node,
"track" ) ) p_xml_reader, "track" ) )
i_ntracks++; i_ntracks++;
} }
else if( i_node == XML_READER_ENDELEM ) else if( i_node == XML_READER_ENDELEM )
...@@ -382,6 +390,7 @@ static bool parse_tracklist_node COMPLEX_INTERFACE ...@@ -382,6 +390,7 @@ static bool parse_tracklist_node COMPLEX_INTERFACE
*/ */
static bool parse_track_node COMPLEX_INTERFACE static bool parse_track_node COMPLEX_INTERFACE
{ {
input_item_t *p_input_item = p_input_node->p_item;
char *psz_name = NULL; char *psz_name = NULL;
char *psz_value = NULL; char *psz_value = NULL;
xml_elem_hnd_t *p_handler = NULL; xml_elem_hnd_t *p_handler = NULL;
...@@ -406,6 +415,7 @@ static bool parse_track_node COMPLEX_INTERFACE ...@@ -406,6 +415,7 @@ static bool parse_track_node COMPLEX_INTERFACE
}; };
input_item_t *p_new_input = input_item_New( p_demux, NULL, NULL ); input_item_t *p_new_input = input_item_New( p_demux, NULL, NULL );
input_item_node_t *p_new_node = input_item_node_Create( p_new_input );
if( !p_new_input ) if( !p_new_input )
{ {
...@@ -446,10 +456,12 @@ static bool parse_track_node COMPLEX_INTERFACE ...@@ -446,10 +456,12 @@ static bool parse_track_node COMPLEX_INTERFACE
if( p_handler->type == COMPLEX_CONTENT ) if( p_handler->type == COMPLEX_CONTENT )
{ {
FREE_VALUE(); FREE_VALUE();
if( p_handler->pf_handler.cmplx( p_demux,
p_new_input, bool b_res = p_handler->pf_handler.cmplx( p_demux,
p_xml_reader, p_new_node,
p_handler->name ) ) p_xml_reader,
p_handler->name );
if( b_res )
{ {
p_handler = NULL; p_handler = NULL;
} }
...@@ -497,6 +509,7 @@ static bool parse_track_node COMPLEX_INTERFACE ...@@ -497,6 +509,7 @@ static bool parse_track_node COMPLEX_INTERFACE
if( p_sys->i_track_id < 0 ) if( p_sys->i_track_id < 0 )
{ {
input_item_AddSubItem( p_input_item, p_new_input ); input_item_AddSubItem( p_input_item, p_new_input );
input_item_node_AppendNode( p_input_node, p_new_node );
vlc_gc_decref( p_new_input ); vlc_gc_decref( p_new_input );
return true; return true;
} }
...@@ -647,6 +660,7 @@ static bool set_option SIMPLE_INTERFACE ...@@ -647,6 +660,7 @@ static bool set_option SIMPLE_INTERFACE
*/ */
static bool parse_extension_node COMPLEX_INTERFACE static bool parse_extension_node COMPLEX_INTERFACE
{ {
input_item_t *p_input_item = p_input_node->p_item;
char *psz_name = NULL; char *psz_name = NULL;
char *psz_value = NULL; char *psz_value = NULL;
char *psz_title = NULL; char *psz_title = NULL;
...@@ -711,6 +725,8 @@ static bool parse_extension_node COMPLEX_INTERFACE ...@@ -711,6 +725,8 @@ static bool parse_extension_node COMPLEX_INTERFACE
if( p_new_input ) if( p_new_input )
{ {
input_item_AddSubItem( p_input_item, p_new_input ); input_item_AddSubItem( p_input_item, p_new_input );
p_input_node =
input_item_node_AppendItem( p_input_node, p_new_input );
p_input_item = p_new_input; p_input_item = p_new_input;
b_release_input_item = true; b_release_input_item = true;
} }
...@@ -732,6 +748,7 @@ static bool parse_extension_node COMPLEX_INTERFACE ...@@ -732,6 +748,7 @@ static bool parse_extension_node COMPLEX_INTERFACE
} }
free( psz_application ); free( psz_application );
/* parse the child elements */ /* parse the child elements */
while( xml_ReaderRead( p_xml_reader ) == 1 ) while( xml_ReaderRead( p_xml_reader ) == 1 )
{ {
...@@ -766,7 +783,7 @@ static bool parse_extension_node COMPLEX_INTERFACE ...@@ -766,7 +783,7 @@ static bool parse_extension_node COMPLEX_INTERFACE
if( p_handler->type == COMPLEX_CONTENT ) if( p_handler->type == COMPLEX_CONTENT )
{ {
if( p_handler->pf_handler.cmplx( p_demux, if( p_handler->pf_handler.cmplx( p_demux,
p_input_item, p_input_node,
p_xml_reader, p_xml_reader,
p_handler->name ) ) p_handler->name ) )
{ {
...@@ -900,7 +917,8 @@ static bool parse_extitem_node COMPLEX_INTERFACE ...@@ -900,7 +917,8 @@ static bool parse_extitem_node COMPLEX_INTERFACE
p_new_input = p_demux->p_sys->pp_tracklist[ i_tid ]; p_new_input = p_demux->p_sys->pp_tracklist[ i_tid ];
if( p_new_input ) if( p_new_input )
{ {
input_item_AddSubItem( p_input_item, p_new_input ); input_item_AddSubItem( p_input_node->p_item, p_new_input );
input_item_node_AppendItem( p_input_node, p_new_input );
vlc_gc_decref( p_new_input ); vlc_gc_decref( p_new_input );
p_demux->p_sys->pp_tracklist[i_tid] = NULL; p_demux->p_sys->pp_tracklist[i_tid] = NULL;
} }
...@@ -917,7 +935,7 @@ static bool parse_extitem_node COMPLEX_INTERFACE ...@@ -917,7 +935,7 @@ static bool parse_extitem_node COMPLEX_INTERFACE
*/ */
static bool skip_element COMPLEX_INTERFACE static bool skip_element COMPLEX_INTERFACE
{ {
VLC_UNUSED(p_demux); VLC_UNUSED(p_input_item); VLC_UNUSED(p_demux); VLC_UNUSED(p_input_node);
while( xml_ReaderRead( p_xml_reader ) == 1 ) while( xml_ReaderRead( p_xml_reader ) == 1 )
{ {
......
...@@ -34,10 +34,10 @@ enum { ...@@ -34,10 +34,10 @@ enum {
#define SIMPLE_INTERFACE (input_item_t *p_input,\ #define SIMPLE_INTERFACE (input_item_t *p_input,\
const char *psz_name,\ const char *psz_name,\
char *psz_value) char *psz_value)
#define COMPLEX_INTERFACE (demux_t *p_demux,\ #define COMPLEX_INTERFACE (demux_t *p_demux,\
input_item_t *p_input_item,\ input_item_node_t *p_input_node,\
xml_reader_t *p_xml_reader,\ xml_reader_t *p_xml_reader,\
const char *psz_element) const char *psz_element)
/* prototypes */ /* prototypes */
static bool parse_playlist_node COMPLEX_INTERFACE; static bool parse_playlist_node COMPLEX_INTERFACE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment