From 3769a80faca76c7ed77540607fef03ef26b28501 Mon Sep 17 00:00:00 2001 From: mailwl Date: Tue, 10 Apr 2018 10:18:52 +0300 Subject: Service/ACC: convert to module, add acc:aa, acc:su, acc:u1 services --- src/core/CMakeLists.txt | 6 ++ src/core/hle/service/acc/acc.cpp | 130 +++++++++++++++++++++++++++++++++++- src/core/hle/service/acc/acc.h | 19 ++++++ src/core/hle/service/acc/acc_aa.cpp | 22 ++++++ src/core/hle/service/acc/acc_aa.h | 18 +++++ src/core/hle/service/acc/acc_su.cpp | 55 +++++++++++++++ src/core/hle/service/acc/acc_su.h | 18 +++++ src/core/hle/service/acc/acc_u0.cpp | 113 ++++--------------------------- src/core/hle/service/acc/acc_u0.h | 28 +------- src/core/hle/service/acc/acc_u1.cpp | 42 ++++++++++++ src/core/hle/service/acc/acc_u1.h | 18 +++++ 11 files changed, 342 insertions(+), 127 deletions(-) create mode 100644 src/core/hle/service/acc/acc_aa.cpp create mode 100644 src/core/hle/service/acc/acc_aa.h create mode 100644 src/core/hle/service/acc/acc_su.cpp create mode 100644 src/core/hle/service/acc/acc_su.h create mode 100644 src/core/hle/service/acc/acc_u1.cpp create mode 100644 src/core/hle/service/acc/acc_u1.h (limited to 'src/core') diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 97d795d5f..9877b83fe 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -88,8 +88,14 @@ add_library(core STATIC hle/romfs.h hle/service/acc/acc.cpp hle/service/acc/acc.h + hle/service/acc/acc_aa.cpp + hle/service/acc/acc_aa.h + hle/service/acc/acc_su.cpp + hle/service/acc/acc_su.h hle/service/acc/acc_u0.cpp hle/service/acc/acc_u0.h + hle/service/acc/acc_u1.cpp + hle/service/acc/acc_u1.h hle/service/am/am.cpp hle/service/am/am.h hle/service/am/applet_ae.cpp diff --git a/src/core/hle/service/acc/acc.cpp b/src/core/hle/service/acc/acc.cpp index 5716577d6..cfb6e05a5 100644 --- a/src/core/hle/service/acc/acc.cpp +++ b/src/core/hle/service/acc/acc.cpp @@ -2,14 +2,142 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include "common/logging/log.h" +#include "core/hle/ipc_helpers.h" #include "core/hle/service/acc/acc.h" +#include "core/hle/service/acc/acc_aa.h" +#include "core/hle/service/acc/acc_su.h" #include "core/hle/service/acc/acc_u0.h" +#include "core/hle/service/acc/acc_u1.h" namespace Service { namespace Account { +// TODO: RE this structure +struct UserData { + INSERT_PADDING_WORDS(1); + u32 icon_id; + u8 bg_color_id; + INSERT_PADDING_BYTES(0x7); + INSERT_PADDING_BYTES(0x10); + INSERT_PADDING_BYTES(0x60); +}; +static_assert(sizeof(UserData) == 0x80, "UserData structure has incorrect size"); + +struct ProfileBase { + u8 user_id[0x10]; + u64 timestamp; + u8 username[0x20]; +}; +static_assert(sizeof(ProfileBase) == 0x38, "ProfileBase structure has incorrect size"); + +using Uid = std::array; +static constexpr Uid DEFAULT_USER_ID{0x10ull, 0x20ull}; + +class IProfile final : public ServiceFramework { +public: + IProfile() : ServiceFramework("IProfile") { + static const FunctionInfo functions[] = { + {1, &IProfile::GetBase, "GetBase"}, + }; + RegisterHandlers(functions); + } + +private: + void GetBase(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + ProfileBase profile_base{}; + IPC::ResponseBuilder rb{ctx, 16}; + rb.Push(RESULT_SUCCESS); + rb.PushRaw(profile_base); + } +}; + +class IManagerForApplication final : public ServiceFramework { +public: + IManagerForApplication() : ServiceFramework("IManagerForApplication") { + static const FunctionInfo functions[] = { + {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"}, + {1, &IManagerForApplication::GetAccountId, "GetAccountId"}, + }; + RegisterHandlers(functions); + } + +private: + void CheckAvailability(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(RESULT_SUCCESS); + rb.Push(true); // TODO: Check when this is supposed to return true and when not + } + + void GetAccountId(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 4}; + rb.Push(RESULT_SUCCESS); + rb.Push(0x12345678ABCDEF); + } +}; + +void Module::Interface::GetUserExistence(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(RESULT_SUCCESS); + rb.Push(true); // TODO: Check when this is supposed to return true and when not +} + +void Module::Interface::ListAllUsers(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + constexpr std::array user_ids{DEFAULT_USER_ID}; + ctx.WriteBuffer(user_ids.data(), user_ids.size()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(RESULT_SUCCESS); +} + +void Module::Interface::ListOpenUsers(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + constexpr std::array user_ids{DEFAULT_USER_ID}; + ctx.WriteBuffer(user_ids.data(), user_ids.size()); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(RESULT_SUCCESS); +} + +void Module::Interface::GetProfile(Kernel::HLERequestContext& ctx) { + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushIpcInterface(); + LOG_DEBUG(Service_ACC, "called"); +} + +void Module::Interface::InitializeApplicationInfo(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 2}; + rb.Push(RESULT_SUCCESS); +} + +void Module::Interface::GetBaasAccountManagerForApplication(Kernel::HLERequestContext& ctx) { + IPC::ResponseBuilder rb{ctx, 2, 0, 1}; + rb.Push(RESULT_SUCCESS); + rb.PushIpcInterface(); + LOG_DEBUG(Service_ACC, "called"); +} + +void Module::Interface::GetLastOpenedUser(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_ACC, "(STUBBED) called"); + IPC::ResponseBuilder rb{ctx, 6}; + rb.Push(RESULT_SUCCESS); + rb.PushRaw(DEFAULT_USER_ID); +} + +Module::Interface::Interface(std::shared_ptr module, const char* name) + : ServiceFramework(name), module(std::move(module)) {} + void InstallInterfaces(SM::ServiceManager& service_manager) { - std::make_shared()->InstallAsService(service_manager); + auto module = std::make_shared(); + std::make_shared(module)->InstallAsService(service_manager); + std::make_shared(module)->InstallAsService(service_manager); + std::make_shared(module)->InstallAsService(service_manager); + std::make_shared(module)->InstallAsService(service_manager); } } // namespace Account diff --git a/src/core/hle/service/acc/acc.h b/src/core/hle/service/acc/acc.h index 44d024f48..2d2f57b7d 100644 --- a/src/core/hle/service/acc/acc.h +++ b/src/core/hle/service/acc/acc.h @@ -9,6 +9,25 @@ namespace Service { namespace Account { +class Module final { +public: + class Interface : public ServiceFramework { + public: + Interface(std::shared_ptr module, const char* name); + + void GetUserExistence(Kernel::HLERequestContext& ctx); + void ListAllUsers(Kernel::HLERequestContext& ctx); + void ListOpenUsers(Kernel::HLERequestContext& ctx); + void GetLastOpenedUser(Kernel::HLERequestContext& ctx); + void GetProfile(Kernel::HLERequestContext& ctx); + void InitializeApplicationInfo(Kernel::HLERequestContext& ctx); + void GetBaasAccountManagerForApplication(Kernel::HLERequestContext& ctx); + + protected: + std::shared_ptr module; + }; +}; + /// Registers all ACC services with the specified service manager. void InstallInterfaces(SM::ServiceManager& service_manager); diff --git a/src/core/hle/service/acc/acc_aa.cpp b/src/core/hle/service/acc/acc_aa.cpp new file mode 100644 index 000000000..76deaa07f --- /dev/null +++ b/src/core/hle/service/acc/acc_aa.cpp @@ -0,0 +1,22 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/service/acc/acc_aa.h" + +namespace Service { +namespace Account { + +ACC_AA::ACC_AA(std::shared_ptr module) : Module::Interface(std::move(module), "acc:aa") { + static const FunctionInfo functions[] = { + {0, nullptr, "EnsureCacheAsync"}, + {1, nullptr, "LoadCache"}, + {2, nullptr, "GetDeviceAccountId"}, + {50, nullptr, "RegisterNotificationTokenAsync"}, + {51, nullptr, "UnregisterNotificationTokenAsync"}, + }; + RegisterHandlers(functions); +} + +} // namespace Account +} // namespace Service diff --git a/src/core/hle/service/acc/acc_aa.h b/src/core/hle/service/acc/acc_aa.h new file mode 100644 index 000000000..5069c6890 --- /dev/null +++ b/src/core/hle/service/acc/acc_aa.h @@ -0,0 +1,18 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/service/acc/acc.h" + +namespace Service { +namespace Account { + +class ACC_AA final : public Module::Interface { +public: + explicit ACC_AA(std::shared_ptr module); +}; + +} // namespace Account +} // namespace Service diff --git a/src/core/hle/service/acc/acc_su.cpp b/src/core/hle/service/acc/acc_su.cpp new file mode 100644 index 000000000..538f9d9b1 --- /dev/null +++ b/src/core/hle/service/acc/acc_su.cpp @@ -0,0 +1,55 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/service/acc/acc_su.h" + +namespace Service { +namespace Account { + +ACC_SU::ACC_SU(std::shared_ptr module) : Module::Interface(std::move(module), "acc:su") { + static const FunctionInfo functions[] = { + {0, nullptr, "GetUserCount"}, + {1, &ACC_SU::GetUserExistence, "GetUserExistence"}, + {2, &ACC_SU::ListAllUsers, "ListAllUsers"}, + {3, &ACC_SU::ListOpenUsers, "ListOpenUsers"}, + {4, &ACC_SU::GetLastOpenedUser, "GetLastOpenedUser"}, + {5, &ACC_SU::GetProfile, "GetProfile"}, + {6, nullptr, "GetProfileDigest"}, + {50, nullptr, "IsUserRegistrationRequestPermitted"}, + {51, nullptr, "TrySelectUserWithoutInteraction"}, + {60, nullptr, "ListOpenContextStoredUsers"}, + {100, nullptr, "GetUserRegistrationNotifier"}, + {101, nullptr, "GetUserStateChangeNotifier"}, + {102, nullptr, "GetBaasAccountManagerForSystemService"}, + {103, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + {104, nullptr, "GetProfileUpdateNotifier"}, + {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + {110, nullptr, "StoreSaveDataThumbnail"}, + {111, nullptr, "ClearSaveDataThumbnail"}, + {112, nullptr, "LoadSaveDataThumbnail"}, + {113, nullptr, "GetSaveDataThumbnailExistence"}, + {190, nullptr, "GetUserLastOpenedApplication"}, + {191, nullptr, "ActivateOpenContextHolder"}, + {200, nullptr, "BeginUserRegistration"}, + {201, nullptr, "CompleteUserRegistration"}, + {202, nullptr, "CancelUserRegistration"}, + {203, nullptr, "DeleteUser"}, + {204, nullptr, "SetUserPosition"}, + {205, nullptr, "GetProfileEditor"}, + {206, nullptr, "CompleteUserRegistrationForcibly"}, + {210, nullptr, "CreateFloatingRegistrationRequest"}, + {230, nullptr, "AuthenticateServiceAsync"}, + {250, nullptr, "GetBaasAccountAdministrator"}, + {290, nullptr, "ProxyProcedureForGuestLoginWithNintendoAccount"}, + {291, nullptr, "ProxyProcedureForFloatingRegistrationWithNintendoAccount"}, + {299, nullptr, "SuspendBackgroundDaemon"}, + {997, nullptr, "DebugInvalidateTokenCacheForUser"}, + {998, nullptr, "DebugSetUserStateClose"}, + {999, nullptr, "DebugSetUserStateOpen"}, + }; + RegisterHandlers(functions); +} + +} // namespace Account +} // namespace Service diff --git a/src/core/hle/service/acc/acc_su.h b/src/core/hle/service/acc/acc_su.h new file mode 100644 index 000000000..3894a6991 --- /dev/null +++ b/src/core/hle/service/acc/acc_su.h @@ -0,0 +1,18 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/service/acc/acc.h" + +namespace Service { +namespace Account { + +class ACC_SU final : public Module::Interface { +public: + explicit ACC_SU(std::shared_ptr module); +}; + +} // namespace Account +} // namespace Service diff --git a/src/core/hle/service/acc/acc_u0.cpp b/src/core/hle/service/acc/acc_u0.cpp index 52c3491d5..7b9c667ef 100644 --- a/src/core/hle/service/acc/acc_u0.cpp +++ b/src/core/hle/service/acc/acc_u0.cpp @@ -2,120 +2,31 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. -#include "common/logging/log.h" -#include "core/hle/ipc_helpers.h" #include "core/hle/service/acc/acc_u0.h" namespace Service { namespace Account { -using Uid = std::array; -static constexpr Uid DEFAULT_USER_ID{0x10ull, 0x20ull}; - -class IProfile final : public ServiceFramework { -public: - IProfile() : ServiceFramework("IProfile") { - static const FunctionInfo functions[] = { - {1, &IProfile::GetBase, "GetBase"}, - }; - RegisterHandlers(functions); - } - -private: - void GetBase(Kernel::HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - ProfileBase profile_base{}; - IPC::ResponseBuilder rb{ctx, 16}; - rb.Push(RESULT_SUCCESS); - rb.PushRaw(profile_base); - } -}; - -class IManagerForApplication final : public ServiceFramework { -public: - IManagerForApplication() : ServiceFramework("IManagerForApplication") { - static const FunctionInfo functions[] = { - {0, &IManagerForApplication::CheckAvailability, "CheckAvailability"}, - {1, &IManagerForApplication::GetAccountId, "GetAccountId"}, - }; - RegisterHandlers(functions); - } - -private: - void CheckAvailability(Kernel::HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(RESULT_SUCCESS); - rb.Push(true); // TODO: Check when this is supposed to return true and when not - } - - void GetAccountId(Kernel::HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - IPC::ResponseBuilder rb{ctx, 4}; - rb.Push(RESULT_SUCCESS); - rb.Push(0x12345678ABCDEF); - } -}; - -void ACC_U0::GetUserExistence(Kernel::HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(RESULT_SUCCESS); - rb.Push(true); // TODO: Check when this is supposed to return true and when not -} - -void ACC_U0::ListAllUsers(Kernel::HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - constexpr std::array user_ids{DEFAULT_USER_ID}; - ctx.WriteBuffer(user_ids.data(), user_ids.size()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(RESULT_SUCCESS); -} - -void ACC_U0::ListOpenUsers(Kernel::HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - constexpr std::array user_ids{DEFAULT_USER_ID}; - ctx.WriteBuffer(user_ids.data(), user_ids.size()); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(RESULT_SUCCESS); -} - -void ACC_U0::GetProfile(Kernel::HLERequestContext& ctx) { - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(RESULT_SUCCESS); - rb.PushIpcInterface(); - LOG_DEBUG(Service_ACC, "called"); -} - -void ACC_U0::InitializeApplicationInfo(Kernel::HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(RESULT_SUCCESS); -} - -void ACC_U0::GetBaasAccountManagerForApplication(Kernel::HLERequestContext& ctx) { - IPC::ResponseBuilder rb{ctx, 2, 0, 1}; - rb.Push(RESULT_SUCCESS); - rb.PushIpcInterface(); - LOG_DEBUG(Service_ACC, "called"); -} - -void ACC_U0::GetLastOpenedUser(Kernel::HLERequestContext& ctx) { - LOG_WARNING(Service_ACC, "(STUBBED) called"); - IPC::ResponseBuilder rb{ctx, 6}; - rb.Push(RESULT_SUCCESS); - rb.PushRaw(DEFAULT_USER_ID); -} - -ACC_U0::ACC_U0() : ServiceFramework("acc:u0") { +ACC_U0::ACC_U0(std::shared_ptr module) : Module::Interface(std::move(module), "acc:u0") { static const FunctionInfo functions[] = { + {0, nullptr, "GetUserCount"}, {1, &ACC_U0::GetUserExistence, "GetUserExistence"}, {2, &ACC_U0::ListAllUsers, "ListAllUsers"}, {3, &ACC_U0::ListOpenUsers, "ListOpenUsers"}, {4, &ACC_U0::GetLastOpenedUser, "GetLastOpenedUser"}, {5, &ACC_U0::GetProfile, "GetProfile"}, + {6, nullptr, "GetProfileDigest"}, + {50, nullptr, "IsUserRegistrationRequestPermitted"}, + {51, nullptr, "TrySelectUserWithoutInteraction"}, + {60, nullptr, "ListOpenContextStoredUsers"}, {100, &ACC_U0::InitializeApplicationInfo, "InitializeApplicationInfo"}, {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, + {102, nullptr, "AuthenticateApplicationAsync"}, + {103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + {110, nullptr, "StoreSaveDataThumbnail"}, + {111, nullptr, "ClearSaveDataThumbnail"}, + {120, nullptr, "CreateGuestLoginRequest"}, + {130, nullptr, "LoadOpenContext"}, }; RegisterHandlers(functions); } diff --git a/src/core/hle/service/acc/acc_u0.h b/src/core/hle/service/acc/acc_u0.h index 222f37282..d4f36e172 100644 --- a/src/core/hle/service/acc/acc_u0.h +++ b/src/core/hle/service/acc/acc_u0.h @@ -4,36 +4,14 @@ #pragma once -#include "core/hle/service/service.h" +#include "core/hle/service/acc/acc.h" namespace Service { namespace Account { -// TODO: RE this structure -struct UserData { - INSERT_PADDING_BYTES(0x80); -}; -static_assert(sizeof(UserData) == 0x80, "UserData structure has incorrect size"); - -// TODO: RE this structure -struct ProfileBase { - INSERT_PADDING_BYTES(0x38); -}; -static_assert(sizeof(ProfileBase) == 0x38, "ProfileBase structure has incorrect size"); - -class ACC_U0 final : public ServiceFramework { +class ACC_U0 final : public Module::Interface { public: - ACC_U0(); - ~ACC_U0() = default; - -private: - void GetUserExistence(Kernel::HLERequestContext& ctx); - void ListAllUsers(Kernel::HLERequestContext& ctx); - void ListOpenUsers(Kernel::HLERequestContext& ctx); - void GetLastOpenedUser(Kernel::HLERequestContext& ctx); - void GetProfile(Kernel::HLERequestContext& ctx); - void InitializeApplicationInfo(Kernel::HLERequestContext& ctx); - void GetBaasAccountManagerForApplication(Kernel::HLERequestContext& ctx); + explicit ACC_U0(std::shared_ptr module); }; } // namespace Account diff --git a/src/core/hle/service/acc/acc_u1.cpp b/src/core/hle/service/acc/acc_u1.cpp new file mode 100644 index 000000000..dea353554 --- /dev/null +++ b/src/core/hle/service/acc/acc_u1.cpp @@ -0,0 +1,42 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/hle/service/acc/acc_u1.h" + +namespace Service { +namespace Account { + +ACC_U1::ACC_U1(std::shared_ptr module) : Module::Interface(std::move(module), "acc:u1") { + static const FunctionInfo functions[] = { + {0, nullptr, "GetUserCount"}, + {1, &ACC_U1::GetUserExistence, "GetUserExistence"}, + {2, &ACC_U1::ListAllUsers, "ListAllUsers"}, + {3, &ACC_U1::ListOpenUsers, "ListOpenUsers"}, + {4, &ACC_U1::GetLastOpenedUser, "GetLastOpenedUser"}, + {5, &ACC_U1::GetProfile, "GetProfile"}, + {6, nullptr, "GetProfileDigest"}, + {50, nullptr, "IsUserRegistrationRequestPermitted"}, + {51, nullptr, "TrySelectUserWithoutInteraction"}, + {60, nullptr, "ListOpenContextStoredUsers"}, + {100, nullptr, "GetUserRegistrationNotifier"}, + {101, nullptr, "GetUserStateChangeNotifier"}, + {102, nullptr, "GetBaasAccountManagerForSystemService"}, + {103, nullptr, "GetProfileUpdateNotifier"}, + {104, nullptr, "CheckNetworkServiceAvailabilityAsync"}, + {105, nullptr, "GetBaasUserAvailabilityChangeNotifier"}, + {110, nullptr, "StoreSaveDataThumbnail"}, + {111, nullptr, "ClearSaveDataThumbnail"}, + {112, nullptr, "LoadSaveDataThumbnail"}, + {113, nullptr, "GetSaveDataThumbnailExistence"}, + {190, nullptr, "GetUserLastOpenedApplication"}, + {191, nullptr, "ActivateOpenContextHolder"}, + {997, nullptr, "DebugInvalidateTokenCacheForUser"}, + {998, nullptr, "DebugSetUserStateClose"}, + {999, nullptr, "DebugSetUserStateOpen"}, + }; + RegisterHandlers(functions); +} + +} // namespace Account +} // namespace Service diff --git a/src/core/hle/service/acc/acc_u1.h b/src/core/hle/service/acc/acc_u1.h new file mode 100644 index 000000000..432d5b3e9 --- /dev/null +++ b/src/core/hle/service/acc/acc_u1.h @@ -0,0 +1,18 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/service/acc/acc.h" + +namespace Service { +namespace Account { + +class ACC_U1 final : public Module::Interface { +public: + explicit ACC_U1(std::shared_ptr module); +}; + +} // namespace Account +} // namespace Service -- cgit v1.2.3