diff options
author | german77 <juangerman-13@hotmail.com> | 2023-09-11 08:58:46 +0200 |
---|---|---|
committer | german77 <juangerman-13@hotmail.com> | 2023-09-11 08:58:46 +0200 |
commit | bd169f417f471f574784fa3b499f57ad42cf1013 (patch) | |
tree | 5671f7c85a1f69d2dad2eb895878c0981d205ad7 /src/core/hle/service/mii/mii_manager.cpp | |
parent | service: mii: Fix ver3 inconsistencies (diff) | |
download | yuzu-bd169f417f471f574784fa3b499f57ad42cf1013.tar yuzu-bd169f417f471f574784fa3b499f57ad42cf1013.tar.gz yuzu-bd169f417f471f574784fa3b499f57ad42cf1013.tar.bz2 yuzu-bd169f417f471f574784fa3b499f57ad42cf1013.tar.lz yuzu-bd169f417f471f574784fa3b499f57ad42cf1013.tar.xz yuzu-bd169f417f471f574784fa3b499f57ad42cf1013.tar.zst yuzu-bd169f417f471f574784fa3b499f57ad42cf1013.zip |
Diffstat (limited to 'src/core/hle/service/mii/mii_manager.cpp')
-rw-r--r-- | src/core/hle/service/mii/mii_manager.cpp | 162 |
1 files changed, 102 insertions, 60 deletions
diff --git a/src/core/hle/service/mii/mii_manager.cpp b/src/core/hle/service/mii/mii_manager.cpp index 3951e0b9c..153a484c0 100644 --- a/src/core/hle/service/mii/mii_manager.cpp +++ b/src/core/hle/service/mii/mii_manager.cpp @@ -16,45 +16,18 @@ #include "core/hle/service/mii/types/raw_data.h" namespace Service::Mii { - -namespace { - constexpr std::size_t DefaultMiiCount{RawData::DefaultMii.size()}; -CharInfo ConvertStoreDataToInfo(const StoreData& data) { - CharInfo char_info{}; - char_info.SetFromStoreData(data); - return char_info; -} - -StoreData BuildRandomStoreData(Age age, Gender gender, Race race, const Common::UUID& user_id) { - StoreData store_data{}; - store_data.BuildRandom(age, gender, race); - - return store_data; -} +MiiManager::MiiManager() {} -StoreData BuildDefaultStoreData(const DefaultMii& info, const Common::UUID& user_id) { - StoreData store_data{}; - store_data.BuildDefault(0); - - return store_data; -} - -} // namespace - -MiiManager::MiiManager() : user_id{Service::Account::ProfileManager().GetLastOpenedUser()} {} - -bool MiiManager::CheckAndResetUpdateCounter(SourceFlag source_flag, u64& current_update_counter) { +bool MiiManager::IsUpdated(DatabaseSessionMetadata& metadata, SourceFlag source_flag) const { if ((source_flag & SourceFlag::Database) == SourceFlag::None) { return false; } - const bool result{current_update_counter != update_counter}; - - current_update_counter = update_counter; - - return result; + const auto metadata_update_counter = metadata.update_counter; + metadata.update_counter = update_counter; + return metadata_update_counter != update_counter; } bool MiiManager::IsFullDatabase() const { @@ -62,19 +35,19 @@ bool MiiManager::IsFullDatabase() const { return false; } -u32 MiiManager::GetCount(SourceFlag source_flag) const { - std::size_t count{}; - if ((source_flag & SourceFlag::Database) != SourceFlag::None) { - // TODO(bunnei): We don't implement the Mii database, but when we do, update this - count += 0; +u32 MiiManager::GetCount(const DatabaseSessionMetadata& metadata, SourceFlag source_flag) const { + u32 mii_count{}; + if ((source_flag & SourceFlag::Default) == SourceFlag::None) { + mii_count += DefaultMiiCount; } - if ((source_flag & SourceFlag::Default) != SourceFlag::None) { - count += DefaultMiiCount; + if ((source_flag & SourceFlag::Database) == SourceFlag::None) { + // TODO(bunnei): We don't implement the Mii database, but when we do, update this } - return static_cast<u32>(count); + return mii_count; } -Result MiiManager::UpdateLatest(CharInfo* out_info, const CharInfo& info, SourceFlag source_flag) { +Result MiiManager::UpdateLatest(DatabaseSessionMetadata& metadata, CharInfo& out_char_info, + const CharInfo& char_info, SourceFlag source_flag) { if ((source_flag & SourceFlag::Database) == SourceFlag::None) { return ResultNotFound; } @@ -83,48 +56,117 @@ Result MiiManager::UpdateLatest(CharInfo* out_info, const CharInfo& info, Source return ResultNotFound; } -CharInfo MiiManager::BuildRandom(Age age, Gender gender, Race race) { - return ConvertStoreDataToInfo(BuildRandomStoreData(age, gender, race, user_id)); +void MiiManager::BuildDefault(CharInfo& out_char_info, u32 index) const { + StoreData store_data{}; + store_data.BuildDefault(index); + out_char_info.SetFromStoreData(store_data); } -CharInfo MiiManager::BuildBase(Gender gender) { - const std::size_t index = gender == Gender::Female ? 1 : 0; - return ConvertStoreDataToInfo(BuildDefaultStoreData(RawData::BaseMii.at(index), user_id)); +void MiiManager::BuildBase(CharInfo& out_char_info, Gender gender) const { + StoreData store_data{}; + store_data.BuildBase(gender); + out_char_info.SetFromStoreData(store_data); } -CharInfo MiiManager::BuildDefault(std::size_t index) { - return ConvertStoreDataToInfo(BuildDefaultStoreData(RawData::DefaultMii.at(index), user_id)); +void MiiManager::BuildRandom(CharInfo& out_char_info, Age age, Gender gender, Race race) const { + StoreData store_data{}; + store_data.BuildRandom(age, gender, race); + out_char_info.SetFromStoreData(store_data); } -CharInfo MiiManager::ConvertV3ToCharInfo(const Ver3StoreData& mii_v3) const { - CharInfo char_info{}; +void MiiManager::ConvertV3ToCharInfo(CharInfo& out_char_info, const Ver3StoreData& mii_v3) const { StoreData store_data{}; mii_v3.BuildToStoreData(store_data); - char_info.SetFromStoreData(store_data); - return char_info; + out_char_info.SetFromStoreData(store_data); } -std::vector<CharInfoElement> MiiManager::GetDefault(SourceFlag source_flag) { - std::vector<CharInfoElement> result; +Result MiiManager::Get(const DatabaseSessionMetadata& metadata, + std::span<CharInfoElement> out_elements, u32& out_count, + SourceFlag source_flag) { + if ((source_flag & SourceFlag::Database) == SourceFlag::None) { + return BuildDefault(out_elements, out_count, source_flag); + } + // TODO(bunnei): We don't implement the Mii database, so we can't have an entry + + // Include default Mii at the end of the list + return BuildDefault(out_elements, out_count, source_flag); +} + +Result MiiManager::Get(const DatabaseSessionMetadata& metadata, std::span<CharInfo> out_char_info, + u32& out_count, SourceFlag source_flag) { + if ((source_flag & SourceFlag::Database) == SourceFlag::None) { + return BuildDefault(out_char_info, out_count, source_flag); + } + + // TODO(bunnei): We don't implement the Mii database, so we can't have an entry + + // Include default Mii at the end of the list + return BuildDefault(out_char_info, out_count, source_flag); +} + +Result MiiManager::BuildDefault(std::span<CharInfoElement> out_elements, u32& out_count, + SourceFlag source_flag) { + if ((source_flag & SourceFlag::Default) == SourceFlag::None) { + return ResultSuccess; + } + + StoreData store_data{}; + + for (std::size_t index = 0; index < DefaultMiiCount; ++index) { + if (out_elements.size() <= static_cast<std::size_t>(out_count)) { + return ResultInvalidArgumentSize; + } + + store_data.BuildDefault(static_cast<u32>(index)); + + out_elements[out_count].source = Source::Default; + out_elements[out_count].char_info.SetFromStoreData(store_data); + out_count++; + } + + return ResultSuccess; +} + +Result MiiManager::BuildDefault(std::span<CharInfo> out_char_info, u32& out_count, + SourceFlag source_flag) { if ((source_flag & SourceFlag::Default) == SourceFlag::None) { - return result; + return ResultSuccess; } - for (std::size_t index = 0; index < DefaultMiiCount; index++) { - result.emplace_back(BuildDefault(index), Source::Default); + StoreData store_data{}; + + for (std::size_t index = 0; index < DefaultMiiCount; ++index) { + if (out_char_info.size() <= static_cast<std::size_t>(out_count)) { + return ResultInvalidArgumentSize; + } + + store_data.BuildDefault(static_cast<u32>(index)); + + out_char_info[out_count].SetFromStoreData(store_data); + out_count++; } - return result; + return ResultSuccess; } -Result MiiManager::GetIndex([[maybe_unused]] const CharInfo& info, u32& index) { +Result MiiManager::GetIndex(const DatabaseSessionMetadata& metadata, const CharInfo& char_info, + s32& out_index) { + + if (char_info.Verify() != 0) { + return ResultInvalidCharInfo; + } + constexpr u32 INVALID_INDEX{0xFFFFFFFF}; - index = INVALID_INDEX; + out_index = INVALID_INDEX; // TODO(bunnei): We don't implement the Mii database, so we can't have an index return ResultNotFound; } +void MiiManager::SetInterfaceVersion(DatabaseSessionMetadata& metadata, u32 version) { + metadata.interface_version = version; +} + } // namespace Service::Mii |