[vlc-commits] commit: dvdnav: clean up, fix error message and probing encoding (fix #3816 ) ( Rémi Denis-Courmont )

git at videolan.org git at videolan.org
Fri Oct 8 22:31:32 CEST 2010


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri Oct  8 23:30:08 2010 +0300| [f2513588b0099ce5634b7094246bac63d503a3c2] | committer: Rémi Denis-Courmont 

dvdnav: clean up, fix error message and probing encoding (fix #3816)

Paths for error message must be UTF-8; they were locale.
Paths for probing must be UTF-8 also, as vlc_fopen() does the
conversion to locale internally.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f2513588b0099ce5634b7094246bac63d503a3c2
---

 modules/access/dvdnav.c |   38 ++++++++++++++++++++++----------------
 1 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/modules/access/dvdnav.c b/modules/access/dvdnav.c
index 8bf9f14..3cbdceb 100644
--- a/modules/access/dvdnav.c
+++ b/modules/access/dvdnav.c
@@ -186,7 +186,7 @@ static int Open( vlc_object_t *p_this )
     demux_sys_t *p_sys;
     dvdnav_t    *p_dvdnav;
     int         i_angle;
-    char        *psz_name;
+    char        *psz_file;
     char        *psz_code;
 
     if( !p_demux->psz_file || !*p_demux->psz_file )
@@ -195,38 +195,44 @@ static int Open( vlc_object_t *p_this )
         if( !p_demux->psz_access || !*p_demux->psz_access )
             return VLC_EGENERIC;
 
-        psz_name = var_CreateGetString( p_this, "dvd" );
-        if( !psz_name )
-        {
-            psz_name = strdup("");
-        }
+        psz_file = var_InheritString( p_this, "dvd" );
     }
     else
-        psz_name = ToLocaleDup( p_demux->psz_file );
+        psz_file = strdup( p_demux->psz_file );
 
 #ifdef WIN32
-    /* Remove trailing backslash, otherwise dvdnav_open will fail */
-    if( *psz_name && *(psz_name + strlen(psz_name) - 1) == '\\' )
+    if( psz_file != NULL )
     {
-        *(psz_name + strlen(psz_name) - 1) = '\0';
+        /* Remove trailing backslash, otherwise dvdnav_open will fail */
+        size_t flen = strlen( psz_file );
+        if( flen > 0 && psz_file[flen - 1] == '\\' )
+            psz_file[flen - 1] = '\0';
     }
+    else
+        psz_file = strdup("");
 #endif
+    if( unlikely(psz_file == NULL) )
+        return VLC_EGENERIC;
 
     /* Try some simple probing to avoid going through dvdnav_open too often */
-    if( ProbeDVD( p_demux, psz_name ) != VLC_SUCCESS )
+    if( ProbeDVD( p_demux, psz_file ) != VLC_SUCCESS )
     {
-        free( psz_name );
+        free( psz_file );
         return VLC_EGENERIC;
     }
 
     /* Open dvdnav */
-    if( dvdnav_open( &p_dvdnav, psz_name ) != DVDNAV_STATUS_OK )
+    const char *psz_path = ToLocale( psz_file );
+    if( dvdnav_open( &p_dvdnav, psz_path ) != DVDNAV_STATUS_OK )
+        p_dvdnav = NULL;
+    LocaleFree( psz_path );
+    if( p_dvdnav == NULL )
     {
-        msg_Warn( p_demux, "cannot open dvdnav" );
-        free( psz_name );
+        msg_Warn( p_demux, "cannot open DVD (%s)", psz_file);
+        free( psz_file );
         return VLC_EGENERIC;
     }
-    free( psz_name );
+    free( psz_file );
 
     /* Fill p_demux field */
     DEMUX_INIT_COMMON(); p_sys = p_demux->p_sys;



More information about the vlc-commits mailing list