vlc | branch: master | Rémi Denis-Courmont <[email protected]> | 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; _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
