Changeset 2f68055094e8d77611774e5c2ec1bcfadc9c592e
- 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
| rb8ddca0 |
r2f68055 |
|
| 38 | 38 | VLC_EXPORT( FILE *, utf8_fopen, ( const char *filename, const char *mode ) ); |
|---|
| 39 | 39 | VLC_EXPORT( DIR *, utf8_opendir, ( const char *dirname ) ); |
|---|
| 40 | | VLC_EXPORT( char *, utf8_readdir, ( void *dir ) ); |
|---|
| | 40 | VLC_EXPORT( char *, utf8_readdir, ( DIR *dir ) ); |
|---|
| 41 | 41 | VLC_EXPORT( int, utf8_scandir, ( const char *dirname, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ) ) ); |
|---|
| 42 | 42 | |
|---|
| r853edfd |
r2f68055 |
|
| 970 | 970 | #endif |
|---|
| 971 | 971 | |
|---|
| 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> |
|---|
| | 974 | VLC_INTERNAL( void *, vlc_wopendir, ( const wchar_t * ) ); |
|---|
| | 975 | VLC_INTERNAL( struct _wdirent *, vlc_wreaddir, ( void * ) ); |
|---|
| | 976 | VLC_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 |
|---|
| 975 | 984 | |
|---|
| 976 | 985 | /* Format type specifiers for 64 bits numbers */ |
|---|
| r853edfd |
r2f68055 |
|
| 469 | 469 | DIR * (*utf8_opendir_inner) (const char *dirname); |
|---|
| 470 | 470 | FILE * (*utf8_fopen_inner) (const char *filename, const char *mode); |
|---|
| 471 | | char * (*utf8_readdir_inner) (void *dir); |
|---|
| | 471 | char * (*utf8_readdir_inner) (DIR *dir); |
|---|
| 472 | 472 | int (*utf8_stat_inner) (const char *filename, struct stat *buf); |
|---|
| 473 | 473 | int (*utf8_lstat_inner) (const char *filename, struct stat *buf); |
|---|
| re7bcc68 |
r2f68055 |
|
| 394 | 394 | *****************************************************************************/ |
|---|
| 395 | 395 | #if defined(WIN32) && !defined(UNDER_CE) |
|---|
| | 396 | # include <assert.h> |
|---|
| | 397 | |
|---|
| 396 | 398 | typedef struct vlc_DIR |
|---|
| 397 | 399 | { |
|---|
| 398 | | DIR *p_real_dir; |
|---|
| | 400 | _WDIR *p_real_dir; |
|---|
| 399 | 401 | int i_drives; |
|---|
| 400 | | struct dirent dd_dir; |
|---|
| | 402 | struct _wdirent dd_dir; |
|---|
| 401 | 403 | vlc_bool_t b_insert_back; |
|---|
| 402 | 404 | } vlc_DIR; |
|---|
| 403 | 405 | |
|---|
| 404 | | void *vlc_opendir_wrapper( const char *psz_path ) |
|---|
| | 406 | void *vlc_wopendir( const wchar_t *wpath ) |
|---|
| 405 | 407 | { |
|---|
| 406 | 408 | 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) ) |
|---|
| 411 | 413 | { |
|---|
| 412 | 414 | /* Special mode to list drive letters */ |
|---|
| … | … | |
| 417 | 419 | } |
|---|
| 418 | 420 | |
|---|
| 419 | | p_real_dir = opendir( psz_path ); |
|---|
| | 421 | p_real_dir = _wopendir( wpath ); |
|---|
| 420 | 422 | if ( p_real_dir == NULL ) |
|---|
| 421 | 423 | return NULL; |
|---|
| … | … | |
| 423 | 425 | p_dir = malloc( sizeof(vlc_DIR) ); |
|---|
| 424 | 426 | 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":\\"); |
|---|
| 427 | 430 | return (void *)p_dir; |
|---|
| 428 | 431 | } |
|---|
| 429 | 432 | |
|---|
| 430 | | struct dirent *vlc_readdir_wrapper( void *_p_dir ) |
|---|
| | 433 | struct _wdirent *vlc_wreaddir( void *_p_dir ) |
|---|
| 431 | 434 | { |
|---|
| 432 | 435 | vlc_DIR *p_dir = (vlc_DIR *)_p_dir; |
|---|
| … | … | |
| 438 | 441 | if ( p_dir->b_insert_back ) |
|---|
| 439 | 442 | { |
|---|
| | 443 | /* Adds "..", gruik! */ |
|---|
| 440 | 444 | p_dir->dd_dir.d_ino = 0; |
|---|
| 441 | 445 | p_dir->dd_dir.d_reclen = 0; |
|---|
| 442 | 446 | p_dir->dd_dir.d_namlen = 2; |
|---|
| 443 | | strcpy( p_dir->dd_dir.d_name, ".." ); |
|---|
| | 447 | wcscpy( p_dir->dd_dir.d_name, L".." ); |
|---|
| 444 | 448 | p_dir->b_insert_back = VLC_FALSE; |
|---|
| 445 | 449 | return &p_dir->dd_dir; |
|---|
| 446 | 450 | } |
|---|
| 447 | 451 | |
|---|
| 448 | | return readdir( p_dir->p_real_dir ); |
|---|
| | 452 | return _wreaddir( p_dir->p_real_dir ); |
|---|
| 449 | 453 | } |
|---|
| 450 | 454 | |
|---|
| … | … | |
| 460 | 464 | return NULL; /* this should not happen */ |
|---|
| 461 | 465 | |
|---|
| 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); |
|---|
| 464 | 468 | p_dir->i_drives &= ~(1UL << i); |
|---|
| 465 | 469 | return &p_dir->dd_dir; |
|---|
| 466 | 470 | } |
|---|
| 467 | 471 | |
|---|
| 468 | | int vlc_closedir_wrapper( void *_p_dir ) |
|---|
| | 472 | int vlc_wclosedir( void *_p_dir ) |
|---|
| 469 | 473 | { |
|---|
| 470 | 474 | vlc_DIR *p_dir = (vlc_DIR *)_p_dir; |
|---|
| | 475 | int i_ret = 0; |
|---|
| 471 | 476 | |
|---|
| 472 | 477 | 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 ); |
|---|
| 478 | 479 | |
|---|
| 479 | 480 | 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; |
|---|
| 494 | 482 | } |
|---|
| 495 | 483 | #endif |
|---|
| … | … | |
| 499 | 487 | *****************************************************************************/ |
|---|
| 500 | 488 | #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 |
|---|
| 501 | 495 | int vlc_alphasort( const struct dirent **a, const struct dirent **b ) |
|---|
| 502 | 496 | { |
|---|
| … | … | |
| 514 | 508 | int ret, size; |
|---|
| 515 | 509 | |
|---|
| 516 | | if( !namelist || !( p_dir = vlc_opendir_wrapper( name ) ) ) return -1; |
|---|
| | 510 | if( !namelist || !( p_dir = opendir( name ) ) ) return -1; |
|---|
| 517 | 511 | |
|---|
| 518 | 512 | ret = 0; |
|---|
| 519 | 513 | pp_list = NULL; |
|---|
| 520 | | while( ( p_content = vlc_readdir_wrapper( p_dir ) ) ) |
|---|
| | 514 | while( ( p_content = readdir( p_dir ) ) ) |
|---|
| 521 | 515 | { |
|---|
| 522 | 516 | if( filter && !filter( p_content ) ) |
|---|
| … | … | |
| 531 | 525 | } |
|---|
| 532 | 526 | |
|---|
| 533 | | vlc_closedir_wrapper( p_dir ); |
|---|
| | 527 | closedir( p_dir ); |
|---|
| 534 | 528 | |
|---|
| 535 | 529 | if( compar ) |
|---|
| r0c32d85 |
r2f68055 |
|
| 811 | 811 | int i_maxdepth ) |
|---|
| 812 | 812 | { |
|---|
| | 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 |
|---|
| 813 | 819 | #if defined( UNDER_CE ) || defined( _MSC_VER ) |
|---|
| 814 | 820 | #ifdef UNDER_CE |
|---|
| r4df95cf |
r2f68055 |
|
| 430 | 430 | DIR *utf8_opendir( const char *dirname ) |
|---|
| 431 | 431 | { |
|---|
| 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 |
|---|
| 433 | 441 | const char *local_name = ToLocale( dirname ); |
|---|
| 434 | 442 | |
|---|
| … | … | |
| 439 | 447 | return dir; |
|---|
| 440 | 448 | } |
|---|
| 441 | | else |
|---|
| 442 | | errno = ENOENT; |
|---|
| | 449 | #endif |
|---|
| | 450 | |
|---|
| | 451 | errno = ENOENT; |
|---|
| 443 | 452 | return NULL; |
|---|
| 444 | 453 | } |
|---|
| 445 | 454 | |
|---|
| 446 | 455 | |
|---|
| 447 | | char *utf8_readdir( void *dir ) |
|---|
| 448 | | { |
|---|
| | 456 | char *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 |
|---|
| 449 | 465 | struct dirent *ent; |
|---|
| 450 | 466 | |
|---|
| … | … | |
| 454 | 470 | |
|---|
| 455 | 471 | return vlc_fix_readdir( ent->d_name ); |
|---|
| | 472 | #endif |
|---|
| 456 | 473 | } |
|---|
| 457 | 474 | |
|---|