diff --git a/src/xenia/app/emulator_window.cc b/src/xenia/app/emulator_window.cc index 421ddc7ef..28bff7681 100644 --- a/src/xenia/app/emulator_window.cc +++ b/src/xenia/app/emulator_window.cc @@ -263,7 +263,7 @@ void EmulatorWindow::OnEmulatorInitialized() { if (!emulator_->kernel_state() ->xam_state() ->profile_manager() - ->GetProfilesCount()) { + ->GetAccountCount()) { new NoProfileDialog(imgui_drawer_.get(), this); disable_hotkeys_ = true; } diff --git a/src/xenia/app/profile_dialogs.cc b/src/xenia/app/profile_dialogs.cc index 2d623d906..82080b4aa 100644 --- a/src/xenia/app/profile_dialogs.cc +++ b/src/xenia/app/profile_dialogs.cc @@ -57,7 +57,7 @@ void CreateProfileDialog::OnDraw(ImGuiIO& io) { ImGui::BeginDisabled(!valid); if (ImGui::Button("Create")) { - bool autologin = (profile_manager->GetProfilesCount() == 0); + bool autologin = (profile_manager->GetAccountCount() == 0); if (profile_manager->CreateProfile(gamertag_string, autologin, migration_) && migration_) { @@ -89,7 +89,7 @@ void NoProfileDialog::OnDraw(ImGuiIO& io) { ->xam_state() ->profile_manager(); - if (profile_manager->GetProfilesCount()) { + if (profile_manager->GetAccountCount()) { delete this; return; } @@ -164,7 +164,7 @@ void ProfileConfigDialog::OnDraw(ImGuiIO& io) { return; } - auto profiles = profile_manager->GetProfiles(); + auto profiles = profile_manager->GetAccounts(); ImGui::SetNextWindowPos(ImVec2(40, 40), ImGuiCond_FirstUseEver); ImGui::SetNextWindowBgAlpha(0.8f); diff --git a/src/xenia/kernel/xam/profile_manager.cc b/src/xenia/kernel/xam/profile_manager.cc index ad31f8402..1ca6b954c 100644 --- a/src/xenia/kernel/xam/profile_manager.cc +++ b/src/xenia/kernel/xam/profile_manager.cc @@ -466,6 +466,14 @@ bool ProfileManager::CreateProfile(const std::string gamertag, bool autologin, return is_account_created; } +const X_XAMACCOUNTINFO* ProfileManager::GetAccount(const uint64_t xuid) { + if (!accounts_.count(xuid)) { + return nullptr; + } + + return &accounts_[xuid]; +} + bool ProfileManager::CreateAccount(const uint64_t xuid, const std::string gamertag) { X_XAMACCOUNTINFO account = {}; diff --git a/src/xenia/kernel/xam/profile_manager.h b/src/xenia/kernel/xam/profile_manager.h index 93cc36879..75e26184b 100644 --- a/src/xenia/kernel/xam/profile_manager.h +++ b/src/xenia/kernel/xam/profile_manager.h @@ -103,9 +103,12 @@ class ProfileManager { UserProfile* GetProfile(const uint8_t user_index) const; uint8_t GetUserIndexAssignedToProfile(const uint64_t xuid) const; - std::map* GetProfiles() { return &accounts_; } + const std::map* GetAccounts() { + return &accounts_; + } + const X_XAMACCOUNTINFO* GetAccount(const uint64_t xuid); - uint32_t GetProfilesCount() const { + uint32_t GetAccountCount() const { return static_cast(accounts_.size()); } bool IsAnyProfileSignedIn() const { return !logged_profiles_.empty(); } diff --git a/src/xenia/kernel/xam/xam_enum.cc b/src/xenia/kernel/xam/xam_enum.cc index 8158906f5..aba839a67 100644 --- a/src/xenia/kernel/xam/xam_enum.cc +++ b/src/xenia/kernel/xam/xam_enum.cc @@ -137,10 +137,10 @@ dword_result_t XamProfileCreateEnumerator_entry(dword_t device_id, return result; } - const auto& profiles = - kernel_state()->xam_state()->profile_manager()->GetProfiles(); + const auto& accounts = + kernel_state()->xam_state()->profile_manager()->GetAccounts(); - for (const auto& [xuid, account] : *profiles) { + for (const auto& [xuid, account] : *accounts) { X_PROFILEENUMRESULT* profile = e->AppendItem(); profile->xuid_offline = xuid; diff --git a/src/xenia/kernel/xam/xam_ui.cc b/src/xenia/kernel/xam/xam_ui.cc index 79b5d9716..73c45ea16 100644 --- a/src/xenia/kernel/xam/xam_ui.cc +++ b/src/xenia/kernel/xam/xam_ui.cc @@ -1051,7 +1051,6 @@ class SigninDialog : public XamDialog { if (ImGui::BeginPopupModal(title_.c_str(), nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { auto profile_manager = kernel_state()->xam_state()->profile_manager(); - auto profiles = profile_manager->GetProfiles(); for (uint32_t i = 0; i < users_needed_; i++) { ImGui::BeginGroup(); @@ -1136,12 +1135,12 @@ class SigninDialog : public XamDialog { // Draw profile badge. uint8_t slot = chosen_slots_[i]; uint64_t xuid = chosen_xuids_[i]; + const auto account = profile_manager->GetAccount(xuid); - if (slot == 0xFF || xuid == 0 || profiles->count(xuid) == 0) { + if (slot == 0xFF || xuid == 0 || !account) { float ypos = ImGui::GetCursorPosY(); ImGui::SetCursorPosY(ypos + ImGui::GetTextLineHeight() * 5); } else { - const X_XAMACCOUNTINFO* account = &profiles->at(xuid); xeDrawProfileContent(imgui_drawer(), xuid, slot, account, nullptr); } @@ -1229,7 +1228,7 @@ class SigninDialog : public XamDialog { void ReloadProfiles(bool first_draw) { auto profile_manager = kernel_state()->xam_state()->profile_manager(); - auto profiles = profile_manager->GetProfiles(); + auto profiles = profile_manager->GetAccounts(); profile_data_.clear(); for (auto& [xuid, account] : *profiles) { diff --git a/src/xenia/kernel/xam/xam_user.cc b/src/xenia/kernel/xam/xam_user.cc index 628af300b..d1e2dcecf 100644 --- a/src/xenia/kernel/xam/xam_user.cc +++ b/src/xenia/kernel/xam/xam_user.cc @@ -787,26 +787,26 @@ dword_result_t XamUserCreateStatsEnumerator_entry( } DECLARE_XAM_EXPORT1(XamUserCreateStatsEnumerator, kUserProfiles, kSketchy); -dword_result_t XamProfileFindAccount_entry(qword_t offline_xuid, - pointer_t account, - lpdword_t device_id) { - if (!account) { +dword_result_t XamProfileFindAccount_entry( + qword_t offline_xuid, pointer_t account_ptr, + lpdword_t device_id) { + if (!account_ptr) { return X_ERROR_INVALID_PARAMETER; } - account.Zero(); + account_ptr.Zero(); - const auto& profiles = - kernel_state()->xam_state()->profile_manager()->GetProfiles(); + const auto& account = + kernel_state()->xam_state()->profile_manager()->GetAccount(offline_xuid); - if (!profiles->count(offline_xuid)) { + if (!account) { return X_ERROR_NO_SUCH_USER; } - memcpy(account, &profiles->at(offline_xuid), sizeof(X_XAMACCOUNTINFO)); + std::memcpy(account_ptr, &account, sizeof(X_XAMACCOUNTINFO)); xe::string_util::copy_and_swap_truncating( - account->gamertag, account->gamertag, sizeof(account->gamertag)); + account_ptr->gamertag, account->gamertag, sizeof(account->gamertag)); if (device_id) { *device_id = 1;