@@ -429,59 +429,6 @@ static struct SaveAcc g_acc_profile[12];
429429static s32 g_acc_count ;
430430static bool g_writable ;
431431
432- // list of all characters that are invalid for fat,
433- // these are coverted to "_"
434- static const char INVALID_CHAR_TABLE [] = {
435- '<' ,
436- '>' ,
437- ':' ,
438- '"' ,
439- '/' ,
440- '\\' ,
441- '|' ,
442- '?' ,
443- '*' ,
444- '.' ,
445- ',' ,
446- ';' ,
447- '+' ,
448- '=' ,
449- '&' ,
450- '%' , // probably invalid
451- };
452-
453- static void make_zip_string_valid (char * str ) {
454- for (int i = 0 ; str [i ]; i ++ ) {
455- const unsigned char c = str [i ];
456- const unsigned char c2 = str [i + 1 ];
457- if (c < 0x20 || c >= 0x80 ) {
458- if (c == 195 && c2 == 169 ) {
459- str [i + 1 ] = 'e' ;
460- memcpy (str + i , str + i + 1 , strlen (str ) - i );
461- } else if (c == 226 && c2 == 128 && (unsigned char )str [i + 2 ] == 153 ) {
462- str [i + 2 ] = '\'' ;
463- memcpy (str + i , str + i + 2 , strlen (str ) - i );
464- } else {
465- str [i ] = '_' ;
466- }
467- } else {
468- for (int j = 0 ; j < ARRAY_SIZE (INVALID_CHAR_TABLE ); j ++ ) {
469- if (c == INVALID_CHAR_TABLE [j ]) {
470- // see what the next character is
471- if (str [i + 1 ] == '\0' ) {
472- str [i ] = '\0' ;
473- } else if (str [i + 1 ] != ' ' ) {
474- str [i ] = '_' ;
475- } else {
476- memcpy (str + i , str + i + 1 , strlen (str ) - i );
477- }
478- break ;
479- }
480- }
481- }
482- }
483- }
484-
485432static FsFileSystem * mount_save_fs (const struct SavePathData * d ) {
486433 for (int i = 0 ; i < ARRAY_SIZE (g_save_cache ); i ++ ) {
487434 struct SaveCacheEntry * entry = & g_save_cache [i ];
@@ -613,6 +560,40 @@ static void build_native_path(char out[FS_MAX_PATH], const char* path, const str
613560 }
614561}
615562
563+ static void rescan_users (void ) {
564+ memset (g_acc_profile , 0 , sizeof (g_acc_profile ));
565+ g_acc_count = 0 ;
566+
567+ AccountUid uids [8 ];
568+ s32 count ;
569+ Result rc ;
570+ if (R_FAILED (rc = accountListAllUsers (uids , 8 , & count ))) {
571+ log_file_fwrite ("failed: accountListAllUsers() 0x%X\n" , rc );
572+ } else {
573+ for (int i = 0 ; i < count ; i ++ ) {
574+ AccountProfile profile ;
575+ if (R_FAILED (rc = accountGetProfile (& profile , uids [i ]))) {
576+ log_file_fwrite ("failed: accountGetProfile() 0x%X\n" , rc );
577+ } else {
578+ AccountProfileBase base ;
579+ if (R_FAILED (rc = accountProfileGet (& profile , NULL , & base ))) {
580+ log_file_fwrite ("failed: accountProfileGet() 0x%X\n" , rc );
581+ } else {
582+ strcpy (g_acc_profile [g_acc_count ].name , base .nickname );
583+ g_acc_profile [g_acc_count ].uid = uids [i ];
584+ g_acc_count ++ ;
585+ }
586+ accountProfileClose (& profile );
587+ }
588+ }
589+ }
590+
591+ strcpy (g_acc_profile [g_acc_count ++ ].name , "bcat" );
592+ strcpy (g_acc_profile [g_acc_count ++ ].name , "cache" );
593+ strcpy (g_acc_profile [g_acc_count ++ ].name , "device" );
594+ strcpy (g_acc_profile [g_acc_count ++ ].name , "system" );
595+ }
596+
616597static int vfs_save_open (void * user , const char * path , enum FtpVfsOpenMode mode ) {
617598 struct VfsSaveFile * f = user ;
618599 f -> data = get_type (path );
@@ -727,6 +708,9 @@ static int vfs_save_opendir(void* user, const char* path) {
727708 default : return -1 ;
728709
729710 case SaveDirType_Root :
711+ rescan_users ();
712+ break ;
713+
730714 case SaveDirType_User1 :
731715 break ;
732716
@@ -822,7 +806,7 @@ static const char* vfs_save_readdir(void* user, void* user_entry) {
822806 snprintf (entry -> name , sizeof (entry -> name ), "[%016lX]%s" , entry -> info .application_id , ext );
823807 } else {
824808 if (f -> data .type == SaveDirType_Zip ) {
825- make_zip_string_valid (name .str );
809+ utilsReplaceIllegalCharacters (name .str , true );
826810 }
827811 snprintf (entry -> name , sizeof (entry -> name ), "%s [%016lX]%s" , name .str , entry -> info .application_id , ext );
828812 }
@@ -1023,35 +1007,7 @@ static int vfs_save_rename(const char* src, const char* dst) {
10231007
10241008void vfs_save_init (bool save_writable ) {
10251009 g_writable = save_writable ;
1026-
1027- AccountUid uids [8 ];
1028- s32 count ;
1029- Result rc ;
1030- if (R_FAILED (rc = accountListAllUsers (uids , 8 , & count ))) {
1031- log_file_fwrite ("failed: accountListAllUsers() 0x%X\n" , rc );
1032- } else {
1033- for (int i = 0 ; i < count ; i ++ ) {
1034- AccountProfile profile ;
1035- if (R_FAILED (rc = accountGetProfile (& profile , uids [i ]))) {
1036- log_file_fwrite ("failed: accountGetProfile() 0x%X\n" , rc );
1037- } else {
1038- AccountProfileBase base ;
1039- if (R_FAILED (rc = accountProfileGet (& profile , NULL , & base ))) {
1040- log_file_fwrite ("failed: accountProfileGet() 0x%X\n" , rc );
1041- } else {
1042- strcpy (g_acc_profile [g_acc_count ].name , base .nickname );
1043- g_acc_profile [g_acc_count ].uid = base .uid ;
1044- g_acc_count ++ ;
1045- }
1046- accountProfileClose (& profile );
1047- }
1048- }
1049- }
1050-
1051- strcpy (g_acc_profile [g_acc_count ++ ].name , "bcat" );
1052- strcpy (g_acc_profile [g_acc_count ++ ].name , "cache" );
1053- strcpy (g_acc_profile [g_acc_count ++ ].name , "device" );
1054- strcpy (g_acc_profile [g_acc_count ++ ].name , "system" );
1010+ rescan_users ();
10551011}
10561012
10571013void vfs_save_exit (void ) {
@@ -1064,6 +1020,9 @@ void vfs_save_exit(void) {
10641020 fsFsClose (& entry -> fs );
10651021 }
10661022 }
1023+
1024+ memset (g_acc_profile , 0 , sizeof (g_acc_profile ));
1025+ g_acc_count = 0 ;
10671026}
10681027
10691028const FtpVfs g_vfs_save = {
0 commit comments