summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/mii/mii_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/mii/mii_manager.cpp')
-rw-r--r--src/core/hle/service/mii/mii_manager.cpp162
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