summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/am/applets/applet_profile_select.h
blob: 673eed516e2058d1c881773415fc9a98207d8033 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include <vector>

#include "common/common_funcs.h"
#include "common/uuid.h"
#include "core/hle/result.h"
#include "core/hle/service/am/applets/applets.h"

namespace Core {
class System;
}

namespace Service::AM::Applets {

enum class ProfileSelectAppletVersion : u32 {
    Version1 = 0x1,     // 1.0.0+
    Version2 = 0x10000, // 2.0.0+
    Version3 = 0x20000, // 6.0.0+
};

// This is nn::account::UiMode
enum class UiMode {
    UserSelector,
    UserCreator,
    EnsureNetworkServiceAccountAvailable,
    UserIconEditor,
    UserNicknameEditor,
    UserCreatorForStarter,
    NintendoAccountAuthorizationRequestContext,
    IntroduceExternalNetworkServiceAccount,
    IntroduceExternalNetworkServiceAccountForRegistration,
    NintendoAccountNnidLinker,
    LicenseRequirementsForNetworkService,
    LicenseRequirementsForNetworkServiceWithUserContextImpl,
    UserCreatorForImmediateNaLoginTest,
    UserQualificationPromoter,
};

// This is nn::account::UserSelectionPurpose
enum class UserSelectionPurpose {
    General,
    GameCardRegistration,
    EShopLaunch,
    EShopItemShow,
    PicturePost,
    NintendoAccountLinkage,
    SettingsUpdate,
    SaveDataDeletion,
    UserMigration,
    SaveDataTransfer,
};

// This is nn::account::NintendoAccountStartupDialogType
enum class NintendoAccountStartupDialogType {
    LoginAndCreate,
    Login,
    Create,
};

// This is nn::account::UserSelectionSettingsForSystemService
struct UserSelectionSettingsForSystemService {
    UserSelectionPurpose purpose;
    bool enable_user_creation;
    INSERT_PADDING_BYTES(0x3);
};
static_assert(sizeof(UserSelectionSettingsForSystemService) == 0x8,
              "UserSelectionSettingsForSystemService has incorrect size.");

struct UiSettingsDisplayOptions {
    bool is_network_service_account_required;
    bool is_skip_enabled;
    bool is_system_or_launcher;
    bool is_registration_permitted;
    bool show_skip_button;
    bool additional_select;
    bool show_user_selector;
    bool is_unqualified_user_selectable;
};
static_assert(sizeof(UiSettingsDisplayOptions) == 0x8,
              "UiSettingsDisplayOptions has incorrect size.");

struct UiSettingsV1 {
    UiMode mode;
    INSERT_PADDING_BYTES(0x4);
    std::array<Common::UUID, 8> invalid_uid_list;
    u64 application_id;
    UiSettingsDisplayOptions display_options;
};
static_assert(sizeof(UiSettingsV1) == 0x98, "UiSettings has incorrect size.");

// This is nn::account::UiSettings
struct UiSettings {
    UiMode mode;
    INSERT_PADDING_BYTES(0x4);
    std::array<Common::UUID, 8> invalid_uid_list;
    u64 application_id;
    UiSettingsDisplayOptions display_options;
    UserSelectionPurpose purpose;
    INSERT_PADDING_BYTES(0x4);
};
static_assert(sizeof(UiSettings) == 0xA0, "UiSettings has incorrect size.");

// This is nn::account::UiReturnArg
struct UiReturnArg {
    u64 result;
    Common::UUID uuid_selected;
};
static_assert(sizeof(UiReturnArg) == 0x18, "UiReturnArg has incorrect size.");

class ProfileSelect final : public Applet {
public:
    explicit ProfileSelect(Core::System& system_, LibraryAppletMode applet_mode_,
                           const Core::Frontend::ProfileSelectApplet& frontend_);
    ~ProfileSelect() override;

    void Initialize() override;

    bool TransactionComplete() const override;
    Result GetStatus() const override;
    void ExecuteInteractive() override;
    void Execute() override;
    Result RequestExit() override;

    void SelectionComplete(std::optional<Common::UUID> uuid);

private:
    const Core::Frontend::ProfileSelectApplet& frontend;

    UiSettings config;
    UiSettingsV1 config_old;
    ProfileSelectAppletVersion profile_select_version;

    bool complete = false;
    Result status = ResultSuccess;
    std::vector<u8> final_data;
    Core::System& system;
};

} // namespace Service::AM::Applets