Browse Source
common: Extract UUID to its own class
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.nce_cpp
6 changed files with 108 additions and 78 deletions
-
2src/common/CMakeLists.txt
-
33src/common/uuid.cpp
-
45src/common/uuid.h
-
18src/core/hle/service/acc/acc.cpp
-
22src/core/hle/service/acc/profile_manager.cpp
-
66src/core/hle/service/acc/profile_manager.h
@ -0,0 +1,33 @@ |
|||
// Copyright 2018 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <random>
|
|||
|
|||
#include <fmt/format.h>
|
|||
|
|||
#include "common/uuid.h"
|
|||
|
|||
namespace Common { |
|||
|
|||
UUID UUID::Generate() { |
|||
std::random_device device; |
|||
std::mt19937 gen(device()); |
|||
std::uniform_int_distribution<u64> distribution(1, std::numeric_limits<u64>::max()); |
|||
return UUID{distribution(gen), distribution(gen)}; |
|||
} |
|||
|
|||
std::string UUID::Format() const { |
|||
return fmt::format("0x{:016X}{:016X}", uuid[1], uuid[0]); |
|||
} |
|||
|
|||
std::string UUID::FormatSwitch() const { |
|||
std::array<u8, 16> s{}; |
|||
std::memcpy(s.data(), uuid.data(), sizeof(u128)); |
|||
return fmt::format("{:02x}{:02x}{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{:02x}-{:02x}{" |
|||
":02x}{:02x}{:02x}{:02x}{:02x}", |
|||
s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[8], s[9], s[10], s[11], |
|||
s[12], s[13], s[14], s[15]); |
|||
} |
|||
|
|||
} // namespace Common
|
|||
@ -0,0 +1,45 @@ |
|||
// Copyright 2018 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "common/common_types.h" |
|||
|
|||
namespace Common { |
|||
|
|||
constexpr u128 INVALID_UUID{{0, 0}}; |
|||
|
|||
struct UUID { |
|||
// UUIDs which are 0 are considered invalid! |
|||
u128 uuid = INVALID_UUID; |
|||
constexpr UUID() = default; |
|||
constexpr explicit UUID(const u128& id) : uuid{id} {} |
|||
constexpr explicit UUID(const u64 lo, const u64 hi) : uuid{{lo, hi}} {} |
|||
|
|||
explicit operator bool() const { |
|||
return uuid != INVALID_UUID; |
|||
} |
|||
|
|||
bool operator==(const UUID& rhs) const { |
|||
return uuid == rhs.uuid; |
|||
} |
|||
|
|||
bool operator!=(const UUID& rhs) const { |
|||
return !operator==(rhs); |
|||
} |
|||
|
|||
// TODO(ogniK): Properly generate uuids based on RFC-4122 |
|||
static UUID Generate(); |
|||
|
|||
// Set the UUID to {0,0} to be considered an invalid user |
|||
void Invalidate() { |
|||
uuid = INVALID_UUID; |
|||
} |
|||
|
|||
std::string Format() const; |
|||
std::string FormatSwitch() const; |
|||
}; |
|||
static_assert(sizeof(UUID) == 16, "UUID is an invalid size!"); |
|||
|
|||
} // namespace Common |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue