| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- // Copyright 2018 yuzu emulator team
- // Licensed under GPLv2 or any later version
- // Refer to the license.txt file included.
- #pragma once
- #include <array>
- #include <optional>
- #include "common/common_types.h"
- #include "common/swap.h"
- #include "common/uuid.h"
- #include "core/hle/result.h"
- namespace Service::Account {
- constexpr std::size_t MAX_USERS{8};
- constexpr std::size_t profile_username_size{32};
- using ProfileUsername = std::array<u8, profile_username_size>;
- using UserIDArray = std::array<Common::UUID, MAX_USERS>;
- /// Contains extra data related to a user.
- /// TODO: RE this structure
- struct ProfileData {
- INSERT_PADDING_WORDS_NOINIT(1);
- u32 icon_id;
- u8 bg_color_id;
- INSERT_PADDING_BYTES_NOINIT(0x7);
- INSERT_PADDING_BYTES_NOINIT(0x10);
- INSERT_PADDING_BYTES_NOINIT(0x60);
- };
- static_assert(sizeof(ProfileData) == 0x80, "ProfileData structure has incorrect size");
- /// This holds general information about a users profile. This is where we store all the information
- /// based on a specific user
- struct ProfileInfo {
- Common::UUID user_uuid{Common::INVALID_UUID};
- ProfileUsername username{};
- u64 creation_time{};
- ProfileData data{}; // TODO(ognik): Work out what this is
- bool is_open{};
- };
- struct ProfileBase {
- Common::UUID user_uuid;
- u64_le timestamp;
- ProfileUsername username;
- // Zero out all the fields to make the profile slot considered "Empty"
- void Invalidate() {
- user_uuid.Invalidate();
- timestamp = 0;
- username.fill(0);
- }
- };
- static_assert(sizeof(ProfileBase) == 0x38, "ProfileBase is an invalid size");
- /// The profile manager is used for handling multiple user profiles at once. It keeps track of open
- /// users, all the accounts registered on the "system" as well as fetching individual "ProfileInfo"
- /// objects
- class ProfileManager {
- public:
- ProfileManager();
- ~ProfileManager();
- ResultCode AddUser(const ProfileInfo& user);
- ResultCode CreateNewUser(Common::UUID uuid, const ProfileUsername& username);
- ResultCode CreateNewUser(Common::UUID uuid, const std::string& username);
- std::optional<Common::UUID> GetUser(std::size_t index) const;
- std::optional<std::size_t> GetUserIndex(const Common::UUID& uuid) const;
- std::optional<std::size_t> GetUserIndex(const ProfileInfo& user) const;
- bool GetProfileBase(std::optional<std::size_t> index, ProfileBase& profile) const;
- bool GetProfileBase(Common::UUID uuid, ProfileBase& profile) const;
- bool GetProfileBase(const ProfileInfo& user, ProfileBase& profile) const;
- bool GetProfileBaseAndData(std::optional<std::size_t> index, ProfileBase& profile,
- ProfileData& data) const;
- bool GetProfileBaseAndData(Common::UUID uuid, ProfileBase& profile, ProfileData& data) const;
- bool GetProfileBaseAndData(const ProfileInfo& user, ProfileBase& profile,
- ProfileData& data) const;
- std::size_t GetUserCount() const;
- std::size_t GetOpenUserCount() const;
- bool UserExists(Common::UUID uuid) const;
- bool UserExistsIndex(std::size_t index) const;
- void OpenUser(Common::UUID uuid);
- void CloseUser(Common::UUID uuid);
- UserIDArray GetOpenUsers() const;
- UserIDArray GetAllUsers() const;
- Common::UUID GetLastOpenedUser() const;
- bool CanSystemRegisterUser() const;
- bool RemoveUser(Common::UUID uuid);
- bool SetProfileBase(Common::UUID uuid, const ProfileBase& profile_new);
- bool SetProfileBaseAndData(Common::UUID uuid, const ProfileBase& profile_new,
- const ProfileData& data_new);
- private:
- void ParseUserSaveFile();
- void WriteUserSaveFile();
- std::optional<std::size_t> AddToProfiles(const ProfileInfo& profile);
- bool RemoveProfileAtIndex(std::size_t index);
- std::array<ProfileInfo, MAX_USERS> profiles{};
- std::size_t user_count{};
- Common::UUID last_opened_user{Common::INVALID_UUID};
- };
- }; // namespace Service::Account
|