From eca19aa4bf8b170be8ba2158a71050b8270199d3 Mon Sep 17 00:00:00 2001 From: ITotalJustice <47043333+ITotalJustice@users.noreply.github.com> Date: Wed, 18 Jun 2025 23:17:58 +0100 Subject: [PATCH] fix hdd createDirWithPath, improve flashcart detection in gc menu, bump version for new release 0.13.1 -> 0.13.2 --- sphaira/CMakeLists.txt | 2 +- sphaira/source/fs.cpp | 1 - sphaira/source/ui/menus/gc_menu.cpp | 22 ++++++++++++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/sphaira/CMakeLists.txt b/sphaira/CMakeLists.txt index 2a8bbd2..edd2a95 100644 --- a/sphaira/CMakeLists.txt +++ b/sphaira/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13) -set(sphaira_VERSION 0.13.1) +set(sphaira_VERSION 0.13.2) project(sphaira VERSION ${sphaira_VERSION} diff --git a/sphaira/source/fs.cpp b/sphaira/source/fs.cpp index 13e4998..8f6d4ea 100644 --- a/sphaira/source/fs.cpp +++ b/sphaira/source/fs.cpp @@ -185,7 +185,6 @@ Result CreateDirectoryRecursivelyWithPath(FsFileSystem* fs, const FsPath& _path, FsPath new_path{}; std::snprintf(new_path, sizeof(new_path), "%.*s", (int)(last_slash - _path.s), _path.s); R_TRY(CreateDirectoryRecursively(fs, new_path, ignore_read_only)); - fsFsCommit(fs); R_SUCCEED(); } diff --git a/sphaira/source/ui/menus/gc_menu.cpp b/sphaira/source/ui/menus/gc_menu.cpp index fe5961b..ff026fe 100644 --- a/sphaira/source/ui/menus/gc_menu.cpp +++ b/sphaira/source/ui/menus/gc_menu.cpp @@ -1045,25 +1045,35 @@ Result Menu::DumpGames(u32 flags) { bool is_trimmed = false; Result trim_rc = 0; if ((flags & DumpFileFlag_XCI) && m_storage_trimmed_size < m_storage_total_size) { - u8 temp{}; - if (R_FAILED(trim_rc = GcStorageRead(&temp, m_storage_trimmed_size, sizeof(temp)))) { - log_write("[GC] WARNING! GameCard is already trimmed: 0x%X FlashError: %u\n", trim_rc, trim_rc == 0x13D002); + const auto start_offset = std::min(0, m_storage_trimmed_size - 0x4000); + // works on fw 1.2.0 and below. + std::vector temp(1024*1024*1); + if (R_FAILED(trim_rc = GcStorageRead(temp.data(), m_storage_trimmed_size, std::min(temp.size(), m_storage_total_size - start_offset)))) { + log_write("[GC] WARNING1! GameCard is already trimmed: 0x%X FlashError: %u\n", trim_rc, trim_rc == 0x13D002); is_trimmed = true; } + + if (!is_trimmed) { + // works on fw 1.2.0 and below. + if (R_FAILED(trim_rc = GcStorageRead(temp.data(), m_storage_total_size - temp.size(), temp.size()))) { + log_write("[GC] WARNING2! GameCard is already trimmed: 0x%X FlashError: %u\n", trim_rc, trim_rc == 0x13D002); + is_trimmed = true; + } + } } // if trimmed and the user wants to dump the full xci, error. if ((flags & DumpFileFlag_XCI) && is_trimmed && App::GetApp()->m_dump_trim_xci.Get()) { - App::PushErrorBox(trim_rc, "GameCard is already trimmed!"_i18n); - } else if ((flags & DumpFileFlag_XCI) && is_trimmed) { App::Push(std::make_shared( "WARNING: GameCard is already trimmed!"_i18n, "Back"_i18n, "Continue"_i18n, 0, [&](auto op_index){ if (op_index && *op_index) { do_dump(flags); } - } + }, m_icon )); + } else if ((flags & DumpFileFlag_XCI) && is_trimmed) { + App::PushErrorBox(trim_rc, "GameCard is trimmed, full dump is not possible!"_i18n); } else { do_dump(flags); }