diff options
| author | 2023-09-10 20:43:26 -0600 | |
|---|---|---|
| committer | 2023-09-10 20:43:26 -0600 | |
| commit | 0cdc8b13b743e4d7256d9337c7f01296cb98b7bd (patch) | |
| tree | 7ac4cd88f9d0d43f3e832939ba6fad8733d13815 /src/core | |
| parent | Merge pull request #11450 from lat9nq/no-vk-device-fix (diff) | |
| download | yuzu-0cdc8b13b743e4d7256d9337c7f01296cb98b7bd.tar.gz yuzu-0cdc8b13b743e4d7256d9337c7f01296cb98b7bd.tar.xz yuzu-0cdc8b13b743e4d7256d9337c7f01296cb98b7bd.zip | |
service: mii: Add mii util and result
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/core/hle/service/mii/mii.cpp | 11 | ||||
| -rw-r--r-- | src/core/hle/service/mii/mii_manager.cpp | 9 | ||||
| -rw-r--r-- | src/core/hle/service/mii/mii_result.h | 20 | ||||
| -rw-r--r-- | src/core/hle/service/mii/mii_util.h | 58 |
5 files changed, 89 insertions, 11 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 012648d69..e9095ac52 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -588,6 +588,8 @@ add_library(core STATIC | |||
| 588 | hle/service/mii/mii.h | 588 | hle/service/mii/mii.h |
| 589 | hle/service/mii/mii_manager.cpp | 589 | hle/service/mii/mii_manager.cpp |
| 590 | hle/service/mii/mii_manager.h | 590 | hle/service/mii/mii_manager.h |
| 591 | hle/service/mii/mii_result.h | ||
| 592 | hle/service/mii/mii_util.h | ||
| 591 | hle/service/mii/raw_data.cpp | 593 | hle/service/mii/raw_data.cpp |
| 592 | hle/service/mii/raw_data.h | 594 | hle/service/mii/raw_data.h |
| 593 | hle/service/mii/types.h | 595 | hle/service/mii/types.h |
diff --git a/src/core/hle/service/mii/mii.cpp b/src/core/hle/service/mii/mii.cpp index 65c11a2f3..bf3ee5907 100644 --- a/src/core/hle/service/mii/mii.cpp +++ b/src/core/hle/service/mii/mii.cpp | |||
| @@ -7,13 +7,12 @@ | |||
| 7 | #include "core/hle/service/ipc_helpers.h" | 7 | #include "core/hle/service/ipc_helpers.h" |
| 8 | #include "core/hle/service/mii/mii.h" | 8 | #include "core/hle/service/mii/mii.h" |
| 9 | #include "core/hle/service/mii/mii_manager.h" | 9 | #include "core/hle/service/mii/mii_manager.h" |
| 10 | #include "core/hle/service/mii/mii_result.h" | ||
| 10 | #include "core/hle/service/server_manager.h" | 11 | #include "core/hle/service/server_manager.h" |
| 11 | #include "core/hle/service/service.h" | 12 | #include "core/hle/service/service.h" |
| 12 | 13 | ||
| 13 | namespace Service::Mii { | 14 | namespace Service::Mii { |
| 14 | 15 | ||
| 15 | constexpr Result ERROR_INVALID_ARGUMENT{ErrorModule::Mii, 1}; | ||
| 16 | |||
| 17 | class IDatabaseService final : public ServiceFramework<IDatabaseService> { | 16 | class IDatabaseService final : public ServiceFramework<IDatabaseService> { |
| 18 | public: | 17 | public: |
| 19 | explicit IDatabaseService(Core::System& system_) | 18 | explicit IDatabaseService(Core::System& system_) |
| @@ -162,21 +161,21 @@ private: | |||
| 162 | 161 | ||
| 163 | if (age > Age::All) { | 162 | if (age > Age::All) { |
| 164 | IPC::ResponseBuilder rb{ctx, 2}; | 163 | IPC::ResponseBuilder rb{ctx, 2}; |
| 165 | rb.Push(ERROR_INVALID_ARGUMENT); | 164 | rb.Push(ResultInvalidArgument); |
| 166 | LOG_ERROR(Service_Mii, "invalid age={}", age); | 165 | LOG_ERROR(Service_Mii, "invalid age={}", age); |
| 167 | return; | 166 | return; |
| 168 | } | 167 | } |
| 169 | 168 | ||
| 170 | if (gender > Gender::All) { | 169 | if (gender > Gender::All) { |
| 171 | IPC::ResponseBuilder rb{ctx, 2}; | 170 | IPC::ResponseBuilder rb{ctx, 2}; |
| 172 | rb.Push(ERROR_INVALID_ARGUMENT); | 171 | rb.Push(ResultInvalidArgument); |
| 173 | LOG_ERROR(Service_Mii, "invalid gender={}", gender); | 172 | LOG_ERROR(Service_Mii, "invalid gender={}", gender); |
| 174 | return; | 173 | return; |
| 175 | } | 174 | } |
| 176 | 175 | ||
| 177 | if (race > Race::All) { | 176 | if (race > Race::All) { |
| 178 | IPC::ResponseBuilder rb{ctx, 2}; | 177 | IPC::ResponseBuilder rb{ctx, 2}; |
| 179 | rb.Push(ERROR_INVALID_ARGUMENT); | 178 | rb.Push(ResultInvalidArgument); |
| 180 | LOG_ERROR(Service_Mii, "invalid race={}", race); | 179 | LOG_ERROR(Service_Mii, "invalid race={}", race); |
| 181 | return; | 180 | return; |
| 182 | } | 181 | } |
| @@ -196,7 +195,7 @@ private: | |||
| 196 | LOG_ERROR(Service_Mii, "invalid argument, index cannot be greater than 5 but is {:08X}", | 195 | LOG_ERROR(Service_Mii, "invalid argument, index cannot be greater than 5 but is {:08X}", |
| 197 | index); | 196 | index); |
| 198 | IPC::ResponseBuilder rb{ctx, 2}; | 197 | IPC::ResponseBuilder rb{ctx, 2}; |
| 199 | rb.Push(ERROR_INVALID_ARGUMENT); | 198 | rb.Push(ResultInvalidArgument); |
| 200 | return; | 199 | return; |
| 201 | } | 200 | } |
| 202 | 201 | ||
diff --git a/src/core/hle/service/mii/mii_manager.cpp b/src/core/hle/service/mii/mii_manager.cpp index dd632df50..392aa78da 100644 --- a/src/core/hle/service/mii/mii_manager.cpp +++ b/src/core/hle/service/mii/mii_manager.cpp | |||
| @@ -10,14 +10,13 @@ | |||
| 10 | 10 | ||
| 11 | #include "core/hle/service/acc/profile_manager.h" | 11 | #include "core/hle/service/acc/profile_manager.h" |
| 12 | #include "core/hle/service/mii/mii_manager.h" | 12 | #include "core/hle/service/mii/mii_manager.h" |
| 13 | #include "core/hle/service/mii/mii_result.h" | ||
| 13 | #include "core/hle/service/mii/raw_data.h" | 14 | #include "core/hle/service/mii/raw_data.h" |
| 14 | 15 | ||
| 15 | namespace Service::Mii { | 16 | namespace Service::Mii { |
| 16 | 17 | ||
| 17 | namespace { | 18 | namespace { |
| 18 | 19 | ||
| 19 | constexpr Result ERROR_CANNOT_FIND_ENTRY{ErrorModule::Mii, 4}; | ||
| 20 | |||
| 21 | constexpr std::size_t DefaultMiiCount{RawData::DefaultMii.size()}; | 20 | constexpr std::size_t DefaultMiiCount{RawData::DefaultMii.size()}; |
| 22 | 21 | ||
| 23 | constexpr MiiStoreData::Name DefaultMiiName{u'n', u'o', u' ', u'n', u'a', u'm', u'e'}; | 22 | constexpr MiiStoreData::Name DefaultMiiName{u'n', u'o', u' ', u'n', u'a', u'm', u'e'}; |
| @@ -410,11 +409,11 @@ u32 MiiManager::GetCount(SourceFlag source_flag) const { | |||
| 410 | 409 | ||
| 411 | Result MiiManager::UpdateLatest(CharInfo* out_info, const CharInfo& info, SourceFlag source_flag) { | 410 | Result MiiManager::UpdateLatest(CharInfo* out_info, const CharInfo& info, SourceFlag source_flag) { |
| 412 | if ((source_flag & SourceFlag::Database) == SourceFlag::None) { | 411 | if ((source_flag & SourceFlag::Database) == SourceFlag::None) { |
| 413 | return ERROR_CANNOT_FIND_ENTRY; | 412 | return ResultNotFound; |
| 414 | } | 413 | } |
| 415 | 414 | ||
| 416 | // TODO(bunnei): We don't implement the Mii database, so we can't have an entry | 415 | // TODO(bunnei): We don't implement the Mii database, so we can't have an entry |
| 417 | return ERROR_CANNOT_FIND_ENTRY; | 416 | return ResultNotFound; |
| 418 | } | 417 | } |
| 419 | 418 | ||
| 420 | CharInfo MiiManager::BuildRandom(Age age, Gender gender, Race race) { | 419 | CharInfo MiiManager::BuildRandom(Age age, Gender gender, Race race) { |
| @@ -695,7 +694,7 @@ Result MiiManager::GetIndex([[maybe_unused]] const CharInfo& info, u32& index) { | |||
| 695 | index = INVALID_INDEX; | 694 | index = INVALID_INDEX; |
| 696 | 695 | ||
| 697 | // TODO(bunnei): We don't implement the Mii database, so we can't have an index | 696 | // TODO(bunnei): We don't implement the Mii database, so we can't have an index |
| 698 | return ERROR_CANNOT_FIND_ENTRY; | 697 | return ResultNotFound; |
| 699 | } | 698 | } |
| 700 | 699 | ||
| 701 | } // namespace Service::Mii | 700 | } // namespace Service::Mii |
diff --git a/src/core/hle/service/mii/mii_result.h b/src/core/hle/service/mii/mii_result.h new file mode 100644 index 000000000..021cb76da --- /dev/null +++ b/src/core/hle/service/mii/mii_result.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include "core/hle/result.h" | ||
| 7 | |||
| 8 | namespace Service::Mii { | ||
| 9 | |||
| 10 | constexpr Result ResultInvalidArgument{ErrorModule::Mii, 1}; | ||
| 11 | constexpr Result ResultInvalidArgumentSize{ErrorModule::Mii, 2}; | ||
| 12 | constexpr Result ResultNotUpdated{ErrorModule::Mii, 3}; | ||
| 13 | constexpr Result ResultNotFound{ErrorModule::Mii, 4}; | ||
| 14 | constexpr Result ResultDatabaseFull{ErrorModule::Mii, 5}; | ||
| 15 | constexpr Result ResultInvalidCharInfo{ErrorModule::Mii, 100}; | ||
| 16 | constexpr Result ResultInvalidStoreData{ErrorModule::Mii, 109}; | ||
| 17 | constexpr Result ResultInvalidOperation{ErrorModule::Mii, 202}; | ||
| 18 | constexpr Result ResultPermissionDenied{ErrorModule::Mii, 203}; | ||
| 19 | |||
| 20 | }; // namespace Service::Mii | ||
diff --git a/src/core/hle/service/mii/mii_util.h b/src/core/hle/service/mii/mii_util.h new file mode 100644 index 000000000..5eb6df317 --- /dev/null +++ b/src/core/hle/service/mii/mii_util.h | |||
| @@ -0,0 +1,58 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include <random> | ||
| 7 | |||
| 8 | #include "common/common_types.h" | ||
| 9 | #include "common/swap.h" | ||
| 10 | #include "common/uuid.h" | ||
| 11 | #include "core/hle/service/mii/mii_types.h" | ||
| 12 | |||
| 13 | namespace Service::Mii { | ||
| 14 | class MiiUtil { | ||
| 15 | public: | ||
| 16 | static u16 CalculateCrc16(const void* data, std::size_t size) { | ||
| 17 | s32 crc{}; | ||
| 18 | for (std::size_t i = 0; i < size; i++) { | ||
| 19 | crc ^= static_cast<const u8*>(data)[i] << 8; | ||
| 20 | for (std::size_t j = 0; j < 8; j++) { | ||
| 21 | crc <<= 1; | ||
| 22 | if ((crc & 0x10000) != 0) { | ||
| 23 | crc = (crc ^ 0x1021) & 0xFFFF; | ||
| 24 | } | ||
| 25 | } | ||
| 26 | } | ||
| 27 | return Common::swap16(static_cast<u16>(crc)); | ||
| 28 | } | ||
| 29 | |||
| 30 | static Common::UUID MakeCreateId() { | ||
| 31 | return Common::UUID::MakeRandomRFC4122V4(); | ||
| 32 | } | ||
| 33 | |||
| 34 | static Common::UUID GetDeviceId() { | ||
| 35 | // This should be nn::settings::detail::GetMiiAuthorId() | ||
| 36 | return Common::UUID::MakeDefault(); | ||
| 37 | } | ||
| 38 | |||
| 39 | template <typename T> | ||
| 40 | static T GetRandomValue(T min, T max) { | ||
| 41 | std::random_device device; | ||
| 42 | std::mt19937 gen(device()); | ||
| 43 | std::uniform_int_distribution<u64> distribution(static_cast<u64>(min), | ||
| 44 | static_cast<u64>(max)); | ||
| 45 | return static_cast<T>(distribution(gen)); | ||
| 46 | } | ||
| 47 | |||
| 48 | template <typename T> | ||
| 49 | static T GetRandomValue(T max) { | ||
| 50 | return GetRandomValue<T>({}, max); | ||
| 51 | } | ||
| 52 | |||
| 53 | static bool IsFontRegionValid(FontRegion font, std::span<const char16_t> text) { | ||
| 54 | // Todo:: This function needs to check against the font tables | ||
| 55 | return true; | ||
| 56 | } | ||
| 57 | }; | ||
| 58 | } // namespace Service::Mii | ||