fix invalid character being set in file path for themes (via theme name or author). log module in error box.

fixes #184
This commit is contained in:
ITotalJustice
2025-06-23 17:08:42 +01:00
parent e039309a77
commit aa724e12ba
3 changed files with 42 additions and 4 deletions

View File

@@ -17,6 +17,7 @@ private:
std::optional<Result> m_code{};
std::string m_message{};
std::string m_code_message{};
std::string m_code_module{};
};
} // namespace sphaira::ui

View File

@@ -6,11 +6,35 @@
namespace sphaira::ui {
namespace {
auto GetModule(Result rc) -> const char* {
switch (R_MODULE(rc)) {
case Module_Svc: return "Svc";
case Module_Fs: return "Fs";
case Module_Os: return "Os";
case Module_Ncm: return "Ncm";
case Module_Ns: return "Ns";
case Module_Spl: return "Spl";
case Module_Applet: return "Applet";
case Module_Usb: return "Usb";
case Module_Irsensor: return "Irsensor";
case Module_Libnx: return "Libnx";
case Module_Sphaira: return "Sphaira";
}
return nullptr;
}
auto GetCodeMessage(Result rc) -> const char* {
switch (rc) {
case SvcError_TimedOut: return "SvcError_TimedOut";
case SvcError_Cancelled: return "SvcError_Cancelled";
case FsError_PathNotFound: return "FsError_PathNotFound";
case FsError_PathAlreadyExists: return "FsError_PathAlreadyExists";
case FsError_TargetLocked: return "FsError_TargetLocked";
case FsError_TooLongPath: return "FsError_TooLongPath";
case FsError_InvalidCharacter: return "FsError_InvalidCharacter";
case FsError_InvalidOffset: return "FsError_InvalidOffset";
case FsError_InvalidSize: return "FsError_InvalidSize";
case Result_TransferCancelled: return "SphairaError_TransferCancelled";
case Result_StreamBadSeek: return "SphairaError_StreamBadSeek";
@@ -143,7 +167,11 @@ ErrorBox::ErrorBox(const std::string& message) : m_message{message} {
ErrorBox::ErrorBox(Result code, const std::string& message) : ErrorBox{message} {
m_code = code;
m_code_message = GetCodeMessage(code);
log_write("[ERROR] Code: 0x%X Module: %u Description: %u\n", R_VALUE(code), R_MODULE(code), R_DESCRIPTION(code));
m_code_module = std::to_string(R_MODULE(code));
if (auto str = GetModule(code)) {
m_code_module += " (" + std::string(str) + ")";
}
log_write("[ERROR] Code: 0x%X Module: %s Description: %u\n", R_VALUE(code), m_code_module.c_str(), R_DESCRIPTION(code));
}
auto ErrorBox::Update(Controller* controller, TouchInfo* touch) -> void {
@@ -161,7 +189,7 @@ auto ErrorBox::Draw(NVGcontext* vg, Theme* theme) -> void {
if (m_code.has_value()) {
const auto code = m_code.value();
if (m_code_message.empty()) {
gfx::drawTextArgs(vg, center_x, 270, 25, NVG_ALIGN_CENTER | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "Code: 0x%X Module: %u Description: 0x%X", R_VALUE(code), R_MODULE(code), R_DESCRIPTION(code));
gfx::drawTextArgs(vg, center_x, 270, 25, NVG_ALIGN_CENTER | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "Code: 0x%X Module: %s", R_VALUE(code), m_code_module.c_str());
} else {
gfx::drawTextArgs(vg, center_x, 270, 25, NVG_ALIGN_CENTER | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "%s", m_code_message.c_str());
}

View File

@@ -13,6 +13,7 @@
#include "i18n.hpp"
#include "threaded_file_transfer.hpp"
#include "image.hpp"
#include "title_info.hpp"
#include <minIni.h>
#include <stb_image.h>
@@ -260,9 +261,17 @@ auto InstallTheme(ProgressBox* pbox, const PackListEntry& entry) -> Result {
ON_SCOPE_EXIT(fs.DeleteFile(zip_out));
// create directories
// replace invalid characters in the name.
fs::FsPath name_buf{entry.details.name};
title::utilsReplaceIllegalCharacters(name_buf, false);
// replace invalid characters in the author.
fs::FsPath author_buf{entry.creator.display_name};
title::utilsReplaceIllegalCharacters(author_buf, false);
// create directories.
fs::FsPath dir_path;
std::snprintf(dir_path, sizeof(dir_path), "%s/%s - By %s", THEME_FOLDER.s, entry.details.name.c_str(), entry.creator.display_name.c_str());
std::snprintf(dir_path, sizeof(dir_path), "%s/%s - By %s", THEME_FOLDER.s, name_buf.s, author_buf.s);
fs.CreateDirectoryRecursively(dir_path);
// 3. extract the zip