X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fplaylist%2Fxspf.c;h=852db24a7850b1594b0a7e549fb0843ae9506007;hb=36edd71568f3b577bbb8ef59d5e2749388ac9009;hp=9b2e736b96fa27ca79f34e8c58e3f357744a7756;hpb=656fa1a272ce7a62657a2ce742015d29890c4deb;p=vlc diff --git a/modules/demux/playlist/xspf.c b/modules/demux/playlist/xspf.c index 9b2e736b96..852db24a78 100644 --- a/modules/demux/playlist/xspf.c +++ b/modules/demux/playlist/xspf.c @@ -30,21 +30,20 @@ # include "config.h" #endif -#include +#include #include -#include "playlist.h" -#include "vlc_xml.h" -#include "vlc_strings.h" -#include "vlc_url.h" +#include +#include +#include #include "xspf.h" +#include "playlist.h" struct demux_sys_t { - playlist_item_t *p_item_in_category; input_item_t **pp_tracklist; int i_tracklist_entries; - int i_identifier; + int i_track_id; char * psz_base; }; @@ -54,18 +53,24 @@ static int Demux( demux_t * ); /** * \brief XSPF submodule initialization function */ -int E_(Import_xspf)( vlc_object_t *p_this ) +int Import_xspf( vlc_object_t *p_this ) { DEMUX_BY_EXTENSION_OR_FORCED_MSG( ".xspf", "xspf-open", "using XSPF playlist reader" ); return VLC_SUCCESS; } -void E_(Close_xspf)( vlc_object_t *p_this ) +void Close_xspf( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t *)p_this; - FREENULL( p_demux->p_sys->pp_tracklist ); - FREENULL( p_demux->p_sys->psz_base ); + int i; + for(i = 0; i < p_demux->p_sys->i_tracklist_entries; i++) + { + if(p_demux->p_sys->pp_tracklist[i]) + vlc_gc_decref( p_demux->p_sys->pp_tracklist[i] ); + } + free( p_demux->p_sys->pp_tracklist ); + free( p_demux->p_sys->psz_base ); free( p_demux->p_sys ); } @@ -81,7 +86,7 @@ int Demux( demux_t *p_demux ) INIT_PLAYLIST_STUFF; p_demux->p_sys->pp_tracklist = NULL; p_demux->p_sys->i_tracklist_entries = 0; - p_demux->p_sys->i_identifier = 0; + p_demux->p_sys->i_track_id = -1; p_demux->p_sys->psz_base = NULL; /* create new xml parser from stream */ @@ -121,7 +126,7 @@ int Demux( demux_t *p_demux ) } if( i_ret == 1 ) - i_ret = parse_playlist_node( p_demux, p_playlist, p_current_input, + i_ret = parse_playlist_node( p_demux, p_current_input, p_xml_reader, "playlist" ) ? 0 : -1; int i; @@ -130,7 +135,7 @@ int Demux( demux_t *p_demux ) input_item_t *p_new_input = p_demux->p_sys->pp_tracklist[i]; if( p_new_input ) { - input_ItemAddSubItem( p_current_input, p_new_input ); + input_item_AddSubItem( p_current_input, p_new_input ); } } @@ -152,18 +157,17 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) /** * \brief parse the root node of a XSPF playlist * \param p_demux demuxer instance - * \param p_playlist playlist instance * \param p_input_item current input item * \param p_xml_reader xml reader instance * \param psz_element name of element to parse */ -static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE +static bool parse_playlist_node COMPLEX_INTERFACE { - char *psz_name=NULL; - char *psz_value=NULL; - vlc_bool_t b_version_found = VLC_FALSE; + char *psz_name = NULL; + char *psz_value = NULL; + bool b_version_found = false; int i_node; - xml_elem_hnd_t *p_handler=NULL; + xml_elem_hnd_t *p_handler = NULL; xml_elem_hnd_t pl_elements[] = { {"title", SIMPLE_CONTENT, {.smpl = set_item_info} }, @@ -192,17 +196,17 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE { msg_Err( p_demux, "invalid xml stream @ " ); FREE_ATT(); - return VLC_FALSE; + return false; } /* attribute: version */ if( !strcmp( psz_name, "version" ) ) { - b_version_found = VLC_TRUE; + b_version_found = true; if( strcmp( psz_value, "0" ) && strcmp( psz_value, "1" ) ) msg_Warn( p_demux, "unsupported XSPF version" ); } /* attribute: xmlns */ - else if( !strcmp( psz_name, "xmlns" ) ) + else if( !strcmp( psz_name, "xmlns" ) || !strcmp( psz_name, "xmlns:vlc" ) ) ; else if( !strcmp( psz_name, "xml:base" ) ) { @@ -233,7 +237,7 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE { msg_Err( p_demux, "invalid xml stream" ); FREE_ATT(); - return VLC_FALSE; + return false; } /* choose handler */ for( p_handler = pl_elements; @@ -243,14 +247,13 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE { msg_Err( p_demux, "unexpected element <%s>", psz_name ); FREE_ATT(); - return VLC_FALSE; + return false; } FREE_NAME(); /* complex content is parsed in a separate function */ if( p_handler->type == COMPLEX_CONTENT ) { if( p_handler->pf_handler.cmplx( p_demux, - p_playlist, p_input_item, p_xml_reader, p_handler->name ) ) @@ -261,7 +264,7 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE else { FREE_ATT(); - return VLC_FALSE; + return false; } } break; @@ -274,7 +277,7 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE { msg_Err( p_demux, "invalid xml stream" ); FREE_ATT(); - return VLC_FALSE; + return false; } break; @@ -285,13 +288,13 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE { msg_Err( p_demux, "invalid xml stream" ); FREE_ATT(); - return VLC_FALSE; + return false; } /* leave if the current parent node is terminated */ if( !strcmp( psz_name, psz_element ) ) { FREE_ATT(); - return VLC_TRUE; + return true; } /* there MUST have been a start tag for that element name */ if( !p_handler || !p_handler->name @@ -300,7 +303,7 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE msg_Err( p_demux, "there's no open element left for <%s>", psz_name ); FREE_ATT(); - return VLC_FALSE; + return false; } if( p_handler->pf_handler.smpl ) @@ -316,20 +319,20 @@ static vlc_bool_t parse_playlist_node COMPLEX_INTERFACE /* unknown/unexpected xml node */ msg_Err( p_demux, "unexpected xml node %i", i_node ); FREE_ATT(); - return VLC_FALSE; + return false; } FREE_NAME(); } - return VLC_FALSE; + return false; } /** * \brief parses the tracklist node which only may contain s */ -static vlc_bool_t parse_tracklist_node COMPLEX_INTERFACE +static bool parse_tracklist_node COMPLEX_INTERFACE { VLC_UNUSED(psz_element); - char *psz_name=NULL; + char *psz_name = NULL; int i_node; int i_ntracks = 0; @@ -344,20 +347,20 @@ static vlc_bool_t parse_tracklist_node COMPLEX_INTERFACE { msg_Err( p_demux, "unexpected end of xml data" ); FREE_NAME(); - return VLC_FALSE; + return false; } if( strcmp( psz_name, "track") ) { msg_Err( p_demux, "unexpected child of : <%s>", psz_name ); FREE_NAME(); - return VLC_FALSE; + return false; } FREE_NAME(); /* parse the track data in a separate function */ - if( parse_track_node( p_demux, p_playlist, p_input_item, - p_xml_reader,"track" ) == VLC_TRUE ) + if( parse_track_node( p_demux, p_input_item, + p_xml_reader,"track" ) == true ) i_ntracks++; } else if( i_node == XML_READER_ENDELEM ) @@ -369,33 +372,32 @@ static vlc_bool_t parse_tracklist_node COMPLEX_INTERFACE { msg_Err( p_demux, "there's a missing " ); FREE_NAME(); - return VLC_FALSE; + return false; } psz_name = xml_ReaderName( p_xml_reader ); if( !psz_name || strcmp( psz_name, "trackList" ) ) { msg_Err( p_demux, "expected: , found: ", psz_name ); FREE_NAME(); - return VLC_FALSE; + return false; } FREE_NAME(); msg_Dbg( p_demux, "parsed %i tracks successfully", i_ntracks ); - return VLC_TRUE; + return true; } /** * \brief parse one track element * \param COMPLEX_INTERFACE */ -static vlc_bool_t parse_track_node COMPLEX_INTERFACE +static bool parse_track_node COMPLEX_INTERFACE { - input_item_t *p_new_input = NULL; int i_node; - char *psz_name=NULL; - char *psz_value=NULL; - xml_elem_hnd_t *p_handler=NULL; + char *psz_name = NULL; + char *psz_value = NULL; + xml_elem_hnd_t *p_handler = NULL; xml_elem_hnd_t track_elements[] = { {"location", SIMPLE_CONTENT, {NULL} }, @@ -410,10 +412,21 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE {"duration", SIMPLE_CONTENT, {.smpl = set_item_info} }, {"link", SIMPLE_CONTENT, {NULL} }, {"meta", SIMPLE_CONTENT, {NULL} }, - {"extension", COMPLEX_CONTENT, {.cmplx = skip_element} }, + {"extension", COMPLEX_CONTENT, {.cmplx = parse_extension_node} }, {NULL, UNKNOWN_CONTENT, {NULL} } }; + input_item_t *p_new_input = input_item_NewExt( p_demux, NULL, NULL, 0, NULL, -1 ); + + if( !p_new_input ) + { + /* malloc has failed for input_item_NewExt, so bailout early */ + return false; + } + + /* reset i_track_id */ + p_demux->p_sys->i_track_id = -1; + while( xml_ReaderRead( p_xml_reader ) == 1 ) { i_node = xml_ReaderNodeType( p_xml_reader ); @@ -429,7 +442,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE { msg_Err( p_demux, "invalid xml stream" ); FREE_ATT(); - return VLC_FALSE; + return false; } /* choose handler */ for( p_handler = track_elements; @@ -439,7 +452,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE { msg_Err( p_demux, "unexpected element <%s>", psz_name ); FREE_ATT(); - return VLC_FALSE; + return false; } FREE_NAME(); /* complex content is parsed in a separate function */ @@ -451,10 +464,9 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE "at <%s> level no new item has been allocated", p_handler->name ); FREE_ATT(); - return VLC_FALSE; + return false; } if( p_handler->pf_handler.cmplx( p_demux, - p_playlist, p_new_input, p_xml_reader, p_handler->name ) ) @@ -465,7 +477,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE else { FREE_ATT(); - return VLC_FALSE; + return false; } } break; @@ -478,7 +490,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE { msg_Err( p_demux, "invalid xml stream" ); FREE_ATT(); - return VLC_FALSE; + return false; } break; @@ -489,32 +501,37 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE { msg_Err( p_demux, "invalid xml stream" ); FREE_ATT(); - return VLC_FALSE; + return false; } /* leave if the current parent node is terminated */ if( !strcmp( psz_name, psz_element ) ) { FREE_ATT(); - if( p_demux->p_sys->i_identifier < - p_demux->p_sys->i_tracklist_entries ) + + if( p_demux->p_sys->i_track_id < 0 ) { - p_demux->p_sys->pp_tracklist[ - p_demux->p_sys->i_identifier ] = p_new_input; + input_item_AddSubItem( p_input_item, p_new_input ); + vlc_gc_decref( p_new_input ); + return true; } - else + + if( p_demux->p_sys->i_track_id >= + p_demux->p_sys->i_tracklist_entries ) { - if( p_demux->p_sys->i_identifier > - p_demux->p_sys->i_tracklist_entries ) - { - p_demux->p_sys->i_tracklist_entries = - p_demux->p_sys->i_identifier; - } - INSERT_ELEM( p_demux->p_sys->pp_tracklist, - p_demux->p_sys->i_tracklist_entries, - p_demux->p_sys->i_tracklist_entries, - p_new_input ); + input_item_t **pp; + pp = realloc( p_demux->p_sys->pp_tracklist, + (p_demux->p_sys->i_track_id + 1) * sizeof(*pp) ); + if( !pp ) + return false; + p_demux->p_sys->pp_tracklist = pp; + while( p_demux->p_sys->i_track_id >= + p_demux->p_sys->i_tracklist_entries ) + pp[p_demux->p_sys->i_tracklist_entries++] = NULL; } - return VLC_TRUE; + + p_demux->p_sys->pp_tracklist[ + p_demux->p_sys->i_track_id ] = p_new_input; + return true; } /* there MUST have been a start tag for that element name */ if( !p_handler || !p_handler->name @@ -523,59 +540,40 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE msg_Err( p_demux, "there's no open element left for <%s>", psz_name ); FREE_ATT(); - return VLC_FALSE; + return false; } /* special case: location */ if( !strcmp( p_handler->name, "location" ) ) { - char *psz_uri=NULL; - /* there MUST NOT be an item */ - if( p_new_input ) + char *psz_uri = NULL; + psz_uri = decode_URI_duplicate( psz_value ); + + if( !psz_uri ) { - msg_Err( p_demux, "item <%s> already created", - psz_name ); FREE_ATT(); - return VLC_FALSE; + return false; } - psz_uri = decode_URI_duplicate( psz_value ); - if( psz_uri ) + if( p_demux->p_sys->psz_base && !strstr( psz_uri, "://" ) ) { - if( p_demux->p_sys->psz_base && - !strstr( psz_uri, "://" ) ) + char* psz_tmp; + if( asprintf( &psz_tmp, "%s%s", p_demux->p_sys->psz_base, + psz_uri ) == -1 ) { - char* psz_tmp = malloc( - strlen(p_demux->p_sys->psz_base) + - strlen(psz_uri) +1 ); - if( !psz_tmp ) - { - msg_Err( p_demux, "out of memory"); - return VLC_FALSE; - } - sprintf( psz_tmp, "%s%s", - p_demux->p_sys->psz_base, psz_uri ); - free( psz_uri ); - psz_uri = psz_tmp; + free( psz_uri ); + FREE_ATT(); + return NULL; } - /* FIXME: We are leaking that one */ - p_new_input = input_ItemNewExt( p_playlist, psz_uri, - NULL, 0, NULL, -1 ); free( psz_uri ); - input_ItemCopyOptions( p_input_item, p_new_input ); - psz_uri = NULL; - FREE_ATT(); - p_handler = NULL; + psz_uri = psz_tmp; } - else - { - FREE_ATT(); - return VLC_FALSE; - } - } - else if( !strcmp( p_handler->name, "identifier" ) ) - { - p_demux->p_sys->i_identifier = atoi( psz_value ); + input_item_SetURI( p_new_input, psz_uri ); + free( psz_uri ); + input_item_CopyOptions( p_input_item, p_new_input ); + psz_uri = NULL; + FREE_ATT(); + p_handler = NULL; } else { @@ -585,7 +583,7 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE msg_Err( p_demux, "item not yet created at <%s>", psz_name ); FREE_ATT(); - return VLC_FALSE; + return false; } if( p_handler->pf_handler.smpl ) { @@ -603,23 +601,23 @@ static vlc_bool_t parse_track_node COMPLEX_INTERFACE /* unknown/unexpected xml node */ msg_Err( p_demux, "unexpected xml node %i", i_node ); FREE_ATT(); - return VLC_FALSE; + return false; } FREE_NAME(); } msg_Err( p_demux, "unexpected end of xml data" ); FREE_ATT(); - return VLC_FALSE; + return false; } /** * \brief handles the supported sub-elements */ -static vlc_bool_t set_item_info SIMPLE_INTERFACE +static bool set_item_info SIMPLE_INTERFACE { /* exit if setting is impossible */ if( !psz_name || !psz_value || !p_input ) - return VLC_FALSE; + return false; /* re-convert xml special characters inside psz_value */ @@ -658,26 +656,45 @@ static vlc_bool_t set_item_info SIMPLE_INTERFACE input_item_SetArtURL( p_input, psz_uri ); free( psz_uri ); } - return VLC_TRUE; + return true; } +/** + * \brief handles the elements + */ +static bool set_option SIMPLE_INTERFACE +{ + /* exit if setting is impossible */ + if( !psz_name || !psz_value || !p_input ) + return false; + + /* re-convert xml special characters inside psz_value */ + resolve_xml_special_chars( psz_value ); + + input_item_AddOption( p_input, psz_value, 0 ); + + return true; +} /** * \brief parse the extension node of a XSPF playlist */ -static vlc_bool_t parse_extension_node COMPLEX_INTERFACE +static bool parse_extension_node COMPLEX_INTERFACE { char *psz_name = NULL; char *psz_value = NULL; char *psz_title = NULL; char *psz_application = NULL; int i_node; + bool b_release_input_item = false; xml_elem_hnd_t *p_handler = NULL; input_item_t *p_new_input = NULL; xml_elem_hnd_t pl_elements[] = - { {"node", COMPLEX_CONTENT, {.cmplx = parse_extension_node} }, - {"item", COMPLEX_CONTENT, {.cmplx = parse_extitem_node} }, + { {"vlc:node", COMPLEX_CONTENT, {.cmplx = parse_extension_node} }, + {"vlc:item", COMPLEX_CONTENT, {.cmplx = parse_extitem_node} }, + {"vlc:id", SIMPLE_CONTENT, {NULL} }, + {"vlc:option", SIMPLE_CONTENT, {.smpl = set_option} }, {NULL, UNKNOWN_CONTENT, {NULL} } }; @@ -688,9 +705,9 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE psz_value = xml_ReaderValue( p_xml_reader ); if( !psz_name || !psz_value ) { - msg_Err( p_demux, "invalid xml stream @ " ); + msg_Err( p_demux, "invalid xml stream @ " ); FREE_ATT(); - return VLC_FALSE; + return false; } /* attribute: title */ if( !strcmp( psz_name, "title" ) ) @@ -705,25 +722,28 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE } /* unknown attribute */ else - msg_Warn( p_demux, "invalid <%s> attribute:\"%s\"", psz_element, psz_name ); + msg_Warn( p_demux, "invalid <%s> attribute:\"%s\"", psz_element, + psz_name ); FREE_ATT(); } /* attribute title is mandatory except for */ - if( !strcmp( psz_element, "node" ) ) + if( !strcmp( psz_element, "vlc:node" ) ) { if( !psz_title ) { - msg_Warn( p_demux, " requires \"title\" attribute" ); - return VLC_FALSE; + msg_Warn( p_demux, " requires \"title\" attribute" ); + return false; } - p_new_input = input_ItemNewWithType( VLC_OBJECT( p_playlist ), "vlc:nop", - psz_title, 0, NULL, -1, ITEM_TYPE_DIRECTORY ); + p_new_input = input_item_NewWithType( VLC_OBJECT( p_demux ), + "vlc://nop", psz_title, 0, NULL, -1, + ITEM_TYPE_DIRECTORY ); if( p_new_input ) { - input_ItemAddSubItem( p_input_item, p_new_input ); + input_item_AddSubItem( p_input_item, p_new_input ); p_input_item = p_new_input; + b_release_input_item = true; } free( psz_title ); } @@ -732,13 +752,13 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE if( !psz_application ) { msg_Warn( p_demux, " requires \"application\" attribute" ); - return VLC_FALSE; + return false; } else if( strcmp( psz_application, "http://www.videolan.org/vlc/playlist/0" ) ) { msg_Dbg( p_demux, "Skipping \"%s\" extension tag", psz_application ); free( psz_application ); - return VLC_FALSE; + return false; } } free( psz_application ); @@ -758,7 +778,8 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE { msg_Err( p_demux, "invalid xml stream" ); FREE_ATT(); - return VLC_FALSE; + if( b_release_input_item ) vlc_gc_decref( p_new_input ); + return false; } /* choose handler */ for( p_handler = pl_elements; @@ -768,14 +789,14 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE { msg_Err( p_demux, "unexpected element <%s>", psz_name ); FREE_ATT(); - return VLC_FALSE; + if( b_release_input_item ) vlc_gc_decref( p_new_input ); + return false; } FREE_NAME(); /* complex content is parsed in a separate function */ if( p_handler->type == COMPLEX_CONTENT ) { if( p_handler->pf_handler.cmplx( p_demux, - p_playlist, p_input_item, p_xml_reader, p_handler->name ) ) @@ -786,7 +807,8 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE else { FREE_ATT(); - return VLC_FALSE; + if( b_release_input_item ) vlc_gc_decref( p_new_input ); + return false; } } break; @@ -799,7 +821,8 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE { msg_Err( p_demux, "invalid xml stream" ); FREE_ATT(); - return VLC_FALSE; + if( b_release_input_item ) vlc_gc_decref( p_new_input ); + return false; } break; @@ -810,13 +833,15 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE { msg_Err( p_demux, "invalid xml stream" ); FREE_ATT(); - return VLC_FALSE; + if( b_release_input_item ) vlc_gc_decref( p_new_input ); + return false; } /* leave if the current parent node is terminated */ if( !strcmp( psz_name, psz_element ) ) { FREE_ATT(); - return VLC_TRUE; + if( b_release_input_item ) vlc_gc_decref( p_new_input ); + return true; } /* there MUST have been a start tag for that element name */ if( !p_handler || !p_handler->name @@ -825,10 +850,16 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE msg_Err( p_demux, "there's no open element left for <%s>", psz_name ); FREE_ATT(); - return VLC_FALSE; + if( b_release_input_item ) vlc_gc_decref( p_new_input ); + return false; } - if( p_handler->pf_handler.smpl ) + /* special tag */ + if( !strcmp( p_handler->name, "vlc:id" ) ) + { + p_demux->p_sys->i_track_id = atoi( psz_value ); + } + else if( p_handler->pf_handler.smpl ) { p_handler->pf_handler.smpl( p_input_item, p_handler->name, psz_value ); @@ -841,23 +872,25 @@ static vlc_bool_t parse_extension_node COMPLEX_INTERFACE /* unknown/unexpected xml node */ msg_Err( p_demux, "unexpected xml node %i", i_node ); FREE_ATT(); - return VLC_FALSE; + if( b_release_input_item ) vlc_gc_decref( p_new_input ); + return false; } FREE_NAME(); } - return VLC_FALSE; + if( b_release_input_item ) vlc_gc_decref( p_new_input ); + return false; } /** * \brief parse the extension item node of a XSPF playlist */ -static vlc_bool_t parse_extitem_node COMPLEX_INTERFACE +static bool parse_extitem_node COMPLEX_INTERFACE { - VLC_UNUSED(p_playlist); VLC_UNUSED(psz_element); + VLC_UNUSED(psz_element); input_item_t *p_new_input = NULL; char *psz_name = NULL; char *psz_value = NULL; - int i_href = -1; + int i_tid = -1; /* read all extension item attributes */ while( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS ) @@ -866,55 +899,56 @@ static vlc_bool_t parse_extitem_node COMPLEX_INTERFACE psz_value = xml_ReaderValue( p_xml_reader ); if( !psz_name || !psz_value ) { - msg_Err( p_demux, "invalid xml stream @ " ); + msg_Err( p_demux, "invalid xml stream @ " ); FREE_ATT(); - return VLC_FALSE; + return false; } /* attribute: href */ - if( !strcmp( psz_name, "href" ) ) + if( !strcmp( psz_name, "tid" ) ) { - i_href = atoi( psz_value ); + i_tid = atoi( psz_value ); } /* unknown attribute */ else - msg_Warn( p_demux, "invalid attribute:\"%s\"", psz_name); + msg_Warn( p_demux, "invalid attribute:\"%s\"", psz_name); FREE_ATT(); } /* attribute href is mandatory */ - if( i_href < 0 ) + if( i_tid < 0 ) { - msg_Warn( p_demux, " requires \"href\" attribute" ); - return VLC_FALSE; + msg_Warn( p_demux, " requires \"tid\" attribute" ); + return false; } - if( i_href >= p_demux->p_sys->i_tracklist_entries ) + if( i_tid >= p_demux->p_sys->i_tracklist_entries ) { - msg_Warn( p_demux, "invalid \"href\" attribute" ); - return VLC_FALSE; + msg_Warn( p_demux, "invalid \"tid\" attribute" ); + return false; } - p_new_input = p_demux->p_sys->pp_tracklist[ i_href ]; + p_new_input = p_demux->p_sys->pp_tracklist[ i_tid ]; if( p_new_input ) { - input_ItemAddSubItem( p_input_item, p_new_input ); - p_demux->p_sys->pp_tracklist[i_href] = NULL; + input_item_AddSubItem( p_input_item, p_new_input ); + vlc_gc_decref( p_new_input ); + p_demux->p_sys->pp_tracklist[i_tid] = NULL; } /* kludge for #1293 - XTAG sends ENDELEM for self closing tag */ /* (libxml sends NONE) */ xml_ReaderRead( p_xml_reader ); - return VLC_TRUE; + return true; } /** * \brief skips complex element content that we can't manage */ -static vlc_bool_t skip_element COMPLEX_INTERFACE +static bool skip_element COMPLEX_INTERFACE { - VLC_UNUSED(p_demux); VLC_UNUSED(p_playlist); VLC_UNUSED(p_input_item); + VLC_UNUSED(p_demux); VLC_UNUSED(p_input_item); char *psz_endname; while( xml_ReaderRead( p_xml_reader ) == 1 ) @@ -923,15 +957,15 @@ static vlc_bool_t skip_element COMPLEX_INTERFACE { psz_endname = xml_ReaderName( p_xml_reader ); if( !psz_endname ) - return VLC_FALSE; + return false; if( !strcmp( psz_element, psz_endname ) ) { free( psz_endname ); - return VLC_TRUE; + return true; } else free( psz_endname ); } } - return VLC_FALSE; + return false; }