From: Rafaël Carré Date: Tue, 21 Nov 2006 05:58:55 +0000 (+0000) Subject: Unicode support in directory access on windows. Patch by xxcv. Untested. X-Git-Tag: 0.9.0-test0~9348 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=08936b3bbeae3b93615fa665683c540de4eb8d23;p=vlc Unicode support in directory access on windows. Patch by xxcv. Untested. --- diff --git a/src/extras/libc.c b/src/extras/libc.c index d5f118862c..c56ea10d0d 100644 --- a/src/extras/libc.c +++ b/src/extras/libc.c @@ -416,7 +416,17 @@ void *vlc_opendir_wrapper( const char *psz_path ) return (void *)p_dir; } - p_real_dir = opendir( psz_path ); + if (GetVersion() < 0x80000000) + { + /* for Windows NT and above */ + wchar_t wpath[MAX_PATH + 1]; + + if (!MultiByteToWideChar (CP_UTF8, 0, psz_path, -1, wpath, MAX_PATH)) + return NULL; + wpath[MAX_PATH] = L'\0'; + p_real_dir = _wopendir( wpath ); + } + if ( p_real_dir == NULL ) return NULL; @@ -445,7 +455,7 @@ struct dirent *vlc_readdir_wrapper( void *_p_dir ) return &p_dir->dd_dir; } - return readdir( p_dir->p_real_dir ); + return _wreaddir( p_dir->p_real_dir ); } /* Drive letters mode */ @@ -471,7 +481,7 @@ int vlc_closedir_wrapper( void *_p_dir ) if ( p_dir->p_real_dir != NULL ) { - int i_ret = closedir( p_dir->p_real_dir ); + int i_ret = _wclosedir( p_dir->p_real_dir ); free( p_dir ); return i_ret; } diff --git a/src/misc/unicode.c b/src/misc/unicode.c index 76f2f1d8a3..e95998e12b 100644 --- a/src/misc/unicode.c +++ b/src/misc/unicode.c @@ -429,7 +429,11 @@ int utf8_mkdir( const char *dirname ) void *utf8_opendir( const char *dirname ) { - /* TODO: support for WinNT non-ACP filenames */ + +#if defined (UNDER_CE) || defined (WIN32) + DIR *dir = vlc_opendir_wrapper( dirname ); + return dir; +#else const char *local_name = ToLocale( dirname ); if( local_name != NULL ) @@ -440,6 +444,8 @@ void *utf8_opendir( const char *dirname ) } else errno = ENOENT; +#endif + return NULL; } @@ -452,7 +458,11 @@ char *utf8_readdir( void *dir ) if( ent == NULL ) return NULL; +#if defined (UNDER_CE) || defined (WIN32) + return FromWide(ent->d_name); +#else return vlc_fix_readdir( ent->d_name ); +#endif } static int dummy_select( const char *str )