RAM: use decode_URI(), not FromLocale(). Untested.
authorRémi Denis-Courmont <remi@remlab.net>
Mon, 29 Jun 2009 20:29:14 +0000 (23:29 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Mon, 29 Jun 2009 20:30:41 +0000 (23:30 +0300)
Also try to fix a few leaks (but meta handling still seems suspicious).

P.S.: That sort of things should be obvious.
Please don't commit such crap without reviewing.

modules/demux/playlist/ram.c

index aad3b04..b6c0567 100644 (file)
@@ -49,7 +49,7 @@ http://service.real.com/help/library/guides/realone/IntroGuide/HTML/htmfiles/ram
 
 #include <vlc_common.h>
 #include <vlc_demux.h>
-#include <vlc_charset.h>
+#include <vlc_url.h>
 
 #include <ctype.h>
 
@@ -100,34 +100,6 @@ 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
@@ -260,52 +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;
 
             /* Get the MRL from the file. Note that this might contain parameters of form ?param1=value1&param2=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 */
@@ -316,7 +283,7 @@ 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(psz_value);
                     else if( !strcmp( psz_param, "start" ) )
                     {
                         i_start = ParseTime( psz_value, strlen( psz_value ) );
@@ -338,22 +305,16 @@ static int Demux( demux_t *p_demux )
                         }
                     }
                     else if( !strcmp( psz_param, "title" ) )
-                        psz_title = strdup(psz_value);
+                        psz_title = decode_URI(psz_value);
                     else if( !strcmp( psz_param, "copyright" ) )
-                        psz_copyright = strdup(psz_value);
+                        psz_copyright = decode_URI(psz_value);
                     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 );
 
@@ -458,7 +419,7 @@ static void ParseClipInfo( const char *psz_clipinfo, char **ppsz_artist, char **
         if( psz_option_next == psz_option_start )
             break;
 
-        psz_suboption = MaybeFromLocaleDup( psz_option_start );
+        psz_suboption = strdup( psz_option_start );
         if( !psz_suboption )
             break;
 
@@ -473,19 +434,19 @@ static void ParseClipInfo( const char *psz_clipinfo, char **ppsz_artist, char **
             break;
         /* Put into args */
         if( !strcmp( psz_param, "artist name" ) )
-            *ppsz_artist = strdup( psz_value );
+            *ppsz_artist = decode_URI( psz_value );
         else if( !strcmp( psz_param, "title" ) )
-            *ppsz_title = strdup( psz_value );
+            *ppsz_title = decode_URI( psz_value );
         else if( !strcmp( psz_param, "album name" ) )
-            *ppsz_album = strdup( psz_value );
+            *ppsz_album = decode_URI( psz_value );
         else if( !strcmp( psz_param, "genre" ) )
-            *ppsz_genre = strdup( psz_value );
+            *ppsz_genre = decode_URI( psz_value );
         else if( !strcmp( psz_param, "year" ) )
-            *ppsz_year = strdup( psz_value );
+            *ppsz_year = decode_URI( psz_value );
         else if( !strcmp( psz_param, "cdnum" ) )
-            *ppsz_cdnum = strdup( psz_value );
+            *ppsz_cdnum = decode_URI( psz_value );
         else if( !strcmp( psz_param, "comments" ) )
-            *ppsz_comments = strdup( psz_value );
+            *ppsz_comments = decode_URI( psz_value );
 
         free( psz_suboption );
         psz_option_next++;