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.pull/15/merge
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