X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fplaylist%2Fb4s.c;h=e6ebe08375ec483bdab9ff5883e5b102f862bcf9;hb=bce1242424ad90eaa159231f452f6e6fba87af05;hp=272490d4f49111ed99977e5814b3a8b6898a7b35;hpb=ed0b72e3714ad87cb4e10b9a7239e19b9ef0724e;p=vlc diff --git a/modules/demux/playlist/b4s.c b/modules/demux/playlist/b4s.c index 272490d4f4..e6ebe08375 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,22 +24,20 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include /* malloc(), free() */ -#include /* isspace() */ -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include -#include /* ENOMEM */ #include "playlist.h" -#include "vlc_xml.h" struct demux_sys_t { char *psz_prefix; - xml_t *p_xml; - xml_reader_t *p_xml_reader; }; /***************************************************************************** @@ -47,96 +45,62 @@ 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_t *p_demux = (demux_t *)p_this; - demux_sys_t *p_sys; - - char *psz_ext; - - psz_ext = strrchr ( p_demux->psz_path, '.' ); - - if( ( psz_ext && !strcasecmp( psz_ext, ".b4s") ) || - ( p_demux->psz_demux && !strcmp(p_demux->psz_demux, "b4s-open") ) ) - { - ; - } - else - { - return VLC_EGENERIC; - } - msg_Dbg( p_demux, "using b4s playlist import"); - - p_demux->pf_control = Control; - p_demux->pf_demux = Demux; - p_demux->p_sys = p_sys = malloc( sizeof(demux_sys_t) ); - if( p_sys == NULL ) - { - msg_Err( p_demux, "out of memory" ); - return VLC_ENOMEM; - } - p_sys->psz_prefix = E_(FindPrefix)( p_demux ); - p_sys->p_xml = NULL; - p_sys->p_xml_reader = NULL; - + 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; } /***************************************************************************** * 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->psz_prefix ); free( p_sys ); } static int Demux( demux_t *p_demux ) { - demux_sys_t *p_sys = p_demux->p_sys; - playlist_item_t *p_item; - playlist_item_t *p_bitrate = NULL, *p_genre = NULL; - - int i_ret, i_parent_id; + 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; - INIT_PLAYLIST_STUFF; + input_item_t *p_current_input = GetCurrentItem(p_demux); - p_xml = p_sys->p_xml = xml_Create( p_demux ); - if( !p_xml ) return -1; + p_xml = xml_Create( p_demux ); + if( !p_xml ) + goto end; 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; + 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 || @@ -145,11 +109,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 */ @@ -160,31 +122,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 { @@ -198,40 +164,43 @@ static int Demux( demux_t *p_demux ) 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", psz_name, psz_elname ); + free( psz_value ); } free( psz_name ); - free( psz_value ); } break; } @@ -245,34 +214,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 @@ -281,35 +250,31 @@ 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" ); - - playlist_AddWhereverNeeded( p_playlist, p_input, p_current, - p_item_in_category, (i_parent_id > 0 ) ? VLC_TRUE: - VLC_FALSE, PLAYLIST_APPEND ); - -#define FREE(a) if( a ) free( a ); a = NULL; - FREE( psz_name ); - FREE( psz_mrl ); - FREE( psz_genre ); - FREE( psz_bitrate ); - FREE( psz_listeners ); - FREE( psz_now ); -#undef FREE + msg_Err( p_demux, "Unsupported meta bitrate" ); + + input_item_AddSubItem( p_current_input, p_input ); + vlc_gc_decref( p_input ); + FREENULL( psz_title ); + FREENULL( psz_mrl ); + FREENULL( psz_genre ); + FREENULL( psz_bitrate ); + FREENULL( psz_listeners ); + FREENULL( psz_now ); } free( psz_elname ); - psz_elname = strdup(""); + psz_elname = strdup( "" ); break; } @@ -319,38 +284,26 @@ 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 ); + + vlc_gc_decref( p_current_input ); + if( p_xml_reader ) + xml_ReaderDelete( p_xml, p_xml_reader ); + if( p_xml ) + xml_Delete( p_xml ); + 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 ) @@ -358,9 +311,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; }