X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fplaylist%2Fb4s.c;h=0d550c4cafc27f0ff6e919e1d60085782c41cc71;hb=15172e6867ea91a40628edea89dce5d4d7039d79;hp=591f5ad70bbcea70bd42939b85748359e46a5ae6;hpb=2d824acd426d7f4c5169083ce9966b5ed4e15da3;p=vlc diff --git a/modules/demux/playlist/b4s.c b/modules/demux/playlist/b4s.c index 591f5ad70b..0d550c4caf 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 @@ -24,20 +24,19 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* isspace() */ -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include #include "playlist.h" -#include "vlc_xml.h" struct demux_sys_t { - char *psz_prefix; - xml_t *p_xml; - xml_reader_t *p_xml_reader; }; /***************************************************************************** @@ -45,68 +44,56 @@ 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 ); /***************************************************************************** * Import_B4S: main import function *****************************************************************************/ -int E_(Import_B4S)( vlc_object_t *p_this ) +int Import_B4S( vlc_object_t *p_this ) { - DEMUX_BY_EXTENSION_OR_FORCED_MSG( ".b4s", "b4s-open", + DEMUX_BY_EXTENSION_OR_FORCED_MSG( ".b4s", "b4s-open", "using B4S playlist reader" ); - p_demux->p_sys->psz_prefix = E_(FindPrefix)( p_demux ); - p_demux->p_sys->p_xml = NULL; - p_demux->p_sys->p_xml_reader = NULL; return VLC_SUCCESS; } /***************************************************************************** * Deactivate: frees unused data *****************************************************************************/ -void E_(Close_B4S)( vlc_object_t *p_this ) +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; - if( p_sys->psz_prefix ) free( p_sys->psz_prefix ); - if( p_sys->p_xml_reader ) xml_ReaderDelete( p_sys->p_xml, p_sys->p_xml_reader ); - if( p_sys->p_xml ) xml_Delete( p_sys->p_xml ); free( p_sys ); } static int Demux( demux_t *p_demux ) { - demux_sys_t *p_sys = p_demux->p_sys; - int i_ret; + int i_ret = -1; - xml_t *p_xml; - xml_reader_t *p_xml_reader; + xml_reader_t *p_xml_reader = NULL; char *psz_elname = NULL; - int i_type; - char *psz_mrl = NULL, *psz_name = NULL, *psz_genre = NULL; + 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; - INIT_PLAYLIST_STUFF; - - p_xml = p_sys->p_xml = xml_Create( p_demux ); - if( !p_xml ) return -1; + input_item_t *p_current_input = GetCurrentItem(p_demux); psz_elname = stream_ReadLine( p_demux->s ); - if( psz_elname ) free( psz_elname ); - psz_elname = 0; + free( psz_elname ); + psz_elname = NULL; - p_xml_reader = xml_ReaderCreate( p_xml, p_demux->s ); - if( !p_xml_reader ) return -1; - p_sys->p_xml_reader = p_xml_reader; + p_xml_reader = xml_ReaderCreate( p_demux, p_demux->s ); + if( !p_xml_reader ) + goto end; /* xml */ /* check root node */ if( xml_ReaderRead( p_xml_reader ) != 1 ) { msg_Err( p_demux, "invalid file (no root node)" ); - vlc_object_release( p_playlist ); - return -1; + goto end; } if( xml_ReaderNodeType( p_xml_reader ) != XML_READER_STARTELEM || @@ -115,11 +102,9 @@ static int Demux( demux_t *p_demux ) { msg_Err( p_demux, "invalid root node %i, %s", xml_ReaderNodeType( p_xml_reader ), psz_elname ); - if( psz_elname ) free( psz_elname ); - vlc_object_release( p_playlist ); - return -1; + goto end; } - free( psz_elname ); + FREENULL( psz_elname ); /* root node should not have any attributes, and should only * contain the "playlist node */ @@ -130,31 +115,35 @@ static int Demux( demux_t *p_demux ) if( i_ret != 1 ) { msg_Err( p_demux, "invalid file (no child node)" ); - return -1; + goto end; } if( ( psz_elname = xml_ReaderName( p_xml_reader ) ) == NULL || strcmp( psz_elname, "playlist" ) ) { msg_Err( p_demux, "invalid child node %s", psz_elname ); - if( psz_elname ) free( psz_elname ); - return -1; + goto end; } - free( psz_elname ); psz_elname = 0; + FREENULL( psz_elname ); // Read the attributes while( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS ) { char *psz_name = xml_ReaderName( p_xml_reader ); char *psz_value = xml_ReaderValue( p_xml_reader ); - if( !psz_name || !psz_value ) return -1; + 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" ) ) { - playlist_ItemSetName( p_current, psz_value ); + input_item_SetName( p_current_input, psz_value ); } else { @@ -165,43 +154,48 @@ static int Demux( demux_t *p_demux ) free( psz_value ); } + p_subitems = input_item_node_Create( p_current_input ); + while( (i_ret = xml_ReaderRead( p_xml_reader )) == 1 ) { // Get the node type - i_type = xml_ReaderNodeType( p_xml_reader ); - switch( i_type ) + switch( xml_ReaderNodeType( p_xml_reader ) ) { // Error case -1: - return -1; - break; + goto end; case XML_READER_STARTELEM: { // Read the element name - if( psz_elname ) free( psz_elname ); + free( psz_elname ); psz_elname = xml_ReaderName( p_xml_reader ); - if( !psz_elname ) return -1; - + if( !psz_elname ) + goto end; // Read the attributes while( xml_ReaderNextAttr( p_xml_reader ) == VLC_SUCCESS ) { char *psz_name = xml_ReaderName( p_xml_reader ); char *psz_value = xml_ReaderValue( p_xml_reader ); - if( !psz_name || !psz_value ) return -1; + if( !psz_name || !psz_value ) + { + free( psz_name ); + free( psz_value ); + goto end; + } if( !strcmp( psz_elname, "entry" ) && !strcmp( psz_name, "Playstring" ) ) { - psz_mrl = strdup( psz_value ); + psz_mrl = psz_value; } else { - msg_Warn( p_demux, "unexpected attribure %s in element %s", + msg_Warn( p_demux, "unexpected attribute %s in element %s", psz_name, psz_elname ); + free( psz_value ); } free( psz_name ); - free( psz_value ); } break; } @@ -215,34 +209,34 @@ static int Demux( demux_t *p_demux ) } if( !strcmp( psz_elname, "Name" ) ) { - psz_name = strdup( psz_text ); + psz_title = psz_text; } else if( !strcmp( psz_elname, "Genre" ) ) { - psz_genre = strdup( psz_text ); + psz_genre = psz_text; } else if( !strcmp( psz_elname, "Nowplaying" ) ) { - psz_now = strdup( psz_text ); + psz_now = psz_text; } else if( !strcmp( psz_elname, "Listeners" ) ) { - psz_listeners = strdup( psz_text ); + psz_listeners = psz_text; } else if( !strcmp( psz_elname, "Bitrate" ) ) { - psz_bitrate = strdup( psz_text ); + psz_bitrate = psz_text; } else if( !strcmp( psz_elname, "" ) ) { - ; + free( psz_text ); } else { msg_Warn( p_demux, "unexpected text in element '%s'", psz_elname ); + free( psz_text ); } - free( psz_text ); break; } // End element @@ -251,25 +245,23 @@ static int Demux( demux_t *p_demux ) // Read the element name free( psz_elname ); psz_elname = xml_ReaderName( p_xml_reader ); - if( !psz_elname ) return -1; + if( !psz_elname ) + goto end; if( !strcmp( psz_elname, "entry" ) ) { - p_input = input_ItemNewExt( p_playlist, psz_mrl, psz_name, - 0, NULL, -1 ); + p_input = input_item_New( p_demux, psz_mrl, psz_title ); if( psz_now ) - vlc_meta_SetNowPlaying( p_input->p_meta, psz_now ); + input_item_SetNowPlaying( p_input, psz_now ); if( psz_genre ) - vlc_meta_SetGenre( p_input->p_meta, psz_genre ); + input_item_SetGenre( p_input, psz_genre ); if( psz_listeners ) - msg_Err( p_playlist, "Unsupported meta listeners" ); + msg_Err( p_demux, "Unsupported meta listeners" ); if( psz_bitrate ) - msg_Err( p_playlist, "Unsupported meta bitrate" ); + msg_Err( p_demux, "Unsupported meta bitrate" ); - playlist_AddWhereverNeeded( p_playlist, p_input, p_current, - p_item_in_category, (i_parent_id > 0 ) ? VLC_TRUE: - VLC_FALSE, PLAYLIST_APPEND ); - - FREENULL( psz_name ); + input_item_node_AppendItem( p_subitems, p_input ); + vlc_gc_decref( p_input ); + FREENULL( psz_title ); FREENULL( psz_mrl ); FREENULL( psz_genre ); FREENULL( psz_bitrate ); @@ -277,7 +269,7 @@ static int Demux( demux_t *p_demux ) FREENULL( psz_now ); } free( psz_elname ); - psz_elname = strdup(""); + psz_elname = strdup( "" ); break; } @@ -287,38 +279,27 @@ static int Demux( demux_t *p_demux ) if( i_ret != 0 ) { msg_Warn( p_demux, "error while parsing data" ); + i_ret = 0; /* Needed for correct operation of go back */ } - HANDLE_PLAY_AND_RELEASE; - return VLC_SUCCESS; +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_reader ); + return i_ret; } static int Control( demux_t *p_demux, int i_query, va_list args ) { + VLC_UNUSED(p_demux); VLC_UNUSED(i_query); VLC_UNUSED(args); return VLC_EGENERIC; } -/** - * 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; -} - static int IsWhitespace( char *psz_string ) { while( *psz_string ) @@ -326,9 +307,9 @@ static int IsWhitespace( char *psz_string ) if( *psz_string != ' ' && *psz_string != '\t' && *psz_string != '\r' && *psz_string != '\n' ) { - return VLC_FALSE; + return false; } psz_string++; } - return VLC_TRUE; + return true; }