From d2f350d0d32672b7a7045c62c82d0495e1c8dbdc Mon Sep 17 00:00:00 2001 From: Gliniak Date: Sat, 8 Mar 2025 18:12:36 +0100 Subject: [PATCH] [XAM] UserTracker: Added option to return user specific list of contexts and properties --- src/xenia/kernel/xam/user_tracker.cc | 44 ++++++++++++++++++++++++++++ src/xenia/kernel/xam/user_tracker.h | 2 ++ 2 files changed, 46 insertions(+) diff --git a/src/xenia/kernel/xam/user_tracker.cc b/src/xenia/kernel/xam/user_tracker.cc index 0deb4f728..27ed39da3 100644 --- a/src/xenia/kernel/xam/user_tracker.cc +++ b/src/xenia/kernel/xam/user_tracker.cc @@ -641,6 +641,50 @@ std::optional UserTracker::GetUserContext(uint64_t xuid, return entry->get_data()->data.u32; } +std::vector UserTracker::GetUserContextIds(uint64_t xuid) const { + if (!IsUserTracked(xuid)) { + return {}; + } + + auto user = kernel_state()->xam_state()->GetUserProfile(xuid); + if (!user) { + return {}; + } + + std::vector entries; + + for (const auto& property : user->properties_) { + if (!property.IsContext()) { + continue; + } + + entries.push_back(property.GetPropertyId()); + } + return entries; +} + +std::vector UserTracker::GetUserPropertyIds(uint64_t xuid) const { + if (!IsUserTracked(xuid)) { + return {}; + } + + auto user = kernel_state()->xam_state()->GetUserProfile(xuid); + if (!user) { + return {}; + } + + std::vector entries; + + for (const auto& property : user->properties_) { + if (property.IsContext()) { + continue; + } + + entries.push_back(property.GetPropertyId()); + } + return entries; +} + void UserTracker::UpdateSettingValue(uint64_t xuid, uint32_t title_id, UserSettingId setting_id, int32_t difference) { diff --git a/src/xenia/kernel/xam/user_tracker.h b/src/xenia/kernel/xam/user_tracker.h index d0eb31dc4..943cc81b3 100644 --- a/src/xenia/kernel/xam/user_tracker.h +++ b/src/xenia/kernel/xam/user_tracker.h @@ -62,12 +62,14 @@ class UserTracker { // Context void UpdateContext(uint64_t xuid, uint32_t id, uint32_t value); std::optional GetUserContext(uint64_t xuid, uint32_t id) const; + std::vector GetUserContextIds(uint64_t xuid) const; // Property void AddProperty(const uint64_t xuid, const Property* property); X_STATUS GetProperty(const uint64_t xuid, uint32_t* property_size, XUSER_PROPERTY* property); const Property* GetProperty(const uint64_t xuid, const uint32_t id) const; + std::vector GetUserPropertyIds(uint64_t xuid) const; // Settings void UpsertSetting(uint64_t xuid, uint32_t title_id,