summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-12-18 09:07:25 -0500
committerGravatar Zach Hilman2019-04-25 08:07:57 -0400
commitca5638a1426ce560f3896b3ff0d3efd02b654585 (patch)
tree45ad83b82fd843aa08371365410e7b1780b58c5f /src/core
parentMerge pull request #2416 from lioncash/wait (diff)
downloadyuzu-ca5638a1426ce560f3896b3ff0d3efd02b654585.tar.gz
yuzu-ca5638a1426ce560f3896b3ff0d3efd02b654585.tar.xz
yuzu-ca5638a1426ce560f3896b3ff0d3efd02b654585.zip
common: Extract UUID to its own class
Since the Mii database uses UUIDs very similar to the Accounts database, it makes no sense to not share code between them.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/service/acc/acc.cpp18
-rw-r--r--src/core/hle/service/acc/profile_manager.cpp22
-rw-r--r--src/core/hle/service/acc/profile_manager.h66
3 files changed, 28 insertions, 78 deletions
diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp
index ba7d7acbd..86bf53d08 100644
--- a/src/core/hle/service/acc/acc.cpp
+++ b/src/core/hle/service/acc/acc.cpp
@@ -34,7 +34,7 @@ constexpr std::array<u8, backup_jpeg_size> backup_jpeg{{
34 0x01, 0x01, 0x00, 0x00, 0x3f, 0x00, 0xd2, 0xcf, 0x20, 0xff, 0xd9, 34 0x01, 0x01, 0x00, 0x00, 0x3f, 0x00, 0xd2, 0xcf, 0x20, 0xff, 0xd9,
35}}; 35}};
36 36
37static std::string GetImagePath(UUID uuid) { 37static std::string GetImagePath(Common::UUID uuid) {
38 return FileUtil::GetUserPath(FileUtil::UserPath::NANDDir) + 38 return FileUtil::GetUserPath(FileUtil::UserPath::NANDDir) +
39 "/system/save/8000000000000010/su/avators/" + uuid.FormatSwitch() + ".jpg"; 39 "/system/save/8000000000000010/su/avators/" + uuid.FormatSwitch() + ".jpg";
40} 40}
@@ -46,7 +46,7 @@ static constexpr u32 SanitizeJPEGSize(std::size_t size) {
46 46
47class IProfile final : public ServiceFramework<IProfile> { 47class IProfile final : public ServiceFramework<IProfile> {
48public: 48public:
49 explicit IProfile(UUID user_id, ProfileManager& profile_manager) 49 explicit IProfile(Common::UUID user_id, ProfileManager& profile_manager)
50 : ServiceFramework("IProfile"), profile_manager(profile_manager), user_id(user_id) { 50 : ServiceFramework("IProfile"), profile_manager(profile_manager), user_id(user_id) {
51 static const FunctionInfo functions[] = { 51 static const FunctionInfo functions[] = {
52 {0, &IProfile::Get, "Get"}, 52 {0, &IProfile::Get, "Get"},
@@ -131,7 +131,7 @@ private:
131 } 131 }
132 132
133 const ProfileManager& profile_manager; 133 const ProfileManager& profile_manager;
134 UUID user_id; ///< The user id this profile refers to. 134 Common::UUID user_id; ///< The user id this profile refers to.
135}; 135};
136 136
137class IManagerForApplication final : public ServiceFramework<IManagerForApplication> { 137class IManagerForApplication final : public ServiceFramework<IManagerForApplication> {
@@ -179,7 +179,7 @@ void Module::Interface::GetUserCount(Kernel::HLERequestContext& ctx) {
179 179
180void Module::Interface::GetUserExistence(Kernel::HLERequestContext& ctx) { 180void Module::Interface::GetUserExistence(Kernel::HLERequestContext& ctx) {
181 IPC::RequestParser rp{ctx}; 181 IPC::RequestParser rp{ctx};
182 UUID user_id = rp.PopRaw<UUID>(); 182 Common::UUID user_id = rp.PopRaw<Common::UUID>();
183 LOG_INFO(Service_ACC, "called user_id={}", user_id.Format()); 183 LOG_INFO(Service_ACC, "called user_id={}", user_id.Format());
184 184
185 IPC::ResponseBuilder rb{ctx, 3}; 185 IPC::ResponseBuilder rb{ctx, 3};
@@ -205,12 +205,12 @@ void Module::Interface::GetLastOpenedUser(Kernel::HLERequestContext& ctx) {
205 LOG_INFO(Service_ACC, "called"); 205 LOG_INFO(Service_ACC, "called");
206 IPC::ResponseBuilder rb{ctx, 6}; 206 IPC::ResponseBuilder rb{ctx, 6};
207 rb.Push(RESULT_SUCCESS); 207 rb.Push(RESULT_SUCCESS);
208 rb.PushRaw<UUID>(profile_manager->GetLastOpenedUser()); 208 rb.PushRaw<Common::UUID>(profile_manager->GetLastOpenedUser());
209} 209}
210 210
211void Module::Interface::GetProfile(Kernel::HLERequestContext& ctx) { 211void Module::Interface::GetProfile(Kernel::HLERequestContext& ctx) {
212 IPC::RequestParser rp{ctx}; 212 IPC::RequestParser rp{ctx};
213 UUID user_id = rp.PopRaw<UUID>(); 213 Common::UUID user_id = rp.PopRaw<Common::UUID>();
214 LOG_DEBUG(Service_ACC, "called user_id={}", user_id.Format()); 214 LOG_DEBUG(Service_ACC, "called user_id={}", user_id.Format());
215 215
216 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 216 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
@@ -245,15 +245,15 @@ void Module::Interface::TrySelectUserWithoutInteraction(Kernel::HLERequestContex
245 IPC::ResponseBuilder rb{ctx, 6}; 245 IPC::ResponseBuilder rb{ctx, 6};
246 if (profile_manager->GetUserCount() != 1) { 246 if (profile_manager->GetUserCount() != 1) {
247 rb.Push(RESULT_SUCCESS); 247 rb.Push(RESULT_SUCCESS);
248 rb.PushRaw<u128>(INVALID_UUID); 248 rb.PushRaw<u128>(Common::INVALID_UUID);
249 return; 249 return;
250 } 250 }
251 251
252 const auto user_list = profile_manager->GetAllUsers(); 252 const auto user_list = profile_manager->GetAllUsers();
253 if (std::all_of(user_list.begin(), user_list.end(), 253 if (std::all_of(user_list.begin(), user_list.end(),
254 [](const auto& user) { return user.uuid == INVALID_UUID; })) { 254 [](const auto& user) { return user.uuid == Common::INVALID_UUID; })) {
255 rb.Push(ResultCode(-1)); // TODO(ogniK): Find the correct error code 255 rb.Push(ResultCode(-1)); // TODO(ogniK): Find the correct error code
256 rb.PushRaw<u128>(INVALID_UUID); 256 rb.PushRaw<u128>(Common::INVALID_UUID);
257 return; 257 return;
258 } 258 }
259 259
diff --git a/src/core/hle/service/acc/profile_manager.cpp b/src/core/hle/service/acc/profile_manager.cpp
index 1316d0b07..767523dbc 100644
--- a/src/core/hle/service/acc/profile_manager.cpp
+++ b/src/core/hle/service/acc/profile_manager.cpp
@@ -13,6 +13,8 @@
13 13
14namespace Service::Account { 14namespace Service::Account {
15 15
16using namespace Common;
17
16struct UserRaw { 18struct UserRaw {
17 UUID uuid; 19 UUID uuid;
18 UUID uuid2; 20 UUID uuid2;
@@ -35,26 +37,6 @@ constexpr ResultCode ERROR_ARGUMENT_IS_NULL(ErrorModule::Account, 20);
35 37
36constexpr char ACC_SAVE_AVATORS_BASE_PATH[] = "/system/save/8000000000000010/su/avators/"; 38constexpr char ACC_SAVE_AVATORS_BASE_PATH[] = "/system/save/8000000000000010/su/avators/";
37 39
38UUID UUID::Generate() {
39 std::random_device device;
40 std::mt19937 gen(device());
41 std::uniform_int_distribution<u64> distribution(1, std::numeric_limits<u64>::max());
42 return UUID{distribution(gen), distribution(gen)};
43}
44
45std::string UUID::Format() const {
46 return fmt::format("0x{:016X}{:016X}", uuid[1], uuid[0]);
47}
48
49std::string UUID::FormatSwitch() const {
50 std::array<u8, 16> s{};
51 std::memcpy(s.data(), uuid.data(), sizeof(u128));
52 return fmt::format("{:02x}{:02x}{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{"
53 ":02x}{:02x}{:02x}{:02x}{:02x}",
54 s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9], s[10], s[11],
55 s[12], s[13], s[14], s[15]);
56}
57
58ProfileManager::ProfileManager() { 40ProfileManager::ProfileManager() {
59 ParseUserSaveFile(); 41 ParseUserSaveFile();
60 42
diff --git a/src/core/hle/service/acc/profile_manager.h b/src/core/hle/service/acc/profile_manager.h
index c4ce2e0b3..fd7abb541 100644
--- a/src/core/hle/service/acc/profile_manager.h
+++ b/src/core/hle/service/acc/profile_manager.h
@@ -9,47 +9,15 @@
9 9
10#include "common/common_types.h" 10#include "common/common_types.h"
11#include "common/swap.h" 11#include "common/swap.h"
12#include "common/uuid.h"
12#include "core/hle/result.h" 13#include "core/hle/result.h"
13 14
14namespace Service::Account { 15namespace Service::Account {
15constexpr std::size_t MAX_USERS = 8; 16constexpr std::size_t MAX_USERS = 8;
16constexpr u128 INVALID_UUID{{0, 0}};
17
18struct UUID {
19 // UUIDs which are 0 are considered invalid!
20 u128 uuid = INVALID_UUID;
21 UUID() = default;
22 explicit UUID(const u128& id) : uuid{id} {}
23 explicit UUID(const u64 lo, const u64 hi) : uuid{{lo, hi}} {}
24
25 explicit operator bool() const {
26 return uuid != INVALID_UUID;
27 }
28
29 bool operator==(const UUID& rhs) const {
30 return uuid == rhs.uuid;
31 }
32
33 bool operator!=(const UUID& rhs) const {
34 return !operator==(rhs);
35 }
36
37 // TODO(ogniK): Properly generate uuids based on RFC-4122
38 static UUID Generate();
39
40 // Set the UUID to {0,0} to be considered an invalid user
41 void Invalidate() {
42 uuid = INVALID_UUID;
43 }
44
45 std::string Format() const;
46 std::string FormatSwitch() const;
47};
48static_assert(sizeof(UUID) == 16, "UUID is an invalid size!");
49 17
50constexpr std::size_t profile_username_size = 32; 18constexpr std::size_t profile_username_size = 32;
51using ProfileUsername = std::array<u8, profile_username_size>; 19using ProfileUsername = std::array<u8, profile_username_size>;
52using UserIDArray = std::array<UUID, MAX_USERS>; 20using UserIDArray = std::array<Common::UUID, MAX_USERS>;
53 21
54/// Contains extra data related to a user. 22/// Contains extra data related to a user.
55/// TODO: RE this structure 23/// TODO: RE this structure
@@ -66,7 +34,7 @@ static_assert(sizeof(ProfileData) == 0x80, "ProfileData structure has incorrect
66/// This holds general information about a users profile. This is where we store all the information 34/// This holds general information about a users profile. This is where we store all the information
67/// based on a specific user 35/// based on a specific user
68struct ProfileInfo { 36struct ProfileInfo {
69 UUID user_uuid; 37 Common::UUID user_uuid;
70 ProfileUsername username; 38 ProfileUsername username;
71 u64 creation_time; 39 u64 creation_time;
72 ProfileData data; // TODO(ognik): Work out what this is 40 ProfileData data; // TODO(ognik): Work out what this is
@@ -74,7 +42,7 @@ struct ProfileInfo {
74}; 42};
75 43
76struct ProfileBase { 44struct ProfileBase {
77 UUID user_uuid; 45 Common::UUID user_uuid;
78 u64_le timestamp; 46 u64_le timestamp;
79 ProfileUsername username; 47 ProfileUsername username;
80 48
@@ -96,33 +64,33 @@ public:
96 ~ProfileManager(); 64 ~ProfileManager();
97 65
98 ResultCode AddUser(const ProfileInfo& user); 66 ResultCode AddUser(const ProfileInfo& user);
99 ResultCode CreateNewUser(UUID uuid, const ProfileUsername& username); 67 ResultCode CreateNewUser(Common::UUID uuid, const ProfileUsername& username);
100 ResultCode CreateNewUser(UUID uuid, const std::string& username); 68 ResultCode CreateNewUser(Common::UUID uuid, const std::string& username);
101 std::optional<UUID> GetUser(std::size_t index) const; 69 std::optional<Common::UUID> GetUser(std::size_t index) const;
102 std::optional<std::size_t> GetUserIndex(const UUID& uuid) const; 70 std::optional<std::size_t> GetUserIndex(const Common::UUID& uuid) const;
103 std::optional<std::size_t> GetUserIndex(const ProfileInfo& user) const; 71 std::optional<std::size_t> GetUserIndex(const ProfileInfo& user) const;
104 bool GetProfileBase(std::optional<std::size_t> index, ProfileBase& profile) const; 72 bool GetProfileBase(std::optional<std::size_t> index, ProfileBase& profile) const;
105 bool GetProfileBase(UUID uuid, ProfileBase& profile) const; 73 bool GetProfileBase(Common::UUID uuid, ProfileBase& profile) const;
106 bool GetProfileBase(const ProfileInfo& user, ProfileBase& profile) const; 74 bool GetProfileBase(const ProfileInfo& user, ProfileBase& profile) const;
107 bool GetProfileBaseAndData(std::optional<std::size_t> index, ProfileBase& profile, 75 bool GetProfileBaseAndData(std::optional<std::size_t> index, ProfileBase& profile,
108 ProfileData& data) const; 76 ProfileData& data) const;
109 bool GetProfileBaseAndData(UUID uuid, ProfileBase& profile, ProfileData& data) const; 77 bool GetProfileBaseAndData(Common::UUID uuid, ProfileBase& profile, ProfileData& data) const;
110 bool GetProfileBaseAndData(const ProfileInfo& user, ProfileBase& profile, 78 bool GetProfileBaseAndData(const ProfileInfo& user, ProfileBase& profile,
111 ProfileData& data) const; 79 ProfileData& data) const;
112 std::size_t GetUserCount() const; 80 std::size_t GetUserCount() const;
113 std::size_t GetOpenUserCount() const; 81 std::size_t GetOpenUserCount() const;
114 bool UserExists(UUID uuid) const; 82 bool UserExists(Common::UUID uuid) const;
115 bool UserExistsIndex(std::size_t index) const; 83 bool UserExistsIndex(std::size_t index) const;
116 void OpenUser(UUID uuid); 84 void OpenUser(Common::UUID uuid);
117 void CloseUser(UUID uuid); 85 void CloseUser(Common::UUID uuid);
118 UserIDArray GetOpenUsers() const; 86 UserIDArray GetOpenUsers() const;
119 UserIDArray GetAllUsers() const; 87 UserIDArray GetAllUsers() const;
120 UUID GetLastOpenedUser() const; 88 Common::UUID GetLastOpenedUser() const;
121 89
122 bool CanSystemRegisterUser() const; 90 bool CanSystemRegisterUser() const;
123 91
124 bool RemoveUser(UUID uuid); 92 bool RemoveUser(Common::UUID uuid);
125 bool SetProfileBase(UUID uuid, const ProfileBase& profile_new); 93 bool SetProfileBase(Common::UUID uuid, const ProfileBase& profile_new);
126 94
127private: 95private:
128 void ParseUserSaveFile(); 96 void ParseUserSaveFile();
@@ -132,7 +100,7 @@ private:
132 100
133 std::array<ProfileInfo, MAX_USERS> profiles{}; 101 std::array<ProfileInfo, MAX_USERS> profiles{};
134 std::size_t user_count = 0; 102 std::size_t user_count = 0;
135 UUID last_opened_user{INVALID_UUID}; 103 Common::UUID last_opened_user{Common::INVALID_UUID};
136}; 104};
137 105
138}; // namespace Service::Account 106}; // namespace Service::Account