X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fplaylist%2Fram.c;h=1f6e5277be7ff96dcec3f537cdad98c5b7410e5c;hb=d9f4825a3fa8b2193a14d41d6f01db1eaa6f3f7a;hp=57f94198b98eb419d55a62b76a7f8bcea3d2a8a1;hpb=0d358ba08aec4c4ee317de64cd7dc5c63394170f;p=vlc diff --git a/modules/demux/playlist/ram.c b/modules/demux/playlist/ram.c index 57f94198b9..1f6e5277be 100644 --- a/modules/demux/playlist/ram.c +++ b/modules/demux/playlist/ram.c @@ -49,10 +49,9 @@ http://service.real.com/help/library/guides/realone/IntroGuide/HTML/htmfiles/ram #include #include +#include #include -#include - #include "playlist.h" struct demux_sys_t @@ -65,8 +64,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 bool ContainsURL( demux_t *p_demux ); -static void ParseClipInfo( char * psz_clipinfo, char **ppsz_artist, char **ppsz_title, +static void ParseClipInfo( const char * psz_clipinfo, char **ppsz_artist, char **ppsz_title, char **ppsz_album, char **ppsz_genre, char **ppsz_year, char **ppsz_cdnum, char **ppsz_comments ); @@ -78,8 +76,7 @@ static void ParseClipInfo( char * psz_clipinfo, char **ppsz_artist, char **ppsz_ int Import_RAM( vlc_object_t *p_this ) { demux_t *p_demux = (demux_t *)p_this; - const uint8_t *p_peek; - CHECK_PEEK( p_peek, 8 ); + if(! demux_IsPathExtension( p_demux, ".ram" ) || demux_IsPathExtension( p_demux, ".rm" ) ) return VLC_EGENERIC; @@ -101,40 +98,12 @@ void Close_RAM( vlc_object_t *p_this ) free( p_demux->p_sys ); } -/** - * Returns a UTF8 encoded version of the string - * @param str: input string - * @return pointer to UTF8 string - */ -static inline char *MaybeFromLocaleDup (const char *str) -{ - if (str == NULL) - return NULL; - - return IsUTF8 (str) ? strdup (str) : FromLocaleDup (str); -} - -/** - * Converts a string to UTF8 encoding - * @param str: input string - */ -static inline void MaybeFromLocaleRep (char **str) -{ - char *const orig_str = *str; - - if ((orig_str != NULL) && !IsUTF8 (orig_str)) - { - *str = FromLocaleDup (orig_str); - free (orig_str); - } -} - /** * Skips blanks in a given buffer * @param s: input string * @param i_strlen: length of the buffer */ -static char *SkipBlanks(char *s, size_t i_strlen ) +static const char *SkipBlanks( const char *s, size_t i_strlen ) { while( i_strlen > 0 ) { switch( *s ) @@ -159,7 +128,7 @@ static char *SkipBlanks(char *s, size_t i_strlen ) * @param i_strlen: length of the buffer * @return time in seconds */ -static int ParseTime(char *s, size_t i_strlen) +static int ParseTime( const char *s, size_t i_strlen) { // need to parse hour:minutes:sec.fraction string int result = 0; @@ -235,7 +204,6 @@ static int ParseTime(char *s, size_t i_strlen) static int Demux( demux_t *p_demux ) { char *psz_line; - char *psz_name = NULL; char *psz_artist = NULL, *psz_album = NULL, *psz_genre = NULL, *psz_year = NULL; char *psz_author = NULL, *psz_title = NULL, *psz_copyright = NULL, *psz_cdnum = NULL, *psz_comments = NULL; int i_parsed_duration = 0; @@ -245,7 +213,9 @@ static int Demux( demux_t *p_demux ) bool b_cleanup = false; input_item_t *p_input; - INIT_PLAYLIST_STUFF; + input_item_t *p_current_input = GetCurrentItem(p_demux); + + input_item_node_t *p_subitems = input_item_node_Create( p_current_input ); psz_line = stream_ReadLine( p_demux->s ); while( psz_line ) @@ -262,58 +232,47 @@ static int Demux( demux_t *p_demux ) } else if( *psz_parse ) { - char *psz_mrl, *psz_option_start, *psz_option_next, *psz_temp_mrl, *psz_option; + char *psz_mrl, *psz_option_next, *psz_option; char *psz_param, *psz_value; - if( !psz_name || !*psz_name ) - { - /* Default filename as name for relative entries - TODO: Currently not used. Either remove or use */ - psz_name = MaybeFromLocaleDup( psz_parse ); - } /* Get the MRL from the file. Note that this might contain parameters of form ?param1=value1¶m2=value2 in a RAM file */ psz_mrl = ProcessMRL( psz_parse, p_demux->p_sys->psz_prefix ); - MaybeFromLocaleRep( &psz_mrl ); b_cleanup = true; if ( !psz_mrl ) goto error; /* We have the MRL, now we have to check for options and parse them from MRL */ - psz_temp_mrl = strdup( psz_mrl ); - psz_option_start = strchr( psz_temp_mrl, '?' ); /* Look for start of options */ - if( psz_option_start ) + psz_option = strchr( psz_mrl, '?' ); /* Look for start of options */ + if( psz_option ) { - psz_option_start++; - psz_option_next = psz_option_start; + /* Remove options from MRL + because VLC can't get the file otherwise */ + *psz_option = '\0'; + psz_option++; + psz_option_next = psz_option; while( 1 ) /* Process each option */ { /* Look for end of first option which maybe a & or \0 */ - psz_option_start = psz_option_next; - psz_option_next = strchr( psz_option_start, '&' ); + psz_option = psz_option_next; + psz_option_next = strchr( psz_option, '&' ); if( psz_option_next ) { *psz_option_next = '\0'; psz_option_next++; } else - psz_option_next = strchr( psz_option_start, '\0' ); + psz_option_next = strchr( psz_option, '\0' ); /* Quit if options are over */ - if( psz_option_next == psz_option_start ) + if( psz_option_next == psz_option ) break; - psz_option = MaybeFromLocaleDup( psz_option_start ); - /* If this option is screwed up, try the next one */ - if( !psz_option ) - continue; /* Parse out param and value */ psz_param = psz_option; - if( strchr( psz_option, '=' ) ) - { - psz_value = strchr( psz_option, '=' ) + 1; - *(strchr( psz_option, '=' )) = '\0'; - } - else + psz_value = strchr( psz_option, '=' ); + if( psz_value == NULL ) break; + *psz_value = '\0'; + psz_value++; /* Take action based on parameter value in the below if else structure */ /* TODO: Remove any quotes surrounding values if required */ @@ -324,62 +283,61 @@ static int Demux( demux_t *p_demux ) &psz_cdnum, &psz_comments ); /* clipinfo has various sub parameters, which is parsed by this function */ } else if( !strcmp( psz_param, "author" ) ) - psz_author = strdup(psz_value); + { + psz_author = decode_URI_duplicate(psz_value); + EnsureUTF8( psz_author ); + } else if( !strcmp( psz_param, "start" ) ) { - i_start = ParseTime( strdup( psz_value ),strlen( psz_value ) ); - char * temp = NULL; + i_start = ParseTime( psz_value, strlen( psz_value ) ); + char *temp; if( i_start ) { - if( asprintf( &temp, ":start-time=%d", i_start ) == -1 ) - *(temp) = NULL; - if( temp && *temp ) + if( asprintf( &temp, ":start-time=%d", i_start ) != -1 ) INSERT_ELEM( ppsz_options, i_options, i_options, temp ); } } else if( !strcmp( psz_param, "end" ) ) { - i_stop = ParseTime( strdup( psz_value ), strlen( psz_value ) ); - char * temp = NULL; + i_stop = ParseTime( psz_value, strlen( psz_value ) ); + char *temp; if( i_stop ) { - if( asprintf( &temp, ":stop-time=%d", i_stop ) == -1 ) - *(temp) = NULL; - if( temp && *temp ) + if( asprintf( &temp, ":stop-time=%d", i_stop ) != -1 ) INSERT_ELEM( ppsz_options, i_options, i_options, temp ); } } else if( !strcmp( psz_param, "title" ) ) - psz_title = strdup(psz_value); + { + psz_title = decode_URI_duplicate(psz_value); + EnsureUTF8( psz_title ); + } else if( !strcmp( psz_param, "copyright" ) ) - psz_copyright = strdup(psz_value); + { + psz_copyright = decode_URI_duplicate(psz_value); + EnsureUTF8( psz_copyright ); + } else { /* TODO: insert option anyway? Currently ignores*/ /* INSERT_ELEM( ppsz_options, i_options, i_options, psz_option ); */ } - - free( psz_option ); } - - *(strchr( psz_mrl, '?' )) = '\0'; /* Remove options from MRL because VLC can't get the file otherwise */ } - free( psz_temp_mrl ); - /* Create the input item and pump in all the options into playlist item */ p_input = input_item_NewExt( p_demux, psz_mrl, psz_title, i_options, ppsz_options, 0, i_duration ); - if( psz_artist && *psz_artist ) input_item_SetArtist( p_input, psz_artist ); - if( psz_author && *psz_author ) input_item_SetPublisher( p_input, psz_author ); - if( psz_title && *psz_title ) input_item_SetTitle( p_input, psz_title ); - if( psz_copyright && *psz_copyright ) input_item_SetCopyright( p_input, psz_copyright ); - if( psz_album && *psz_album ) input_item_SetAlbum( p_input, psz_album ); - if( psz_genre && *psz_genre ) input_item_SetGenre( p_input, psz_genre ); - if( psz_year && *psz_year ) input_item_SetDate( p_input, psz_copyright ); - if( psz_cdnum && *psz_cdnum ) input_item_SetTrackNum( p_input, psz_cdnum ); - if( psz_comments && *psz_comments ) input_item_SetDescription( p_input, psz_comments ); - - input_item_AddSubItem( p_current_input, p_input ); + if( !EMPTY_STR( psz_artist ) ) input_item_SetArtist( p_input, psz_artist ); + if( !EMPTY_STR( psz_author ) ) input_item_SetPublisher( p_input, psz_author ); + if( !EMPTY_STR( psz_title ) ) input_item_SetTitle( p_input, psz_title ); + if( !EMPTY_STR( psz_copyright ) ) input_item_SetCopyright( p_input, psz_copyright ); + if( !EMPTY_STR( psz_album ) ) input_item_SetAlbum( p_input, psz_album ); + if( !EMPTY_STR( psz_genre ) ) input_item_SetGenre( p_input, psz_genre ); + if( !EMPTY_STR( psz_year ) ) input_item_SetDate( p_input, psz_copyright ); + if( !EMPTY_STR( psz_cdnum ) ) input_item_SetTrackNum( p_input, psz_cdnum ); + if( !EMPTY_STR( psz_comments ) ) input_item_SetDescription( p_input, psz_comments ); + + input_item_node_AppendItem( p_subitems, p_input ); vlc_gc_decref( p_input ); free( psz_mrl ); } @@ -395,7 +353,6 @@ static int Demux( demux_t *p_demux ) /* Cleanup state */ while( i_options-- ) free( (char*)ppsz_options[i_options] ); FREENULL( ppsz_options ); - FREENULL( psz_name ); FREENULL( psz_artist ); FREENULL( psz_title ); FREENULL( psz_author ); @@ -413,7 +370,8 @@ static int Demux( demux_t *p_demux ) b_cleanup = false; } } - HANDLE_PLAY_AND_RELEASE; + input_item_node_PostAndDelete( p_subitems ); + vlc_gc_decref(p_current_input); var_Destroy( p_demux, "m3u-extvlcopt" ); return 0; /* Needed for correct operation of go back */ } @@ -440,16 +398,18 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) * @param ppsz_cdnum: Buffer to store cdnum * @param ppsz_comments: Buffer to store comments */ -static void ParseClipInfo( char *psz_clipinfo, char **ppsz_artist, char **ppsz_title, +static void ParseClipInfo( const char *psz_clipinfo, char **ppsz_artist, char **ppsz_title, char **ppsz_album, char **ppsz_genre, char **ppsz_year, char **ppsz_cdnum, char **ppsz_comments ) { char *psz_option_next, *psz_option_start, *psz_param, *psz_value, *psz_suboption; char *psz_temp_clipinfo = strdup( psz_clipinfo ); - psz_option_start = psz_clipinfo; psz_option_start = strchr( psz_temp_clipinfo, '"' ); if( !psz_option_start ) + { + free( psz_temp_clipinfo ); return; + } psz_option_start++; psz_option_next = psz_option_start; @@ -469,7 +429,7 @@ static void ParseClipInfo( char *psz_clipinfo, char **ppsz_artist, char **ppsz_t if( psz_option_next == psz_option_start ) break; - psz_suboption = MaybeFromLocaleDup( psz_option_start ); + psz_suboption = strdup( psz_option_start ); if( !psz_suboption ) break; @@ -484,19 +444,19 @@ static void ParseClipInfo( char *psz_clipinfo, char **ppsz_artist, char **ppsz_t break; /* Put into args */ if( !strcmp( psz_param, "artist name" ) ) - *ppsz_artist = strdup( psz_value ); + *ppsz_artist = decode_URI_duplicate( psz_value ); else if( !strcmp( psz_param, "title" ) ) - *ppsz_title = strdup( psz_value ); + *ppsz_title = decode_URI_duplicate( psz_value ); else if( !strcmp( psz_param, "album name" ) ) - *ppsz_album = strdup( psz_value ); + *ppsz_album = decode_URI_duplicate( psz_value ); else if( !strcmp( psz_param, "genre" ) ) - *ppsz_genre = strdup( psz_value ); + *ppsz_genre = decode_URI_duplicate( psz_value ); else if( !strcmp( psz_param, "year" ) ) - *ppsz_year = strdup( psz_value ); + *ppsz_year = decode_URI_duplicate( psz_value ); else if( !strcmp( psz_param, "cdnum" ) ) - *ppsz_cdnum = strdup( psz_value ); + *ppsz_cdnum = decode_URI_duplicate( psz_value ); else if( !strcmp( psz_param, "comments" ) ) - *ppsz_comments = strdup( psz_value ); + *ppsz_comments = decode_URI_duplicate( psz_value ); free( psz_suboption ); psz_option_next++;