summaryrefslogtreecommitdiff
path: root/src/KingSystem/System
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-09-25 00:26:36 +0200
committerLéo Lam <leo@leolam.fr>2020-09-25 01:14:17 +0200
commit89137d98348f704569eccea55ca678fc27489917 (patch)
tree4e0b80b23f1c548af292861d1b1071784854f735 /src/KingSystem/System
parent72d100323ca3c03d3dc71d0446de947e6280ebfc (diff)
ksys: Add Account
Diffstat (limited to 'src/KingSystem/System')
-rw-r--r--src/KingSystem/System/Account.cpp43
-rw-r--r--src/KingSystem/System/Account.h37
-rw-r--r--src/KingSystem/System/CMakeLists.txt2
3 files changed, 82 insertions, 0 deletions
diff --git a/src/KingSystem/System/Account.cpp b/src/KingSystem/System/Account.cpp
new file mode 100644
index 00000000..540914b8
--- /dev/null
+++ b/src/KingSystem/System/Account.cpp
@@ -0,0 +1,43 @@
+#include "KingSystem/System/Account.h"
+#include <nn/account.h>
+
+namespace ksys {
+
+SEAD_SINGLETON_DISPOSER_IMPL(Account)
+
+Account::~Account() {
+ if (mFlags.isOn(Flag::HasUserHandle)) {
+ if (mUserHandle) {
+ delete mUserHandle;
+ mUserHandle = nullptr;
+ }
+ mFlags.reset(Flag::HasUserHandle);
+ }
+}
+
+void Account::init(sead::Heap* heap) {
+ mUserHandle = new (heap) nn::account::UserHandle{};
+
+ nn::account::Initialize();
+
+ if (mFlags.isOff(Flag::HasOpenedUserSuccessfully)) {
+ const auto result = nn::account::OpenPreselectedUser(mUserHandle);
+ if (result.IsSuccess())
+ mFlags.set(Flag::HasOpenedUserSuccessfully);
+ }
+
+ mFlags.set(Flag::HasUserHandle);
+}
+
+nn::account::UserHandle* Account::getUserHandle() const {
+ return mUserHandle;
+}
+
+void Account::getUserId(nn::account::Uid* uid) const {
+ if (mUserHandle)
+ nn::account::GetUserId(uid, *mUserHandle);
+ else
+ *uid = {};
+}
+
+} // namespace ksys
diff --git a/src/KingSystem/System/Account.h b/src/KingSystem/System/Account.h
new file mode 100644
index 00000000..cf6ee121
--- /dev/null
+++ b/src/KingSystem/System/Account.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include <heap/seadDisposer.h>
+#include <prim/seadTypedBitFlag.h>
+#include "KingSystem/Utils/Types.h"
+
+namespace nn::account {
+class Uid;
+class UserHandle;
+} // namespace nn::account
+
+namespace ksys {
+
+class Account {
+ SEAD_SINGLETON_DISPOSER(Account)
+ Account() = default;
+ virtual ~Account();
+
+public:
+ void init(sead::Heap* heap);
+
+ nn::account::UserHandle* getUserHandle() const;
+ void getUserId(nn::account::Uid* uid) const;
+
+private:
+ enum class Flag : u8 {
+ HasUserHandle = 0x1,
+ HasOpenedUserSuccessfully = 0x2,
+ };
+
+ void* _28 = nullptr;
+ sead::TypedBitFlag<Flag> mFlags;
+ nn::account::UserHandle* mUserHandle = nullptr;
+};
+KSYS_CHECK_SIZE_NX150(Account, 0x40);
+
+} // namespace ksys
diff --git a/src/KingSystem/System/CMakeLists.txt b/src/KingSystem/System/CMakeLists.txt
index f2a045ba..51b8a1af 100644
--- a/src/KingSystem/System/CMakeLists.txt
+++ b/src/KingSystem/System/CMakeLists.txt
@@ -1,4 +1,6 @@
target_sources(uking PRIVATE
+ Account.cpp
+ Account.h
OverlayArena.cpp
OverlayArena.h
OverlayArenaSystem.cpp