From 79afaca01dcd0b43fda17cd3adb1d848cacf8c52 Mon Sep 17 00:00:00 2001 From: Alex Taber Date: Wed, 19 Jun 2024 01:14:34 -0400 Subject: [PATCH] Add paths to config file --- include/common.h | 2 +- source/badges.c | 12 ++++++------ source/config.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ source/fs.c | 30 +++++++++++++++++++---------- source/main.c | 4 +++- source/themes.c | 4 ++-- 6 files changed, 82 insertions(+), 20 deletions(-) diff --git a/include/common.h b/include/common.h index b77c375..58dda3b 100644 --- a/include/common.h +++ b/include/common.h @@ -79,7 +79,7 @@ typedef enum { REMOTE_MODE_AMOUNT, } RemoteMode; -extern const char * main_paths[MODE_AMOUNT]; +extern const char * main_paths[REMOTE_MODE_AMOUNT]; extern const int entries_per_screen_v[MODE_AMOUNT]; extern const int entries_per_screen_h[MODE_AMOUNT]; extern const int entry_size[MODE_AMOUNT]; diff --git a/source/badges.c b/source/badges.c index e45bdf2..dfc7b9e 100644 --- a/source/badges.c +++ b/source/badges.c @@ -215,7 +215,7 @@ int install_badge_dir(FS_DirectoryEntry set_dir, int *badge_count, int set_id) u16 path[512] = {0}; u16 set_icon[17] = {0}; utf8_to_utf16(set_icon, (u8 *) "_seticon.png", 16); - struacat(path, "/Badges/"); + struacat(path, main_paths[REMOTE_MODE_BADGES]); strucat(path, set_dir.name); res = FSUSER_OpenDirectory(&folder, ArchiveSD, fsMakePath(PATH_UTF16, path)); if (R_FAILED(res)) @@ -231,7 +231,7 @@ int install_badge_dir(FS_DirectoryEntry set_dir, int *badge_count, int set_id) if (!strcmp(badge_files[i].shortExt, "PNG")) { memset(path, 0, 512 * sizeof(u16)); - struacat(path, "/Badges/"); + struacat(path, main_paths[REMOTE_MODE_BADGES]); strucat(path, set_dir.name); struacat(path, "/"); strucat(path, badge_files[i].name); @@ -245,7 +245,7 @@ int install_badge_dir(FS_DirectoryEntry set_dir, int *badge_count, int set_id) } else if (!strcmp(badge_files[i].shortExt, "ZIP")) { memset(path, 0, 512 * sizeof(u16)); - struacat(path, "/Badges/"); + struacat(path, main_paths[REMOTE_MODE_BADGES]); strucat(path, set_dir.name); struacat(path, "/"); strucat(path, badge_files[i].name); @@ -599,7 +599,7 @@ Result install_badges(void) DEBUG("Opening badge directory\n"); FS_DirectoryEntry *badge_files = calloc(1024, sizeof(FS_DirectoryEntry)); - res = FSUSER_OpenDirectory(&folder, ArchiveSD, fsMakePath(PATH_ASCII, "/Badges/")); + res = FSUSER_OpenDirectory(&folder, ArchiveSD, fsMakePath(PATH_ASCII, main_paths[REMOTE_MODE_BADGES])); if (R_FAILED(res)) { DEBUG("Failed to open folder: %lx\n", res); @@ -678,7 +678,7 @@ Result install_badges(void) default_idx = badge_count; } u16 path[0x512] = {0}; - struacat(path, "/Badges/"); + struacat(path, main_paths[REMOTE_MODE_BADGES]); strucat(path, badge_files[i].name); default_set_count += install_badge_png(fsMakePath(PATH_UTF16, path), badge_files[i], &badge_count, default_set); } else if (!strcmp(badge_files[i].shortExt, "ZIP")) @@ -689,7 +689,7 @@ Result install_badges(void) default_set = set_count; } u16 path[0x512] = {0}; - struacat(path, "/Badges/"); + struacat(path, main_paths[REMOTE_MODE_BADGES]); strucat(path, badge_files[i].name); default_set_count += install_badge_zip(path, &badge_count, default_set); diff --git a/source/config.c b/source/config.c index 62f48ef..7210647 100644 --- a/source/config.c +++ b/source/config.c @@ -30,6 +30,8 @@ Config_s config; void load_config(void) { + Handle test_handle; + Result res; memset(&config, 0, sizeof(Config_s)); char *json_buf = NULL; u32 json_len = file_to_buf(fsMakePath(PATH_ASCII, "/3ds/" APP_TITLE "/config.json"), ArchiveSD, &json_buf); @@ -95,6 +97,54 @@ void load_config(void) config.yellow_color = C2D_Color32(r, g, b, a); } } + else if (json_is_string(value) && !strcmp(key, "Themes Path")) + { + bool need_slash = json_string_value(value)[strlen(json_string_value(value)) - 1] != '/'; + char *theme_path = calloc(1, strlen(json_string_value(value)) + 1 + (need_slash ? 1 : 0)); + memcpy(theme_path, json_string_value(value), strlen(json_string_value(value))); + if (need_slash) theme_path[strlen(json_string_value(value))] = '/'; + if (R_SUCCEEDED(res = FSUSER_OpenDirectory(&test_handle, ArchiveSD, fsMakePath(PATH_ASCII, theme_path)))) + { + main_paths[REMOTE_MODE_THEMES] = theme_path; + FSDIR_Close(test_handle); + } else + { + DEBUG("Failed test - reverting to default. Err 0x%08lx\n", res); + free(theme_path); + } + } + else if (json_is_string(value) && !strcmp(key, "Splashes Path")) + { + bool need_slash = json_string_value(value)[strlen(json_string_value(value)) - 1] != '/'; + char *splash_path = calloc(1, strlen(json_string_value(value)) + 1 + (need_slash ? 1 : 0)); + memcpy(splash_path, json_string_value(value), strlen(json_string_value(value))); + if (need_slash) splash_path[strlen(json_string_value(value))] = '/'; + if (R_SUCCEEDED(res = FSUSER_OpenDirectory(&test_handle, ArchiveSD, fsMakePath(PATH_ASCII, splash_path)))) + { + main_paths[REMOTE_MODE_SPLASHES] = splash_path; + FSDIR_Close(test_handle); + } else + { + DEBUG("Failed test - reverting to default. Err 0x%08lx\n", res); + free(splash_path); + } + } + else if (json_is_string(value) && !strcmp(key, "Badges Path")) + { + bool need_slash = json_string_value(value)[strlen(json_string_value(value)) - 1] != '/'; + char *badge_path = calloc(1, strlen(json_string_value(value)) + 1 + (need_slash ? 1 : 0)); + memcpy(badge_path, json_string_value(value), strlen(json_string_value(value))); + if (need_slash) badge_path[strlen(json_string_value(value))] = '/'; + if (R_SUCCEEDED(res = FSUSER_OpenDirectory(&test_handle, ArchiveSD, fsMakePath(PATH_ASCII, badge_path)))) + { + main_paths[REMOTE_MODE_BADGES] = badge_path; + FSDIR_Close(test_handle); + } else + { + DEBUG("Failed test - reverting to default. Err 0x%08lx\n", res); + free(badge_path); + } + } } } else { diff --git a/source/fs.c b/source/fs.c index f1b0b5f..6ea78b7 100644 --- a/source/fs.c +++ b/source/fs.c @@ -117,10 +117,9 @@ Result open_archives(void) archive2 = 0x00; } - FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Themes"), FS_ATTRIBUTE_DIRECTORY); - FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Splashes"), FS_ATTRIBUTE_DIRECTORY); - FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Badges"), FS_ATTRIBUTE_DIRECTORY); - FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges"), FS_ATTRIBUTE_DIRECTORY); + FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, main_paths[REMOTE_MODE_THEMES]), FS_ATTRIBUTE_DIRECTORY); + FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, main_paths[REMOTE_MODE_SPLASHES]), FS_ATTRIBUTE_DIRECTORY); + FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, main_paths[REMOTE_MODE_BADGES]), FS_ATTRIBUTE_DIRECTORY); u32 homeMenuPath[3] = {MEDIATYPE_SD, archive2, 0}; home.type = PATH_BINARY; @@ -189,7 +188,12 @@ Result open_badge_extdata() } FSFILE_Close(test_handle); - if(R_FAILED(res = FSUSER_OpenFile(&test_handle, ArchiveSD, fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges/_seticon.png"), FS_OPEN_READ, 0))) + char tp_path[0x106] = {0}; + sprintf(tp_path, "%sThemePlaza Badges", main_paths[REMOTE_MODE_BADGES]); + FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, tp_path), FS_ATTRIBUTE_DIRECTORY); + strcat(tp_path, "/_seticon.png"); + + if(R_FAILED(res = FSUSER_OpenFile(&test_handle, ArchiveSD, fsMakePath(PATH_ASCII, tp_path), FS_OPEN_READ, 0))) { FILE *fp = fopen("romfs:/tp_set.png", "rb"); fseek(fp, 0L, SEEK_END); @@ -198,8 +202,8 @@ Result open_badge_extdata() fseek(fp, 0L, SEEK_SET); fread(icon_buf, 1, size, fp); fclose(fp); - remake_file(fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges/_seticon.png"), ArchiveSD, size); - buf_to_file(size, fsMakePath(PATH_ASCII, "/Badges/ThemePlaza Badges/_seticon.png"), ArchiveSD, icon_buf); + remake_file(fsMakePath(PATH_ASCII, tp_path), ArchiveSD, size); + buf_to_file(size, fsMakePath(PATH_ASCII, tp_path), ArchiveSD, icon_buf); DEBUG("res: 0x%08lx\n", res); free(icon_buf); } @@ -271,6 +275,9 @@ s16 for_each_file_zip(u16 *zip_path, u32 (*zip_iter_callback)(char *filebuf, u64 if(r != ARCHIVE_OK) { DEBUG("Invalid zip being opened\n"); + char path[0x128] = {0}; + utf16_to_utf8((u8 *) path, zip_path, 0x128); + DEBUG("%s\n", path); return -1; } @@ -346,6 +353,9 @@ u32 zip_file_to_buf(const char * file_name, const u16 * zip_path, char ** buf) if(r != ARCHIVE_OK) { DEBUG("Invalid zip being opened\n"); + char path[0x128] = {0}; + utf16_to_utf8((u8 *) path, zip_path, 0x128); + DEBUG("%s\n", path); return 0; } @@ -566,9 +576,9 @@ renamed: char * curr_filename; if (mode == REMOTE_MODE_BADGES) { - DEBUG("Remote mode badges! Saving to /Badges/ThemePlaza Badges/\n"); - sprintf(path_to_file, "%s%s", "/Badges/ThemePlaza Badges/", filename); - curr_filename = path_to_file + strlen("/Badges/ThemePlaza Badges/"); + sprintf(path_to_file, "%sThemePlaza Badges/%s", main_paths[REMOTE_MODE_BADGES], filename); + DEBUG("Remote mode badges! Saving to %s/\n", path_to_file); + curr_filename = path_to_file + strlen(main_paths[REMOTE_MODE_BADGES]) + strlen("ThemePlaza Badges/"); } else { sprintf(path_to_file, "%s%s", main_paths[mode], filename); diff --git a/source/main.c b/source/main.c index d5611d1..2412274 100644 --- a/source/main.c +++ b/source/main.c @@ -61,10 +61,12 @@ Result archive_result; Result badge_archive_result; u32 old_time_limit; -const char * main_paths[MODE_AMOUNT] = { +const char * main_paths[REMOTE_MODE_AMOUNT] = { "/Themes/", "/Splashes/", + "/Badges/" }; + const int entries_per_screen_v[MODE_AMOUNT] = { 4, 4, diff --git a/source/themes.c b/source/themes.c index 01b3f6b..b4d7f67 100644 --- a/source/themes.c +++ b/source/themes.c @@ -378,7 +378,7 @@ Result dump_current_theme(void) } u16 path[0x107] = { 0 }; - struacat(path, "/themes/"); + struacat(path, main_paths[REMOTE_MODE_THEMES]); struacat(path, output_dir); FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_UTF16, path), FS_ATTRIBUTE_DIRECTORY); @@ -614,7 +614,7 @@ Result dump_all_themes(void) } char path[0x107] = { 0 }; - sprintf(path, "/Themes/Dump-%02lx-%ld-%s", dlc_index, extra_index, themename); + sprintf(path, "%sDump-%02lx-%ld-%s", main_paths[REMOTE_MODE_THEMES], dlc_index, extra_index, themename); DEBUG("theme folder to create: %s\n", path); FSUSER_CreateDirectory(ArchiveSD, fsMakePath(PATH_ASCII, path), FS_ATTRIBUTE_DIRECTORY);