Changeset 2f68055094e8d77611774e5c2ec1bcfadc9c592e

Show
Ignore:
Timestamp:
11/25/06 10:59:49 (2 years ago)
Author:
Rémi Denis-Courmont <rem@videolan.org>
git-committer:
Rémi Denis-Courmont <rem@videolan.org> 1164448789 +0000
git-parent:

[63883f0c2f583996e34845345c3f536e5912627c]

git-author:
Rémi Denis-Courmont <rem@videolan.org> 1164448789 +0000
Message:

Attempt to use wide directory indexing on Win32
Might break stuff, but I cannot test much because of DBus vs Win32 breakage(!)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • include/charset.h

    rb8ddca0 r2f68055  
    3838VLC_EXPORT( FILE *, utf8_fopen, ( const char *filename, const char *mode ) ); 
    3939VLC_EXPORT( DIR *, utf8_opendir, ( const char *dirname ) ); 
    40 VLC_EXPORT( char *, utf8_readdir, ( void *dir ) ); 
     40VLC_EXPORT( char *, utf8_readdir, ( DIR *dir ) ); 
    4141VLC_EXPORT( int, utf8_scandir, ( const char *dirname, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ) ); 
    4242 
  • include/vlc_common.h

    r853edfd r2f68055  
    970970#endif 
    971971 
    972 VLC_INTERNAL( void *, vlc_opendir_wrapper, ( const char * ) ); 
    973 VLC_INTERNAL( struct dirent *, vlc_readdir_wrapper, ( void * ) ); 
    974 VLC_INTERNAL( int, vlc_closedir_wrapper, ( void * ) ); 
     972#if defined (WIN32) 
     973#   include <dirent.h> 
     974VLC_INTERNAL( void *, vlc_wopendir, ( const wchar_t * ) ); 
     975VLC_INTERNAL( struct _wdirent *, vlc_wreaddir, ( void * ) ); 
     976VLC_INTERNAL( int, vlc_wclosedir, ( void * ) ); 
     977#   define opendir Use_utf8_opendir_or_vlc_wopendir_instead! 
     978#   define readdir Use_utf8_readdir_or_vlc_wreaddir_instead! 
     979#   define closedir vlc_wclosedir 
     980#   define _wopendir vlc_wopendir 
     981#   define _wreaddir vlc_wreaddir 
     982#   define _wclosedir vlc_wclosedir 
     983#endif 
    975984 
    976985/* Format type specifiers for 64 bits numbers */ 
  • include/vlc_symbols.h

    r853edfd r2f68055  
    469469    DIR * (*utf8_opendir_inner) (const char *dirname); 
    470470    FILE * (*utf8_fopen_inner) (const char *filename, const char *mode); 
    471     char * (*utf8_readdir_inner) (void *dir); 
     471    char * (*utf8_readdir_inner) (DIR *dir); 
    472472    int (*utf8_stat_inner) (const char *filename, struct stat *buf); 
    473473    int (*utf8_lstat_inner) (const char *filename, struct stat *buf); 
  • src/extras/libc.c

    re7bcc68 r2f68055  
    394394 *****************************************************************************/ 
    395395#if defined(WIN32) && !defined(UNDER_CE) 
     396#   include <assert.h> 
     397 
    396398typedef struct vlc_DIR 
    397399{ 
    398     DIR *p_real_dir; 
     400    _WDIR *p_real_dir; 
    399401    int i_drives; 
    400     struct dirent dd_dir; 
     402    struct _wdirent dd_dir; 
    401403    vlc_bool_t b_insert_back; 
    402404} vlc_DIR; 
    403405 
    404 void *vlc_opendir_wrapper( const char *psz_path ) 
     406void *vlc_wopendir( const wchar_t *wpath ) 
    405407{ 
    406408    vlc_DIR *p_dir; 
    407     DIR *p_real_dir; 
    408  
    409     if ( psz_path == NULL || psz_path[0] == '\0' 
    410           || (psz_path[0] == '\\' && psz_path[1] == '\0') ) 
     409    _WDIR *p_real_dir; 
     410 
     411    if ( wpath == NULL || wpath[0] == '\0' 
     412          || (wcscmp (wpath, L"\\") == 0) ) 
    411413    { 
    412414        /* Special mode to list drive letters */ 
     
    417419    } 
    418420 
    419     p_real_dir = opendir( psz_path ); 
     421    p_real_dir = _wopendir( wpath ); 
    420422    if ( p_real_dir == NULL ) 
    421423        return NULL; 
     
    423425    p_dir = malloc( sizeof(vlc_DIR) ); 
    424426    p_dir->p_real_dir = p_real_dir; 
    425     p_dir->b_insert_back = ( psz_path[1] == ':' && psz_path[2] == '\\' 
    426                               && psz_path[3] =='\0' ); 
     427 
     428    assert (wpath[0]); // wpath[1] is defined 
     429    p_dir->b_insert_back = !wcscmp (wpath + 1, L":\\"); 
    427430    return (void *)p_dir; 
    428431} 
    429432 
    430 struct dirent *vlc_readdir_wrapper( void *_p_dir ) 
     433struct _wdirent *vlc_wreaddir( void *_p_dir ) 
    431434{ 
    432435    vlc_DIR *p_dir = (vlc_DIR *)_p_dir; 
     
    438441        if ( p_dir->b_insert_back ) 
    439442        { 
     443            /* Adds "..", gruik! */ 
    440444            p_dir->dd_dir.d_ino = 0; 
    441445            p_dir->dd_dir.d_reclen = 0; 
    442446            p_dir->dd_dir.d_namlen = 2; 
    443             strcpy( p_dir->dd_dir.d_name, ".." ); 
     447            wcscpy( p_dir->dd_dir.d_name, L".." ); 
    444448            p_dir->b_insert_back = VLC_FALSE; 
    445449            return &p_dir->dd_dir; 
    446450        } 
    447451 
    448         return readdir( p_dir->p_real_dir ); 
     452        return _wreaddir( p_dir->p_real_dir ); 
    449453    } 
    450454 
     
    460464        return NULL; /* this should not happen */ 
    461465 
    462     sprintf( p_dir->dd_dir.d_name, "%c:\\", 'A' + i ); 
    463     p_dir->dd_dir.d_namlen = strlen(p_dir->dd_dir.d_name); 
     466    swprintf( p_dir->dd_dir.d_name, L"%c:\\", 'A' + i ); 
     467    p_dir->dd_dir.d_namlen = wcslen(p_dir->dd_dir.d_name); 
    464468    p_dir->i_drives &= ~(1UL << i); 
    465469    return &p_dir->dd_dir; 
    466470} 
    467471 
    468 int vlc_closedir_wrapper( void *_p_dir ) 
     472int vlc_wclosedir( void *_p_dir ) 
    469473{ 
    470474    vlc_DIR *p_dir = (vlc_DIR *)_p_dir; 
     475    int i_ret = 0; 
    471476 
    472477    if ( p_dir->p_real_dir != NULL ) 
    473     { 
    474         int i_ret = closedir( p_dir->p_real_dir ); 
    475         free( p_dir ); 
    476         return i_ret; 
    477     } 
     478        i_ret = _wclosedir( p_dir->p_real_dir ); 
    478479 
    479480    free( p_dir ); 
    480     return 0; 
    481 
    482 #else 
    483 void *vlc_opendir_wrapper( const char *psz_path ) 
    484 
    485     return (void *)opendir( psz_path ); 
    486 
    487 struct dirent *vlc_readdir_wrapper( void *_p_dir ) 
    488 
    489     return readdir( (DIR *)_p_dir ); 
    490 
    491 int vlc_closedir_wrapper( void *_p_dir ) 
    492 
    493     return closedir( (DIR *)_p_dir ); 
     481    return i_ret; 
    494482} 
    495483#endif 
     
    499487 *****************************************************************************/ 
    500488#if !defined( HAVE_SCANDIR ) 
     489/* FIXME: I suspect this is dead code -> utf8_scandir */ 
     490#ifdef WIN32 
     491# undef opendir 
     492# undef readdir 
     493# undef closedir 
     494#endif 
    501495int vlc_alphasort( const struct dirent **a, const struct dirent **b ) 
    502496{ 
     
    514508    int              ret, size; 
    515509 
    516     if( !namelist || !( p_dir = vlc_opendir_wrapper( name ) ) ) return -1; 
     510    if( !namelist || !( p_dir = opendir( name ) ) ) return -1; 
    517511 
    518512    ret     = 0; 
    519513    pp_list = NULL; 
    520     while( ( p_content = vlc_readdir_wrapper( p_dir ) ) ) 
     514    while( ( p_content = readdir( p_dir ) ) ) 
    521515    { 
    522516        if( filter && !filter( p_content ) ) 
     
    531525    } 
    532526 
    533     vlc_closedir_wrapper( p_dir ); 
     527    closedir( p_dir ); 
    534528 
    535529    if( compar ) 
  • src/misc/modules.c

    r0c32d85 r2f68055  
    811811                               int i_maxdepth ) 
    812812{ 
     813/* FIXME: Needs to be ported to wide char on ALL Windows builds */ 
     814#ifdef WIN32 
     815# undef opendir 
     816# undef closedir 
     817# undef readdir 
     818#endif 
    813819#if defined( UNDER_CE ) || defined( _MSC_VER ) 
    814820#ifdef UNDER_CE 
  • src/text/unicode.c

    r4df95cf r2f68055  
    430430DIR *utf8_opendir( const char *dirname ) 
    431431{ 
    432     /* TODO: support for WinNT non-ACP filenames */ 
     432#ifdef WIN32 
     433    wchar_t wname[MAX_PATH + 1]; 
     434 
     435    if (MultiByteToWideChar (CP_UTF8, 0, dirname, -1, wname, MAX_PATH)) 
     436    { 
     437        wname[MAX_PATH] = L'\0'; 
     438        return (DIR *)vlc_wopendir (wname); 
     439    } 
     440#else 
    433441    const char *local_name = ToLocale( dirname ); 
    434442 
     
    439447        return dir; 
    440448    } 
    441     else 
    442         errno = ENOENT; 
     449#endif 
     450 
     451    errno = ENOENT; 
    443452    return NULL; 
    444453} 
    445454 
    446455 
    447 char *utf8_readdir( void *dir ) 
    448 
     456char *utf8_readdir( DIR *dir ) 
     457
     458#ifdef WIN32 
     459    struct _wdirent *ent = vlc_wreaddir (dir); 
     460    if (ent == NULL) 
     461        return NULL; 
     462 
     463    return FromWide (ent->d_name); 
     464#else 
    449465    struct dirent *ent; 
    450466 
     
    454470 
    455471    return vlc_fix_readdir( ent->d_name ); 
     472#endif 
    456473} 
    457474