From 6b85d2cef15b2b1f87755d3b2d27e6140d716e21 Mon Sep 17 00:00:00 2001 From: ITotalJustice <47043333+ITotalJustice@users.noreply.github.com> Date: Thu, 19 Jun 2025 11:37:08 +0100 Subject: [PATCH] fix account save listing where the profile uid differs from the account uid. i am unsure how this happens, as i thought the profile uid was the same as the account uid, but apparently this can differ. on the same switch in sysmmc, the uid's match, so everything works. again on the same switch, created in emummc, same account, the uid differs... i performed the same test but on another 2 switches, and the uid's all match, so i am not sure what causes them to change. in any case, using the uid from the account is the intended behaviour anyway, so this commit fixes that. --- sphaira/include/app.hpp | 4 ++++ sphaira/source/ui/menus/save_menu.cpp | 32 ++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/sphaira/include/app.hpp b/sphaira/include/app.hpp index 7a1b7b9..f3b1f7f 100644 --- a/sphaira/include/app.hpp +++ b/sphaira/include/app.hpp @@ -227,6 +227,10 @@ public: AccountProfileBase base; if (R_SUCCEEDED(accountProfileGet(&profile, nullptr, &base))) { + // sometimes the uid for the acc can differ to the base. + base.uid = uids[i]; + log_write("[ACC] found uid: 0x%016lX%016lX\n", uids[i].uid[0], uids[i].uid[1]); + log_write("[ACC] base uid: 0x%016lX%016lX\n", base.uid.uid[0], base.uid.uid[1]); out.emplace_back(base); } } diff --git a/sphaira/source/ui/menus/save_menu.cpp b/sphaira/source/ui/menus/save_menu.cpp index d333145..ca1c2ca 100644 --- a/sphaira/source/ui/menus/save_menu.cpp +++ b/sphaira/source/ui/menus/save_menu.cpp @@ -815,6 +815,9 @@ Menu::Menu(u32 flags) : grid::Menu{"Saves"_i18n, flags} { if (it != m_accounts.end()) { m_account_index = std::distance(m_accounts.begin(), it); + log_write("[SAVE] found account uid at: %zu\n", m_account_index); + } else { + log_write("[SAVE] account uid is not found: 0x%016lX%016lX\n", uid.uid[0], uid.uid[1]); } for (auto& e : ncm_entries) { @@ -936,10 +939,26 @@ void Menu::SetIndex(s64 index) { m_list->SetYoff(0); } + if (m_accounts.empty()) { + return; + } + + u64 id{}; + if (!m_entries.empty()) { + if (m_data_type == FsSaveDataType_System || m_data_type == FsSaveDataType_SystemBcat) { + id = m_entries[m_index].system_save_data_id; + } else { + id = m_entries[m_index].application_id; + } + + this->SetSubHeading(std::to_string(m_index + 1) + " / " + std::to_string(m_entries.size())); + } else { + this->SetSubHeading("0 / 0"); + } + char title[0x40]; - std::snprintf(title, sizeof(title), "%s | %016lX", m_accounts[m_account_index].nickname, m_entries[m_index].application_id); + std::snprintf(title, sizeof(title), "%s | %016lX", m_accounts[m_account_index].nickname, id); SetTitleSubHeading(title); - this->SetSubHeading(std::to_string(m_index + 1) + " / " + std::to_string(m_entries.size())); } void Menu::ScanHomebrew() { @@ -947,7 +966,10 @@ void Menu::ScanHomebrew() { TimeStamp ts; FreeEntries(); + ClearSelection(); m_entries.reserve(ENTRY_CHUNK_COUNT); + m_is_reversed = false; + m_dirty = false; if (m_accounts.empty()) { return; @@ -958,7 +980,9 @@ void Menu::ScanHomebrew() { GetFsSaveAttr(m_accounts[m_account_index], m_data_type, space_id, filter); FsSaveDataInfoReader reader; - fsOpenSaveDataInfoReaderWithFilter(&reader, space_id, &filter); + if (R_FAILED(fsOpenSaveDataInfoReaderWithFilter(&reader, space_id, &filter))) { + log_write("[SAVE] failed to open reader\n"); + } ON_SCOPE_EXIT(fsSaveDataInfoReaderClose(&reader)); std::vector info_list(ENTRY_CHUNK_COUNT); @@ -979,8 +1003,6 @@ void Menu::ScanHomebrew() { } } - m_is_reversed = false; - m_dirty = false; log_write("games found: %zu time_taken: %.2f seconds %zu ms %zu ns\n", m_entries.size(), ts.GetSecondsD(), ts.GetMs(), ts.GetNs()); this->Sort(); SetIndex(0);