diff --git a/src/xenia/kernel/util/game_info_database.cc b/src/xenia/kernel/util/game_info_database.cc index 8c3293dcb..e13b847cc 100644 --- a/src/xenia/kernel/util/game_info_database.cc +++ b/src/xenia/kernel/util/game_info_database.cc @@ -85,19 +85,19 @@ std::string GameInfoDatabase::GetLocalizedString(const uint32_t id, spa_gamedata_->GetExistingLanguage(language), id); } -GameInfoDatabase::Context GameInfoDatabase::GetContext( +std::optional GameInfoDatabase::GetContext( const uint32_t id) const { - Context context = {.id = xam::kInvalidContextId}; - if (!is_valid_) { - return context; + return std::nullopt; } const auto xdbf_context = spa_gamedata_->GetContext(id); if (!xdbf_context) { - return context; + return std::nullopt; } + Context context = {}; + context.id = xdbf_context->id; context.default_value = xdbf_context->default_value; context.max_value = xdbf_context->max_value; @@ -109,19 +109,19 @@ GameInfoDatabase::Context GameInfoDatabase::GetContext( return context; } -GameInfoDatabase::Property GameInfoDatabase::GetProperty( +std::optional GameInfoDatabase::GetProperty( const uint32_t id) const { - Property property = {.id = xam::kInvalidPropertyId}; - if (!is_valid_) { - return property; + return std::nullopt; } const auto xdbf_property = spa_gamedata_->GetProperty(id); if (!xdbf_property) { - return property; + return std::nullopt; } + Property property = {}; + property.id = xdbf_property->id; property.data_size = xdbf_property->data_size; property.is_system = xam::UserData::is_system_property(xdbf_property->id); @@ -132,14 +132,14 @@ GameInfoDatabase::Property GameInfoDatabase::GetProperty( return property; } -GameInfoDatabase::Achievement GameInfoDatabase::GetAchievement( +std::optional GameInfoDatabase::GetAchievement( const uint32_t id) const { - Achievement achievement = {}; - if (!is_valid_) { - return achievement; + return std::nullopt; } + Achievement achievement = {}; + const auto xdbf_achievement = spa_gamedata_->GetAchievement(id); if (!xdbf_achievement) { return achievement; @@ -190,20 +190,20 @@ GameInfoDatabase::Field GameInfoDatabase::GetField( return field; } -GameInfoDatabase::StatsView GameInfoDatabase::GetStatsView( +std::optional GameInfoDatabase::GetStatsView( const uint32_t id) const { - StatsView stats_view = {}; - if (!is_valid_) { - return stats_view; + return std::nullopt; } const auto xdbf_stats_view = spa_gamedata_->GetStatsView(id); if (!xdbf_stats_view.has_value()) { - return stats_view; + return std::nullopt; } + StatsView stats_view = {}; + stats_view.view.id = xdbf_stats_view->view_entry.id; stats_view.view.arbitrated = @@ -252,14 +252,14 @@ GameInfoDatabase::Presence GameInfoDatabase::GetPresence() const { return presence; } -GameInfoDatabase::PresenceMode GameInfoDatabase::GetPresenceMode( +std::optional GameInfoDatabase::GetPresenceMode( const uint32_t context_value) const { - PresenceMode presence_mode = {}; - if (!is_valid_) { - return presence_mode; + return std::nullopt; } + PresenceMode presence_mode = {}; + const auto xdbf_presence_mode = spa_gamedata_->GetPresenceMode(context_value); if (!xdbf_presence_mode.has_value()) { @@ -369,7 +369,11 @@ std::vector GameInfoDatabase::GetContexts() const { const auto xdbf_contexts = spa_gamedata_->GetContexts(); for (const auto& entry : xdbf_contexts) { - contexts.push_back(GetContext(entry->id)); + const auto context = GetContext(entry->id); + + if (context.has_value()) { + contexts.push_back(context.value()); + } } return contexts; @@ -385,7 +389,11 @@ std::vector GameInfoDatabase::GetProperties() const auto xdbf_properties = spa_gamedata_->GetProperties(); for (const auto& entry : xdbf_properties) { - properties.push_back(GetProperty(entry->id)); + const auto property = GetProperty(entry->id); + + if (property.has_value()) { + properties.push_back(property.value()); + } } return properties; @@ -401,7 +409,11 @@ std::vector GameInfoDatabase::GetAchievements() const auto xdbf_achievements = spa_gamedata_->GetAchievements(); for (const auto& entry : xdbf_achievements) { - achievements.push_back(GetAchievement(entry->id)); + auto achievement = GetAchievement(entry->id); + + if (achievement.has_value()) { + achievements.push_back(achievement.value()); + } } return achievements; @@ -418,7 +430,11 @@ std::vector GameInfoDatabase::GetStatsViews() const auto xdbf_stats_views = spa_gamedata_->GetStatsViews(); for (const auto& entry : *xdbf_stats_views) { - stats_views.push_back(GetStatsView(entry.view_entry.id)); + auto stats_view = GetStatsView(entry.view_entry.id); + + if (stats_view.has_value()) { + stats_views.push_back(stats_view.value()); + } } return stats_views; @@ -437,7 +453,11 @@ std::vector GameInfoDatabase::GetPresenceModes() for (uint32_t context_value = 0; context_value < xdbf_presence_modes.size(); context_value++) { - presence_modes.push_back(GetPresenceMode(context_value)); + const auto presence_mode = GetPresenceMode(context_value); + + if (presence_mode.has_value()) { + presence_modes.push_back(presence_mode.value()); + } } return presence_modes; diff --git a/src/xenia/kernel/util/game_info_database.h b/src/xenia/kernel/util/game_info_database.h index bccef285d..16a2b1529 100644 --- a/src/xenia/kernel/util/game_info_database.h +++ b/src/xenia/kernel/util/game_info_database.h @@ -144,14 +144,18 @@ class GameInfoDatabase { std::vector GetIcon() const; - Context GetContext(const uint32_t id) const; - Property GetProperty(const uint32_t id) const; - Achievement GetAchievement(const uint32_t id) const; + std::optional GetContext(const uint32_t id) const; + std::optional GetProperty( + const uint32_t id) const; + std::optional GetAchievement( + const uint32_t id) const; PropertyBag GetPropertyBag(const xam::PropertyBag& property_bag) const; Field GetField(const xam::ViewFieldEntry& field_entry) const; - StatsView GetStatsView(const uint32_t id) const; + std::optional GetStatsView( + const uint32_t id) const; Presence GetPresence() const; - PresenceMode GetPresenceMode(const uint32_t context_value) const; + std::optional GetPresenceMode( + const uint32_t context_value) const; std::vector GetPresenceModes( const std::vector property_bags) const;