X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fplaylist%2Fb4s.c;h=ed1c765bb09107ff541ad4abacd7962889b5fe5b;hb=0e17b717feed5b870b4fd1707399bf1e3688e7fe;hp=70234dae0339fdf2f718c6c7b0fce380d1c8a170;hpb=cd1bd86ed5071a8a61652484aa539f1bce99c206;p=vlc diff --git a/modules/demux/playlist/b4s.c b/modules/demux/playlist/b4s.c index 70234dae03..ed1c765bb0 100644 --- a/modules/demux/playlist/b4s.c +++ b/modules/demux/playlist/b4s.c @@ -1,7 +1,7 @@ /***************************************************************************** * b4s.c : B4S playlist format import ***************************************************************************** - * Copyright (C) 2005 the VideoLAN team + * Copyright (C) 2005-2009 the VideoLAN team * $Id$ * * Authors: Sigmund Augdal Helberg @@ -31,14 +31,12 @@ #include #include -#include #include #include "playlist.h" struct demux_sys_t { - char *psz_prefix; }; /***************************************************************************** @@ -46,8 +44,7 @@ struct demux_sys_t *****************************************************************************/ static int Demux( demux_t *p_demux); static int Control( demux_t *p_demux, int i_query, va_list args ); -//static char *GetNextToken(char *psz_cur_string); -static int IsWhitespace( char *psz_string ); +static bool IsWhitespace( const char *psz_string ); /***************************************************************************** * Import_B4S: main import function @@ -56,7 +53,6 @@ int Import_B4S( vlc_object_t *p_this ) { DEMUX_BY_EXTENSION_OR_FORCED_MSG( ".b4s", "b4s-open", "using B4S playlist reader" ); - p_demux->p_sys->psz_prefix = FindPrefix( p_demux ); return VLC_SUCCESS; } @@ -68,7 +64,6 @@ void Close_B4S( vlc_object_t *p_this ) demux_t *p_demux = (demux_t *)p_this; demux_sys_t *p_sys = p_demux->p_sys; - free( p_sys->psz_prefix ); free( p_sys ); } @@ -76,185 +71,133 @@ static int Demux( demux_t *p_demux ) { int i_ret = -1; - xml_t *p_xml; xml_reader_t *p_xml_reader = NULL; char *psz_elname = NULL; + const char *node; input_item_t *p_input; char *psz_mrl = NULL, *psz_title = NULL, *psz_genre = NULL; char *psz_now = NULL, *psz_listeners = NULL, *psz_bitrate = NULL; + input_item_node_t *p_subitems = NULL; input_item_t *p_current_input = GetCurrentItem(p_demux); - p_xml = xml_Create( p_demux ); - if( !p_xml ) - goto end; - - psz_elname = stream_ReadLine( p_demux->s ); - free( psz_elname ); - psz_elname = NULL; + free( stream_ReadLine( p_demux->s ) ); - 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; + return -1; /* xml */ /* check root node */ - if( xml_ReaderRead( p_xml_reader ) != 1 ) + if( xml_ReaderNextNode( p_xml_reader, &node ) != XML_READER_STARTELEM ) { msg_Err( p_demux, "invalid file (no root node)" ); goto end; } - if( xml_ReaderNodeType( p_xml_reader ) != XML_READER_STARTELEM || - ( psz_elname = xml_ReaderName( p_xml_reader ) ) == NULL || - strcmp( psz_elname, "WinampXML" ) ) + if( strcmp( node, "WinampXML" ) ) { - msg_Err( p_demux, "invalid root node %i, %s", - xml_ReaderNodeType( p_xml_reader ), psz_elname ); + msg_Err( p_demux, "invalid root node: %s", node ); goto end; } - FREENULL( psz_elname ); /* root node should not have any attributes, and should only * contain the "playlist node */ /* Skip until 1st child node */ - while( (i_ret = xml_ReaderRead( p_xml_reader )) == 1 && - xml_ReaderNodeType( p_xml_reader ) != XML_READER_STARTELEM ); - if( i_ret != 1 ) - { - msg_Err( p_demux, "invalid file (no child node)" ); - goto end; - } + while( (i_ret = xml_ReaderNextNode( p_xml_reader, &node )) != XML_READER_STARTELEM ) + if( i_ret <= 0 ) + { + msg_Err( p_demux, "invalid file (no child node)" ); + goto end; + } - if( ( psz_elname = xml_ReaderName( p_xml_reader ) ) == NULL || - strcmp( psz_elname, "playlist" ) ) + if( strcmp( node, "playlist" ) ) { - msg_Err( p_demux, "invalid child node %s", psz_elname ); + msg_Err( p_demux, "invalid child node %s", node ); goto end; } - FREENULL( psz_elname ); // Read the attributes - while( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS ) + const char *attr, *value; + while( (attr = xml_ReaderNextAttr( p_xml_reader, &value )) != NULL ) { - char *psz_name = xml_ReaderName( p_xml_reader ); - char *psz_value = xml_ReaderValue( p_xml_reader ); - if( !psz_name || !psz_value ) - { - free( psz_name ); - free( psz_value ); - goto end; - } - if( !strcmp( psz_name, "num_entries" ) ) - { - msg_Dbg( p_demux, "playlist has %d entries", atoi(psz_value) ); - } - else if( !strcmp( psz_name, "label" ) ) - { - input_item_SetName( p_current_input, psz_value ); - } + if( !strcmp( attr, "num_entries" ) ) + msg_Dbg( p_demux, "playlist has %d entries", atoi(value) ); + else if( !strcmp( attr, "label" ) ) + input_item_SetName( p_current_input, value ); else - { msg_Warn( p_demux, "stray attribute %s with value %s in element" - " 'playlist'", psz_name, psz_value ); - } - free( psz_name ); - free( psz_value ); + " ", attr, value ); } - while( (i_ret = xml_ReaderRead( p_xml_reader )) == 1 ) + p_subitems = input_item_node_Create( p_current_input ); + + while( (i_ret = xml_ReaderNextNode( p_xml_reader, &node )) > 0 ) { // Get the node type - switch( xml_ReaderNodeType( p_xml_reader ) ) + switch( i_ret ) { - // Error - case -1: - goto end; - case XML_READER_STARTELEM: { // Read the element name free( psz_elname ); - psz_elname = xml_ReaderName( p_xml_reader ); - if( !psz_elname ) + psz_elname = strdup( node ); + if( unlikely(!psz_elname) ) goto end; // Read the attributes - while( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS ) + while( (attr = xml_ReaderNextAttr( p_xml_reader, &value )) ) { - char *psz_name = xml_ReaderName( p_xml_reader ); - char *psz_value = xml_ReaderValue( p_xml_reader ); - if( !psz_name || !psz_value ) - { - free( psz_name ); - free( psz_value ); - goto end; - } if( !strcmp( psz_elname, "entry" ) && - !strcmp( psz_name, "Playstring" ) ) + !strcmp( attr, "Playstring" ) ) { - psz_mrl = psz_value; + free( psz_mrl ); + psz_mrl = strdup( value ); } else { - msg_Warn( p_demux, "unexpected attribure %s in element %s", - psz_name, psz_elname ); - free( psz_value ); + msg_Warn( p_demux, "unexpected attribute %s in <%s>", + attr, psz_elname ); } - free( psz_name ); } break; } + case XML_READER_TEXT: { - char *psz_text = xml_ReaderValue( p_xml_reader ); - if( IsWhitespace( psz_text ) ) - { - free( psz_text ); + char **p; + + if( psz_elname == NULL ) + break; + if( IsWhitespace( node ) ) break; - } if( !strcmp( psz_elname, "Name" ) ) - { - psz_title = psz_text; - } + p = &psz_title; else if( !strcmp( psz_elname, "Genre" ) ) - { - psz_genre = psz_text; - } + p = &psz_genre; else if( !strcmp( psz_elname, "Nowplaying" ) ) - { - psz_now = psz_text; - } + p = &psz_now; else if( !strcmp( psz_elname, "Listeners" ) ) - { - psz_listeners = psz_text; - } + p = &psz_listeners; else if( !strcmp( psz_elname, "Bitrate" ) ) - { - psz_bitrate = psz_text; - } - else if( !strcmp( psz_elname, "" ) ) - { - free( psz_text ); - } + p = &psz_bitrate; else { - msg_Warn( p_demux, "unexpected text in element '%s'", + msg_Warn( p_demux, "unexpected text in element <%s>", psz_elname ); - free( psz_text ); + break; } + free( *p ); + *p = strdup( node ); break; } + // End element case XML_READER_ENDELEM: { // Read the element name - free( psz_elname ); - psz_elname = xml_ReaderName( p_xml_reader ); - if( !psz_elname ) - goto end; - if( !strcmp( psz_elname, "entry" ) ) + if( !strcmp( node, "entry" ) ) { p_input = input_item_New( p_demux, psz_mrl, psz_title ); if( psz_now ) @@ -266,7 +209,7 @@ static int Demux( demux_t *p_demux ) if( psz_bitrate ) msg_Err( p_demux, "Unsupported meta bitrate" ); - input_item_AddSubItem( p_current_input, p_input ); + input_item_node_AppendItem( p_subitems, p_input ); vlc_gc_decref( p_input ); FREENULL( psz_title ); FREENULL( psz_mrl ); @@ -275,15 +218,13 @@ static int Demux( demux_t *p_demux ) FREENULL( psz_listeners ); FREENULL( psz_now ); } - free( psz_elname ); - psz_elname = strdup( "" ); - + FREENULL( psz_elname ); break; } } } - if( i_ret != 0 ) + if( i_ret < 0 ) { msg_Warn( p_demux, "error while parsing data" ); i_ret = 0; /* Needed for correct operation of go back */ @@ -292,11 +233,12 @@ static int Demux( demux_t *p_demux ) end: free( psz_elname ); + if( p_subitems ) + input_item_node_PostAndDelete( p_subitems ); + vlc_gc_decref( p_current_input ); if( p_xml_reader ) - xml_ReaderDelete( p_xml, p_xml_reader ); - if( p_xml ) - xml_Delete( p_xml ); + xml_ReaderDelete( p_xml_reader ); return i_ret; } @@ -306,39 +248,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) return VLC_EGENERIC; } -#if 0 -/** - * Get a in-string pointer to the start of the next token from a - * string terminating the pointer returned by a previous call. - * - * \param psz_cur_string The string to search for the token from - * \return a pointer to withing psz_cur_string, or NULL if no token - * was found - * \note The returned pointer may contain more than one - * token, Run GetNextToken once more to terminate the token properly - */ -static char *GetNextToken(char *psz_cur_string) { - while (*psz_cur_string && !isspace(*psz_cur_string)) - psz_cur_string++; - if (!*psz_cur_string) - return NULL; - *psz_cur_string++ = '\0'; - while (*psz_cur_string && isspace(*psz_cur_string)) - psz_cur_string++; - return psz_cur_string; -} -#endif - -static int IsWhitespace( char *psz_string ) +static bool IsWhitespace( const char *psz_string ) { - while( *psz_string ) - { - if( *psz_string != ' ' && *psz_string != '\t' && *psz_string != '\r' && - *psz_string != '\n' ) - { - return false; - } - psz_string++; - } - return true; + psz_string += strspn( psz_string, " \t\r\n" ); + return !*psz_string; }