service: Add even more stubs for Qlaunch
This commit is contained in:
@ -11,7 +11,7 @@ namespace HLE::ApiVersion {
|
|||||||
|
|
||||||
// Horizon OS version constants.
|
// Horizon OS version constants.
|
||||||
|
|
||||||
constexpr u8 HOS_VERSION_MAJOR = 12;
|
constexpr u8 HOS_VERSION_MAJOR = 16;
|
||||||
constexpr u8 HOS_VERSION_MINOR = 1;
|
constexpr u8 HOS_VERSION_MINOR = 1;
|
||||||
constexpr u8 HOS_VERSION_MICRO = 0;
|
constexpr u8 HOS_VERSION_MICRO = 0;
|
||||||
|
|
||||||
@ -22,8 +22,8 @@ constexpr u8 SDK_REVISION_MINOR = 0;
|
|||||||
|
|
||||||
constexpr char PLATFORM_STRING[] = "NX";
|
constexpr char PLATFORM_STRING[] = "NX";
|
||||||
constexpr char VERSION_HASH[] = "76b10c2dab7d3aa73fc162f8dff1655e6a21caf4";
|
constexpr char VERSION_HASH[] = "76b10c2dab7d3aa73fc162f8dff1655e6a21caf4";
|
||||||
constexpr char DISPLAY_VERSION[] = "12.1.0";
|
constexpr char DISPLAY_VERSION[] = "16.1.0";
|
||||||
constexpr char DISPLAY_TITLE[] = "NintendoSDK Firmware for NX 12.1.0-1.0";
|
constexpr char DISPLAY_TITLE[] = "NintendoSDK Firmware for NX 16.1.0-1.0";
|
||||||
|
|
||||||
// Atmosphere version constants.
|
// Atmosphere version constants.
|
||||||
|
|
||||||
|
@ -96,9 +96,10 @@ public:
|
|||||||
{133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+
|
{133, nullptr, "GetNintendoAccountVerificationUrlCache"}, // 9.0.0+
|
||||||
{134, nullptr, "RefreshNintendoAccountVerificationUrlCache"}, // 9.0.0+
|
{134, nullptr, "RefreshNintendoAccountVerificationUrlCache"}, // 9.0.0+
|
||||||
{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+
|
{135, nullptr, "RefreshNintendoAccountVerificationUrlCacheAsyncIfSecondsElapsed"}, // 9.0.0+
|
||||||
{140, nullptr, "GetNetworkServiceLicenseCache"}, // 5.0.0+
|
{140, &IManagerForSystemService::GetNetworkServiceLicenseCache, "GetNetworkServiceLicenseCache"}, // 5.0.0+
|
||||||
{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+
|
{141, nullptr, "RefreshNetworkServiceLicenseCacheAsync"}, // 5.0.0+
|
||||||
{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+
|
{142, nullptr, "RefreshNetworkServiceLicenseCacheAsyncIfSecondsElapsed"}, // 5.0.0+
|
||||||
|
{143, &IManagerForSystemService::Unknown143, "Unknown143"},
|
||||||
{150, nullptr, "CreateAuthorizationRequest"},
|
{150, nullptr, "CreateAuthorizationRequest"},
|
||||||
{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
|
{160, nullptr, "RequiresUpdateNetworkServiceAccountIdTokenCache"},
|
||||||
{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
|
{161, nullptr, "RequireReauthenticationOfNetworkServiceAccount"},
|
||||||
@ -114,6 +115,24 @@ private:
|
|||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GetNetworkServiceLicenseCache(HLERequestContext& ctx) {
|
||||||
|
LOG_ERROR(Service_ACC, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 6};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push<u64>(0);
|
||||||
|
rb.Push<u64>(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Unknown143(HLERequestContext& ctx) {
|
||||||
|
LOG_ERROR(Service_ACC, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 6};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push<u64>(0);
|
||||||
|
rb.Push<u64>(0);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 3.0.0+
|
// 3.0.0+
|
||||||
|
@ -29,6 +29,7 @@ private:
|
|||||||
void OpenSystemAppletProxy(HLERequestContext& ctx);
|
void OpenSystemAppletProxy(HLERequestContext& ctx);
|
||||||
void OpenLibraryAppletProxy(HLERequestContext& ctx);
|
void OpenLibraryAppletProxy(HLERequestContext& ctx);
|
||||||
void OpenLibraryAppletProxyOld(HLERequestContext& ctx);
|
void OpenLibraryAppletProxyOld(HLERequestContext& ctx);
|
||||||
|
void OpenOverlayAppletProxy(HLERequestContext& ctx);
|
||||||
|
|
||||||
std::shared_ptr<Applet> GetAppletFromContext(HLERequestContext& ctx);
|
std::shared_ptr<Applet> GetAppletFromContext(HLERequestContext& ctx);
|
||||||
|
|
||||||
|
@ -9,7 +9,8 @@
|
|||||||
|
|
||||||
namespace Service::Audio {
|
namespace Service::Audio {
|
||||||
|
|
||||||
AudCtl::AudCtl(Core::System& system_) : ServiceFramework{system_, "audctl"} {
|
AudCtl::AudCtl(Core::System& system_)
|
||||||
|
: ServiceFramework{system_, "audctl"}, service_context{system, "audctl"} {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, nullptr, "GetTargetVolume"},
|
{0, nullptr, "GetTargetVolume"},
|
||||||
@ -46,7 +47,7 @@ AudCtl::AudCtl(Core::System& system_) : ServiceFramework{system_, "audctl"} {
|
|||||||
{31, &AudCtl::IsSpeakerAutoMuteEnabled, "IsSpeakerAutoMuteEnabled"},
|
{31, &AudCtl::IsSpeakerAutoMuteEnabled, "IsSpeakerAutoMuteEnabled"},
|
||||||
{32, nullptr, "GetActiveOutputTarget"},
|
{32, nullptr, "GetActiveOutputTarget"},
|
||||||
{33, nullptr, "GetTargetDeviceInfo"},
|
{33, nullptr, "GetTargetDeviceInfo"},
|
||||||
{34, nullptr, "AcquireTargetNotification"},
|
{34, &AudCtl::AcquireTargetNotification, "AcquireTargetNotification"},
|
||||||
{35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
|
{35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
|
||||||
{36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
|
{36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
|
||||||
{37, nullptr, "SetHearingProtectionSafeguardEnabled"},
|
{37, nullptr, "SetHearingProtectionSafeguardEnabled"},
|
||||||
@ -71,6 +72,9 @@ AudCtl::AudCtl(Core::System& system_) : ServiceFramework{system_, "audctl"} {
|
|||||||
|
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
|
notification_event =
|
||||||
|
service_context.CreateEvent("audctl:NotificationEvent");
|
||||||
|
|
||||||
m_set_sys =
|
m_set_sys =
|
||||||
system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
|
system.ServiceManager().GetService<Service::Set::ISystemSettingsServer>("set:sys", true);
|
||||||
}
|
}
|
||||||
@ -198,4 +202,12 @@ void AudCtl::IsSpeakerAutoMuteEnabled(HLERequestContext& ctx) {
|
|||||||
rb.Push<u8>(is_speaker_auto_mute_enabled);
|
rb.Push<u8>(is_speaker_auto_mute_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudCtl::AcquireTargetNotification(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushCopyObjects(notification_event->GetReadableEvent());
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Service::Audio
|
} // namespace Service::Audio
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
#include "core/hle/service/kernel_helpers.h"
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
class System;
|
class System;
|
||||||
@ -44,6 +45,9 @@ private:
|
|||||||
void IsSpeakerAutoMuteEnabled(HLERequestContext& ctx);
|
void IsSpeakerAutoMuteEnabled(HLERequestContext& ctx);
|
||||||
void AcquireTargetNotification(HLERequestContext& ctx);
|
void AcquireTargetNotification(HLERequestContext& ctx);
|
||||||
|
|
||||||
|
KernelHelpers::ServiceContext service_context;
|
||||||
|
|
||||||
|
Kernel::KEvent* notification_event;
|
||||||
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
|
std::shared_ptr<Service::Set::ISystemSettingsServer> m_set_sys;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ IAlbumAccessorService::IAlbumAccessorService(Core::System& system_,
|
|||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, nullptr, "GetAlbumFileCount"},
|
{0, nullptr, "GetAlbumFileCount"},
|
||||||
{1, nullptr, "GetAlbumFileList"},
|
{1, &IAlbumAccessorService::GetAlbumFileList, "GetAlbumFileList"},
|
||||||
{2, nullptr, "LoadAlbumFile"},
|
{2, nullptr, "LoadAlbumFile"},
|
||||||
{3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"},
|
{3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"},
|
||||||
{4, nullptr, "StorageCopyAlbumFile"},
|
{4, nullptr, "StorageCopyAlbumFile"},
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "core/hle/service/erpt/erpt.h"
|
#include "core/hle/service/erpt/erpt.h"
|
||||||
#include "core/hle/service/server_manager.h"
|
#include "core/hle/service/server_manager.h"
|
||||||
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
|
|
||||||
@ -15,7 +16,7 @@ public:
|
|||||||
explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {
|
explicit ErrorReportContext(Core::System& system_) : ServiceFramework{system_, "erpt:c"} {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, nullptr, "SubmitContext"},
|
{0, &ErrorReportContext::SubmitContext, "SubmitContext"},
|
||||||
{1, nullptr, "CreateReportV0"},
|
{1, nullptr, "CreateReportV0"},
|
||||||
{2, nullptr, "SetInitialLaunchSettingsCompletionTime"},
|
{2, nullptr, "SetInitialLaunchSettingsCompletionTime"},
|
||||||
{3, nullptr, "ClearInitialLaunchSettingsCompletionTime"},
|
{3, nullptr, "ClearInitialLaunchSettingsCompletionTime"},
|
||||||
@ -36,6 +37,14 @@ public:
|
|||||||
|
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void SubmitContext(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_SET, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ErrorReportSession final : public ServiceFramework<ErrorReportSession> {
|
class ErrorReportSession final : public ServiceFramework<ErrorReportSession> {
|
||||||
|
@ -42,13 +42,13 @@ public:
|
|||||||
{10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"},
|
{10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"},
|
||||||
{10702, nullptr, "AddPlayHistory"},
|
{10702, nullptr, "AddPlayHistory"},
|
||||||
{11000, nullptr, "GetProfileImageUrl"},
|
{11000, nullptr, "GetProfileImageUrl"},
|
||||||
{20100, nullptr, "GetFriendCount"},
|
{20100, &IFriendService::GetFriendCount, "GetFriendCount"},
|
||||||
{20101, nullptr, "GetNewlyFriendCount"},
|
{20101, &IFriendService::GetNewlyFriendCount, "GetNewlyFriendCount"},
|
||||||
{20102, nullptr, "GetFriendDetailedInfo"},
|
{20102, nullptr, "GetFriendDetailedInfo"},
|
||||||
{20103, nullptr, "SyncFriendList"},
|
{20103, nullptr, "SyncFriendList"},
|
||||||
{20104, nullptr, "RequestSyncFriendList"},
|
{20104, nullptr, "RequestSyncFriendList"},
|
||||||
{20110, nullptr, "LoadFriendSetting"},
|
{20110, nullptr, "LoadFriendSetting"},
|
||||||
{20200, nullptr, "GetReceivedFriendRequestCount"},
|
{20200, &IFriendService::GetReceivedFriendRequestCount, "GetReceivedFriendRequestCount"},
|
||||||
{20201, nullptr, "GetFriendRequestList"},
|
{20201, nullptr, "GetFriendRequestList"},
|
||||||
{20300, nullptr, "GetFriendCandidateList"},
|
{20300, nullptr, "GetFriendCandidateList"},
|
||||||
{20301, nullptr, "GetNintendoNetworkIdInfo"},
|
{20301, nullptr, "GetNintendoNetworkIdInfo"},
|
||||||
@ -61,14 +61,14 @@ public:
|
|||||||
{20501, nullptr, "GetRelationship"},
|
{20501, nullptr, "GetRelationship"},
|
||||||
{20600, nullptr, "GetUserPresenceView"},
|
{20600, nullptr, "GetUserPresenceView"},
|
||||||
{20700, nullptr, "GetPlayHistoryList"},
|
{20700, nullptr, "GetPlayHistoryList"},
|
||||||
{20701, nullptr, "GetPlayHistoryStatistics"},
|
{20701, &IFriendService::GetPlayHistoryStatistics, "GetPlayHistoryStatistics"},
|
||||||
{20800, nullptr, "LoadUserSetting"},
|
{20800, nullptr, "LoadUserSetting"},
|
||||||
{20801, nullptr, "SyncUserSetting"},
|
{20801, nullptr, "SyncUserSetting"},
|
||||||
{20900, nullptr, "RequestListSummaryOverlayNotification"},
|
{20900, nullptr, "RequestListSummaryOverlayNotification"},
|
||||||
{21000, nullptr, "GetExternalApplicationCatalog"},
|
{21000, nullptr, "GetExternalApplicationCatalog"},
|
||||||
{22000, nullptr, "GetReceivedFriendInvitationList"},
|
{22000, nullptr, "GetReceivedFriendInvitationList"},
|
||||||
{22001, nullptr, "GetReceivedFriendInvitationDetailedInfo"},
|
{22001, nullptr, "GetReceivedFriendInvitationDetailedInfo"},
|
||||||
{22010, nullptr, "GetReceivedFriendInvitationCountCache"},
|
{22010, &IFriendService::GetReceivedFriendInvitationCountCache, "GetReceivedFriendInvitationCountCache"},
|
||||||
{30100, nullptr, "DropFriendNewlyFlags"},
|
{30100, nullptr, "DropFriendNewlyFlags"},
|
||||||
{30101, nullptr, "DeleteFriend"},
|
{30101, nullptr, "DeleteFriend"},
|
||||||
{30110, nullptr, "DropFriendNewlyFlag"},
|
{30110, nullptr, "DropFriendNewlyFlag"},
|
||||||
@ -179,6 +179,30 @@ private:
|
|||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GetFriendCount(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_Friend, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetNewlyFriendCount(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_Friend, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetReceivedFriendRequestCount(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_Friend, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(0);
|
||||||
|
}
|
||||||
|
|
||||||
void GetFriendList(HLERequestContext& ctx) {
|
void GetFriendList(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto friend_offset = rp.Pop<u32>();
|
const auto friend_offset = rp.Pop<u32>();
|
||||||
@ -217,6 +241,21 @@ private:
|
|||||||
rb.Push(true);
|
rb.Push(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GetPlayHistoryStatistics(HLERequestContext& ctx) {
|
||||||
|
LOG_ERROR(Service_Friend, "(STUBBED) called, check in out");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetReceivedFriendInvitationCountCache(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_Friend, "(STUBBED) called, check in out");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(0);
|
||||||
|
}
|
||||||
|
|
||||||
KernelHelpers::ServiceContext service_context;
|
KernelHelpers::ServiceContext service_context;
|
||||||
|
|
||||||
Kernel::KEvent* completion_event;
|
Kernel::KEvent* completion_event;
|
||||||
|
@ -37,9 +37,15 @@ Result ARPManager::GetControlProperty(std::vector<u8>* out_control_property, u64
|
|||||||
|
|
||||||
const auto iter = entries.find(title_id);
|
const auto iter = entries.find(title_id);
|
||||||
if (iter == entries.end()) {
|
if (iter == entries.end()) {
|
||||||
|
if (entries.empty()) {
|
||||||
return Glue::ResultProcessIdNotRegistered;
|
return Glue::ResultProcessIdNotRegistered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*out_control_property = entries.begin()->second.control;
|
||||||
|
return ResultSuccess;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
*out_control_property = iter->second.control;
|
*out_control_property = iter->second.control;
|
||||||
return ResultSuccess;
|
return ResultSuccess;
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ public:
|
|||||||
explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {
|
explicit LBL(Core::System& system_) : ServiceFramework{system_, "lbl"} {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, nullptr, "SaveCurrentSetting"},
|
{0, &LBL::SaveCurrentSetting, "SaveCurrentSetting"},
|
||||||
{1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"},
|
{1, &LBL::LoadCurrentSetting, "LoadCurrentSetting"},
|
||||||
{2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"},
|
{2, &LBL::SetCurrentBrightnessSetting, "SetCurrentBrightnessSetting"},
|
||||||
{3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"},
|
{3, &LBL::GetCurrentBrightnessSetting, "GetCurrentBrightnessSetting"},
|
||||||
@ -47,7 +47,7 @@ public:
|
|||||||
{26, &LBL::EnableVrMode, "EnableVrMode"},
|
{26, &LBL::EnableVrMode, "EnableVrMode"},
|
||||||
{27, &LBL::DisableVrMode, "DisableVrMode"},
|
{27, &LBL::DisableVrMode, "DisableVrMode"},
|
||||||
{28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"},
|
{28, &LBL::IsVrModeEnabled, "IsVrModeEnabled"},
|
||||||
{29, nullptr, "IsAutoBrightnessControlSupported"},
|
{29, &LBL::IsAutoBrightnessControlSupported, "IsAutoBrightnessControlSupported"},
|
||||||
};
|
};
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
@ -60,6 +60,13 @@ private:
|
|||||||
On = 1,
|
On = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void SaveCurrentSetting(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_LBL, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
void LoadCurrentSetting(HLERequestContext& ctx) {
|
void LoadCurrentSetting(HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_LBL, "(STUBBED) called");
|
LOG_WARNING(Service_LBL, "(STUBBED) called");
|
||||||
|
|
||||||
@ -317,6 +324,14 @@ private:
|
|||||||
rb.Push(vr_mode_enabled);
|
rb.Push(vr_mode_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IsAutoBrightnessControlSupported(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_LBL, "called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push<u8>(auto_brightness_supported);
|
||||||
|
}
|
||||||
|
|
||||||
bool vr_mode_enabled = false;
|
bool vr_mode_enabled = false;
|
||||||
float current_brightness = 1.0f;
|
float current_brightness = 1.0f;
|
||||||
float ambient_light_value = 0.0f;
|
float ambient_light_value = 0.0f;
|
||||||
@ -325,6 +340,7 @@ private:
|
|||||||
bool backlight_enabled = true;
|
bool backlight_enabled = true;
|
||||||
bool update_instantly = false;
|
bool update_instantly = false;
|
||||||
bool auto_brightness = false; // TODO(ogniK): Move to system settings
|
bool auto_brightness = false; // TODO(ogniK): Move to system settings
|
||||||
|
bool auto_brightness_supported = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
void LoopProcess(Core::System& system) {
|
void LoopProcess(Core::System& system) {
|
||||||
|
@ -39,7 +39,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void GetStateForMonitor(HLERequestContext& ctx) {
|
void GetStateForMonitor(HLERequestContext& ctx) {
|
||||||
LOG_INFO(Service_LDN, "called");
|
LOG_DEBUG(Service_LDN, "called");
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
@ -784,7 +784,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GetGroupInfo(HLERequestContext& ctx) {
|
void GetGroupInfo(HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_LDN, "(STUBBED) called");
|
LOG_DEBUG(Service_LDN, "(STUBBED) called");
|
||||||
|
|
||||||
struct GroupInfo {
|
struct GroupInfo {
|
||||||
std::array<u8, 0x200> info;
|
std::array<u8, 0x200> info;
|
||||||
|
@ -507,7 +507,7 @@ void IGeneralService::GetCurrentIpConfigInfo(HLERequestContext& ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void IGeneralService::IsWirelessCommunicationEnabled(HLERequestContext& ctx) {
|
void IGeneralService::IsWirelessCommunicationEnabled(HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_NIFM, "(STUBBED) called");
|
LOG_DEBUG(Service_NIFM, "(STUBBED) called");
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
@ -515,7 +515,7 @@ void IGeneralService::IsWirelessCommunicationEnabled(HLERequestContext& ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void IGeneralService::GetInternetConnectionStatus(HLERequestContext& ctx) {
|
void IGeneralService::GetInternetConnectionStatus(HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_NIFM, "(STUBBED) called");
|
LOG_DEBUG(Service_NIFM, "(STUBBED) called");
|
||||||
|
|
||||||
struct Output {
|
struct Output {
|
||||||
u8 type{static_cast<u8>(NetworkInterfaceType::WiFi_Ieee80211)};
|
u8 type{static_cast<u8>(NetworkInterfaceType::WiFi_Ieee80211)};
|
||||||
|
@ -6,19 +6,23 @@
|
|||||||
#include "core/hle/service/npns/npns.h"
|
#include "core/hle/service/npns/npns.h"
|
||||||
#include "core/hle/service/server_manager.h"
|
#include "core/hle/service/server_manager.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
|
#include "core/hle/kernel/k_event.h"
|
||||||
|
#include "core/hle/service/kernel_helpers.h"
|
||||||
|
|
||||||
namespace Service::NPNS {
|
namespace Service::NPNS {
|
||||||
|
|
||||||
class NPNS_S final : public ServiceFramework<NPNS_S> {
|
class NPNS_S final : public ServiceFramework<NPNS_S> {
|
||||||
public:
|
public:
|
||||||
explicit NPNS_S(Core::System& system_) : ServiceFramework{system_, "npns:s"} {
|
explicit NPNS_S(Core::System& system_)
|
||||||
|
: ServiceFramework{system_, "npns:s"}, service_context{system, "npns:s"} {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{1, nullptr, "ListenAll"},
|
{1, nullptr, "ListenAll"},
|
||||||
{2, nullptr, "ListenTo"},
|
{2, &NPNS_S::ListenTo, "ListenTo"},
|
||||||
{3, nullptr, "Receive"},
|
{3, nullptr, "Receive"},
|
||||||
{4, nullptr, "ReceiveRaw"},
|
{4, nullptr, "ReceiveRaw"},
|
||||||
{5, nullptr, "GetReceiveEvent"},
|
{5, &NPNS_S::GetReceiveEvent, "GetReceiveEvent"},
|
||||||
{6, nullptr, "ListenUndelivered"},
|
{6, nullptr, "ListenUndelivered"},
|
||||||
{7, nullptr, "GetStateChangeEVent"},
|
{7, nullptr, "GetStateChangeEVent"},
|
||||||
{11, nullptr, "SubscribeTopic"},
|
{11, nullptr, "SubscribeTopic"},
|
||||||
@ -59,7 +63,30 @@ public:
|
|||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
|
get_recieve_event = service_context.CreateEvent("npns:s:GetReceiveEvent");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void ListenTo(HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
const auto progam_id = rp.Pop<u64>();
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called, progam_id={}", progam_id);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GetReceiveEvent(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushCopyObjects(get_recieve_event->GetReadableEvent());
|
||||||
|
}
|
||||||
|
|
||||||
|
KernelHelpers::ServiceContext service_context;
|
||||||
|
Kernel::KEvent* get_recieve_event;
|
||||||
};
|
};
|
||||||
|
|
||||||
class NPNS_U final : public ServiceFramework<NPNS_U> {
|
class NPNS_U final : public ServiceFramework<NPNS_U> {
|
||||||
|
@ -96,7 +96,7 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
|
|||||||
{67, nullptr, "CancelApplicationApplyDelta"},
|
{67, nullptr, "CancelApplicationApplyDelta"},
|
||||||
{68, nullptr, "ResumeApplicationApplyDelta"},
|
{68, nullptr, "ResumeApplicationApplyDelta"},
|
||||||
{69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"},
|
{69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"},
|
||||||
{70, nullptr, "ResumeAll"},
|
{70, &IApplicationManagerInterface::ResumeAll, "ResumeAll"},
|
||||||
{71, nullptr, "GetStorageSize"},
|
{71, nullptr, "GetStorageSize"},
|
||||||
{80, nullptr, "RequestDownloadApplication"},
|
{80, nullptr, "RequestDownloadApplication"},
|
||||||
{81, nullptr, "RequestDownloadAddOnContent"},
|
{81, nullptr, "RequestDownloadAddOnContent"},
|
||||||
@ -223,10 +223,10 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
|
|||||||
{1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
|
{1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
|
||||||
{1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
|
{1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
|
||||||
{1700, nullptr, "ListApplicationDownloadingContentMeta"},
|
{1700, nullptr, "ListApplicationDownloadingContentMeta"},
|
||||||
{1701, nullptr, "GetApplicationView"},
|
{1701, &IApplicationManagerInterface::GetApplicationView, "GetApplicationView"},
|
||||||
{1702, nullptr, "GetApplicationDownloadTaskStatus"},
|
{1702, nullptr, "GetApplicationDownloadTaskStatus"},
|
||||||
{1703, nullptr, "GetApplicationViewDownloadErrorContext"},
|
{1703, nullptr, "GetApplicationViewDownloadErrorContext"},
|
||||||
{1704, nullptr, "GetApplicationViewWithPromotionInfo"},
|
{1704, &IApplicationManagerInterface::GetApplicationViewWithPromotionInfo, "GetApplicationViewWithPromotionInfo"},
|
||||||
{1705, nullptr, "IsPatchAutoDeletableApplication"},
|
{1705, nullptr, "IsPatchAutoDeletableApplication"},
|
||||||
{1800, nullptr, "IsNotificationSetupCompleted"},
|
{1800, nullptr, "IsNotificationSetupCompleted"},
|
||||||
{1801, nullptr, "GetLastNotificationInfoCount"},
|
{1801, nullptr, "GetLastNotificationInfoCount"},
|
||||||
@ -340,18 +340,73 @@ IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_
|
|||||||
service_context.CreateEvent("IApplicationManagerInterface::GamecardMountFailureEvent");
|
service_context.CreateEvent("IApplicationManagerInterface::GamecardMountFailureEvent");
|
||||||
}
|
}
|
||||||
|
|
||||||
IApplicationManagerInterface::~IApplicationManagerInterface() = default;
|
IApplicationManagerInterface::~IApplicationManagerInterface(){
|
||||||
|
service_context.CloseEvent(record_update_system_event);
|
||||||
|
service_context.CloseEvent(gamecard_update_detection_event);
|
||||||
|
service_context.CloseEvent(gamecard_mount_status_event);
|
||||||
|
service_context.CloseEvent(gamecard_mount_failure_event);
|
||||||
|
};
|
||||||
|
|
||||||
void IApplicationManagerInterface::ListApplicationRecord(HLERequestContext& ctx) {
|
void IApplicationManagerInterface::ListApplicationRecord(HLERequestContext& ctx) {
|
||||||
|
IPC::RequestParser rp{ctx};
|
||||||
|
auto offset = rp.Pop<s32>();
|
||||||
|
const auto limit = ctx.GetWriteBufferNumElements<ApplicationRecord>();
|
||||||
|
|
||||||
LOG_ERROR(Service_NS, "(STUBBED) called");
|
LOG_ERROR(Service_NS, "(STUBBED) called");
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
std::vector<ApplicationRecord> application_records;
|
||||||
|
std::vector<ApplicationRecord> application_records2;
|
||||||
|
|
||||||
|
application_records.push_back(ApplicationRecord{
|
||||||
|
.application_id = 0x010074F013262000,
|
||||||
|
.type = 3,
|
||||||
|
.unknown = 2,
|
||||||
|
.unknown2 = 0,
|
||||||
|
});
|
||||||
|
application_records.push_back(ApplicationRecord{
|
||||||
|
.application_id = 0x01000F0002BB6000,
|
||||||
|
.type = 2,
|
||||||
|
.unknown = 2,
|
||||||
|
.unknown2 = 1,
|
||||||
|
});
|
||||||
|
application_records.push_back(ApplicationRecord{
|
||||||
|
.application_id = 0x0100A7F002830000,
|
||||||
|
.type = 1,
|
||||||
|
.unknown = 2,
|
||||||
|
.unknown2 = 2,
|
||||||
|
});
|
||||||
|
application_records.push_back(ApplicationRecord{
|
||||||
|
.application_id = 0x01008DF012A7A000,
|
||||||
|
.type = 3,
|
||||||
|
.unknown = 2,
|
||||||
|
.unknown2 = 3,
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const auto& data : application_records) {
|
||||||
|
if (application_records2.size() >= limit) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (offset > 0) {
|
||||||
|
offset--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
application_records2.push_back(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!application_records2.empty()) {
|
||||||
|
ctx.WriteBuffer(application_records2);
|
||||||
|
}
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
rb.Push(0);
|
rb.Push(application_records2.size());
|
||||||
}
|
}
|
||||||
void IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent(HLERequestContext& ctx) {
|
void IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent(HLERequestContext& ctx) {
|
||||||
LOG_ERROR(Service_NS, "(STUBBED) called");
|
LOG_ERROR(Service_NS, "(STUBBED) called");
|
||||||
|
|
||||||
|
record_update_system_event->Signal();
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 1};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
rb.PushCopyObjects(record_update_system_event->GetReadableEvent());
|
rb.PushCopyObjects(record_update_system_event->GetReadableEvent());
|
||||||
@ -360,12 +415,11 @@ void IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent(HLERequ
|
|||||||
void IApplicationManagerInterface::GetApplicationControlData(HLERequestContext& ctx) {
|
void IApplicationManagerInterface::GetApplicationControlData(HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
const auto flag = rp.PopRaw<u64>();
|
const auto flag = rp.PopRaw<u64>();
|
||||||
LOG_DEBUG(Service_NS, "called with flag={:016X}", flag);
|
|
||||||
|
|
||||||
const auto title_id = rp.PopRaw<u64>();
|
const auto title_id = rp.PopRaw<u64>();
|
||||||
|
|
||||||
const auto size = ctx.GetWriteBufferSize();
|
const auto size = ctx.GetWriteBufferSize();
|
||||||
|
|
||||||
|
LOG_ERROR(Service_NS, "called with flag={:016X}, title_id={:016X}", flag, title_id);
|
||||||
|
|
||||||
const FileSys::PatchManager pm{title_id, system.GetFileSystemController(),
|
const FileSys::PatchManager pm{title_id, system.GetFileSystemController(),
|
||||||
system.GetContentProvider()};
|
system.GetContentProvider()};
|
||||||
const auto control = pm.GetControlMetadata();
|
const auto control = pm.GetControlMetadata();
|
||||||
@ -424,6 +478,50 @@ void IApplicationManagerInterface::GetGameCardMountFailureEvent(HLERequestContex
|
|||||||
rb.PushCopyObjects(gamecard_mount_failure_event->GetReadableEvent());
|
rb.PushCopyObjects(gamecard_mount_failure_event->GetReadableEvent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IApplicationManagerInterface::GetApplicationView(HLERequestContext& ctx) {
|
||||||
|
std::vector<u64> application_id(ctx.GetReadBufferNumElements<u64>());
|
||||||
|
const auto app_buffer = ctx.ReadBuffer();
|
||||||
|
memcpy(application_id.data(), app_buffer.data(), app_buffer.size());
|
||||||
|
|
||||||
|
std::vector<ApplicationView> app_view;
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_NS, "(STUBBED) called, size={}", application_id.size());
|
||||||
|
for (const u64& data : application_id) {
|
||||||
|
app_view.push_back(ApplicationView{
|
||||||
|
.application_id = data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.WriteBuffer(app_view);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IApplicationManagerInterface::GetApplicationViewWithPromotionInfo(HLERequestContext& ctx) {
|
||||||
|
std::vector<u64> application_id(ctx.GetReadBufferNumElements<u64>());
|
||||||
|
const auto app_buffer = ctx.ReadBuffer();
|
||||||
|
memcpy(application_id.data(), app_buffer.data(), app_buffer.size());
|
||||||
|
|
||||||
|
std::vector<ApplicationViewWithPromotionInfo> app_view;
|
||||||
|
|
||||||
|
LOG_DEBUG(Service_NS, "(STUBBED) called, size={}", application_id.size());
|
||||||
|
|
||||||
|
for (const u64& data : application_id) {
|
||||||
|
app_view.push_back(ApplicationViewWithPromotionInfo{
|
||||||
|
.view{
|
||||||
|
.application_id = data,
|
||||||
|
},
|
||||||
|
.promotion = {},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.WriteBuffer(app_view);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
void IApplicationManagerInterface::CheckSdCardMountStatus(HLERequestContext& ctx) {
|
void IApplicationManagerInterface::CheckSdCardMountStatus(HLERequestContext& ctx) {
|
||||||
LOG_ERROR(Service_NS, "(STUBBED) called");
|
LOG_ERROR(Service_NS, "(STUBBED) called");
|
||||||
|
|
||||||
@ -473,7 +571,7 @@ void IApplicationManagerInterface::GetApplicationDesiredLanguage(HLERequestConte
|
|||||||
|
|
||||||
Result IApplicationManagerInterface::GetApplicationDesiredLanguage(u8* out_desired_language,
|
Result IApplicationManagerInterface::GetApplicationDesiredLanguage(u8* out_desired_language,
|
||||||
const u32 supported_languages) {
|
const u32 supported_languages) {
|
||||||
LOG_DEBUG(Service_NS, "called with supported_languages={:08X}", supported_languages);
|
LOG_ERROR(Service_NS, "called with supported_languages={:08X}", supported_languages);
|
||||||
|
|
||||||
// Get language code from settings
|
// Get language code from settings
|
||||||
const auto language_code =
|
const auto language_code =
|
||||||
@ -525,6 +623,13 @@ void IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IApplicationManagerInterface::ResumeAll(HLERequestContext& ctx) {
|
||||||
|
|
||||||
|
LOG_WARNING(Service_AM, "(STUBBED) called");
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
Result IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode(
|
Result IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode(
|
||||||
u64* out_language_code, u8 application_language) {
|
u64* out_language_code, u8 application_language) {
|
||||||
const auto language_code =
|
const auto language_code =
|
||||||
@ -896,7 +1001,7 @@ public:
|
|||||||
: ServiceFramework{system_, "ns:su"}, service_context{system_, "ns:su"} {
|
: ServiceFramework{system_, "ns:su"}, service_context{system_, "ns:su"} {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, nullptr, "GetBackgroundNetworkUpdateState"},
|
{0, &NS_SU::GetBackgroundNetworkUpdateState, "GetBackgroundNetworkUpdateState"},
|
||||||
{1, &NS_SU::OpenSystemUpdateControl, "OpenSystemUpdateControl"},
|
{1, &NS_SU::OpenSystemUpdateControl, "OpenSystemUpdateControl"},
|
||||||
{2, nullptr, "NotifyExFatDriverRequired"},
|
{2, nullptr, "NotifyExFatDriverRequired"},
|
||||||
{3, nullptr, "ClearExFatDriverStatusForDebug"},
|
{3, nullptr, "ClearExFatDriverStatusForDebug"},
|
||||||
@ -925,8 +1030,22 @@ private:
|
|||||||
Kernel::KEvent* update_notification_event;
|
Kernel::KEvent* update_notification_event;
|
||||||
KernelHelpers::ServiceContext service_context;
|
KernelHelpers::ServiceContext service_context;
|
||||||
|
|
||||||
|
enum class BackgroundNetworkUpdateState {
|
||||||
|
None,
|
||||||
|
InProgress,
|
||||||
|
Ready,
|
||||||
|
};
|
||||||
|
|
||||||
|
void GetBackgroundNetworkUpdateState(HLERequestContext& ctx) {
|
||||||
|
LOG_ERROR(Service_AM, "called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushEnum(BackgroundNetworkUpdateState::None);
|
||||||
|
}
|
||||||
|
|
||||||
void OpenSystemUpdateControl(HLERequestContext& ctx) {
|
void OpenSystemUpdateControl(HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_NS, "called");
|
LOG_ERROR(Service_NS, "called");
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
|
@ -34,16 +34,62 @@ public:
|
|||||||
u8 application_language);
|
u8 application_language);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct ApplicationRecord {
|
||||||
|
u64 application_id;
|
||||||
|
u8 type;
|
||||||
|
u8 unknown;
|
||||||
|
INSERT_PADDING_BYTES(0x6);
|
||||||
|
u8 unknown2;
|
||||||
|
INSERT_PADDING_BYTES(0x7);
|
||||||
|
};
|
||||||
|
|
||||||
|
/// ApplicationView
|
||||||
|
struct ApplicationView {
|
||||||
|
u64 application_id; ///< ApplicationId.
|
||||||
|
u8 unk_x8[0x4]; ///< Unknown.
|
||||||
|
u32 flags; ///< Flags.
|
||||||
|
u8 unk_x10[0x10]; ///< Unknown.
|
||||||
|
u32 unk_x20; ///< Unknown.
|
||||||
|
u16 unk_x24; ///< Unknown.
|
||||||
|
u8 unk_x26[0x2]; ///< Unknown.
|
||||||
|
u8 unk_x28[0x8]; ///< Unknown.
|
||||||
|
u8 unk_x30[0x10]; ///< Unknown.
|
||||||
|
u32 unk_x40; ///< Unknown.
|
||||||
|
u8 unk_x44; ///< Unknown.
|
||||||
|
u8 unk_x45[0xb]; ///< Unknown.
|
||||||
|
};
|
||||||
|
|
||||||
|
/// NsPromotionInfo
|
||||||
|
struct PromotionInfo {
|
||||||
|
u64 start_timestamp; ///< POSIX timestamp for the promotion start.
|
||||||
|
u64 end_timestamp; ///< POSIX timestamp for the promotion end.
|
||||||
|
s64 remaining_time; ///< Remaining time until the promotion ends, in nanoseconds
|
||||||
|
///< ({end_timestamp - current_time} converted to nanoseconds).
|
||||||
|
INSERT_PADDING_BYTES(0x4);
|
||||||
|
u8 flags; ///< Flags. Bit0: whether the PromotionInfo is valid (including bit1). Bit1 clear:
|
||||||
|
///< remaining_time is set.
|
||||||
|
INSERT_PADDING_BYTES(0x3);
|
||||||
|
};
|
||||||
|
|
||||||
|
/// NsApplicationViewWithPromotionInfo
|
||||||
|
struct ApplicationViewWithPromotionInfo {
|
||||||
|
ApplicationView view; ///< \ref NsApplicationView
|
||||||
|
PromotionInfo promotion; ///< \ref NsPromotionInfo
|
||||||
|
};
|
||||||
|
|
||||||
void ListApplicationRecord(HLERequestContext& ctx);
|
void ListApplicationRecord(HLERequestContext& ctx);
|
||||||
void GetApplicationRecordUpdateSystemEvent(HLERequestContext& ctx);
|
void GetApplicationRecordUpdateSystemEvent(HLERequestContext& ctx);
|
||||||
void GetApplicationControlData(HLERequestContext& ctx);
|
void GetApplicationControlData(HLERequestContext& ctx);
|
||||||
void GetGameCardMountFailureEvent(HLERequestContext& ctx);
|
void GetGameCardMountFailureEvent(HLERequestContext& ctx);
|
||||||
|
void GetApplicationView(HLERequestContext& ctx);
|
||||||
|
void GetApplicationViewWithPromotionInfo(HLERequestContext& ctx);
|
||||||
void CheckSdCardMountStatus(HLERequestContext& ctx);
|
void CheckSdCardMountStatus(HLERequestContext& ctx);
|
||||||
void GetSdCardMountStatusChangedEvent(HLERequestContext& ctx);
|
void GetSdCardMountStatusChangedEvent(HLERequestContext& ctx);
|
||||||
void GetFreeSpaceSize(HLERequestContext& ctx);
|
void GetFreeSpaceSize(HLERequestContext& ctx);
|
||||||
void GetGameCardUpdateDetectionEvent(HLERequestContext& ctx);
|
void GetGameCardUpdateDetectionEvent(HLERequestContext& ctx);
|
||||||
void GetApplicationDesiredLanguage(HLERequestContext& ctx);
|
void GetApplicationDesiredLanguage(HLERequestContext& ctx);
|
||||||
void ConvertApplicationLanguageToLanguageCode(HLERequestContext& ctx);
|
void ConvertApplicationLanguageToLanguageCode(HLERequestContext& ctx);
|
||||||
|
void ResumeAll(HLERequestContext& ctx);
|
||||||
|
|
||||||
Kernel::KEvent* record_update_system_event;
|
Kernel::KEvent* record_update_system_event;
|
||||||
Kernel::KEvent* gamecard_update_detection_event;
|
Kernel::KEvent* gamecard_update_detection_event;
|
||||||
|
@ -39,7 +39,7 @@ public:
|
|||||||
{1007, nullptr, "RevertRestrictionTemporaryUnlocked"},
|
{1007, nullptr, "RevertRestrictionTemporaryUnlocked"},
|
||||||
{1008, nullptr, "EnterRestrictedSystemSettings"},
|
{1008, nullptr, "EnterRestrictedSystemSettings"},
|
||||||
{1009, nullptr, "LeaveRestrictedSystemSettings"},
|
{1009, nullptr, "LeaveRestrictedSystemSettings"},
|
||||||
{1010, nullptr, "IsRestrictedSystemSettingsEntered"},
|
{1010, &IParentalControlService::IsRestrictedSystemSettingsEntered, "IsRestrictedSystemSettingsEntered"},
|
||||||
{1011, nullptr, "RevertRestrictedSystemSettingsEntered"},
|
{1011, nullptr, "RevertRestrictedSystemSettingsEntered"},
|
||||||
{1012, nullptr, "GetRestrictedFeatures"},
|
{1012, nullptr, "GetRestrictedFeatures"},
|
||||||
{1013, &IParentalControlService::ConfirmStereoVisionPermission, "ConfirmStereoVisionPermission"},
|
{1013, &IParentalControlService::ConfirmStereoVisionPermission, "ConfirmStereoVisionPermission"},
|
||||||
@ -75,7 +75,7 @@ public:
|
|||||||
{1203, nullptr, "SetPinCode"},
|
{1203, nullptr, "SetPinCode"},
|
||||||
{1204, nullptr, "GenerateInquiryCode"},
|
{1204, nullptr, "GenerateInquiryCode"},
|
||||||
{1205, nullptr, "CheckMasterKey"},
|
{1205, nullptr, "CheckMasterKey"},
|
||||||
{1206, nullptr, "GetPinCodeLength"},
|
{1206, &IParentalControlService::GetPinCodeLength, "GetPinCodeLength"},
|
||||||
{1207, nullptr, "GetPinCodeChangedEvent"},
|
{1207, nullptr, "GetPinCodeChangedEvent"},
|
||||||
{1208, nullptr, "GetPinCode"},
|
{1208, nullptr, "GetPinCode"},
|
||||||
{1403, &IParentalControlService::IsPairingActive, "IsPairingActive"},
|
{1403, &IParentalControlService::IsPairingActive, "IsPairingActive"},
|
||||||
@ -87,11 +87,11 @@ public:
|
|||||||
{1426, nullptr, "GetPostEventInterval"},
|
{1426, nullptr, "GetPostEventInterval"},
|
||||||
{1427, nullptr, "SetPostEventInterval"},
|
{1427, nullptr, "SetPostEventInterval"},
|
||||||
{1432, &IParentalControlService::GetSynchronizationEvent, "GetSynchronizationEvent"},
|
{1432, &IParentalControlService::GetSynchronizationEvent, "GetSynchronizationEvent"},
|
||||||
{1451, nullptr, "StartPlayTimer"},
|
{1451, &IParentalControlService::StartPlayTimer, "StartPlayTimer"},
|
||||||
{1452, nullptr, "StopPlayTimer"},
|
{1452, &IParentalControlService::StopPlayTimer, "StopPlayTimer"},
|
||||||
{1453, nullptr, "IsPlayTimerEnabled"},
|
{1453, &IParentalControlService::IsPlayTimerEnabled, "IsPlayTimerEnabled"},
|
||||||
{1454, nullptr, "GetPlayTimerRemainingTime"},
|
{1454, nullptr, "GetPlayTimerRemainingTime"},
|
||||||
{1455, nullptr, "IsRestrictedByPlayTimer"},
|
{1455, &IParentalControlService::IsRestrictedByPlayTimer, "IsRestrictedByPlayTimer"},
|
||||||
{1456, &IParentalControlService::GetPlayTimerSettings, "GetPlayTimerSettings"},
|
{1456, &IParentalControlService::GetPlayTimerSettings, "GetPlayTimerSettings"},
|
||||||
{1457, &IParentalControlService::GetPlayTimerEventToRequestSuspension, "GetPlayTimerEventToRequestSuspension"},
|
{1457, &IParentalControlService::GetPlayTimerEventToRequestSuspension, "GetPlayTimerEventToRequestSuspension"},
|
||||||
{1458, &IParentalControlService::IsPlayTimerAlarmDisabled, "IsPlayTimerAlarmDisabled"},
|
{1458, &IParentalControlService::IsPlayTimerAlarmDisabled, "IsPlayTimerAlarmDisabled"},
|
||||||
@ -259,6 +259,16 @@ private:
|
|||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
rb.Push<u8>(is_temporary_unlocked);
|
rb.Push<u8>(is_temporary_unlocked);
|
||||||
}
|
}
|
||||||
|
void IsRestrictedSystemSettingsEntered(HLERequestContext& ctx) {
|
||||||
|
const bool is_temporary_unlocked = false;
|
||||||
|
|
||||||
|
LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
|
||||||
|
is_temporary_unlocked);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push<u8>(is_temporary_unlocked);
|
||||||
|
}
|
||||||
|
|
||||||
void ConfirmStereoVisionPermission(HLERequestContext& ctx) {
|
void ConfirmStereoVisionPermission(HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_PCTL, "called");
|
LOG_DEBUG(Service_PCTL, "called");
|
||||||
@ -360,6 +370,16 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GetPinCodeLength(HLERequestContext& ctx) {
|
||||||
|
const bool is_pairing_active = false;
|
||||||
|
|
||||||
|
LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", is_pairing_active);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(0);
|
||||||
|
}
|
||||||
|
|
||||||
void IsPairingActive(HLERequestContext& ctx) {
|
void IsPairingActive(HLERequestContext& ctx) {
|
||||||
const bool is_pairing_active = false;
|
const bool is_pairing_active = false;
|
||||||
|
|
||||||
@ -378,6 +398,39 @@ private:
|
|||||||
rb.PushCopyObjects(synchronization_event->GetReadableEvent());
|
rb.PushCopyObjects(synchronization_event->GetReadableEvent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StartPlayTimer(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_PCTL, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StopPlayTimer(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_PCTL, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IsPlayTimerEnabled(HLERequestContext& ctx) {
|
||||||
|
LOG_WARNING(Service_PCTL, "(STUBBED) called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IsRestrictedByPlayTimer(HLERequestContext& ctx) {
|
||||||
|
const bool is_temporary_unlocked = false;
|
||||||
|
|
||||||
|
LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
|
||||||
|
is_temporary_unlocked);
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 3};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.Push<u8>(is_temporary_unlocked);
|
||||||
|
}
|
||||||
|
|
||||||
void GetPlayTimerSettings(HLERequestContext& ctx) {
|
void GetPlayTimerSettings(HLERequestContext& ctx) {
|
||||||
LOG_WARNING(Service_PCTL, "(STUBBED) called");
|
LOG_WARNING(Service_PCTL, "(STUBBED) called");
|
||||||
|
|
||||||
|
@ -75,11 +75,51 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class IReceiver final : public ServiceFramework<IReceiver> {
|
||||||
|
public:
|
||||||
|
explicit IReceiver(Core::System& system_) : ServiceFramework{system_, "IReceiver"} {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, nullptr, "AddSource"},
|
||||||
|
{1, nullptr, "RemoveSource"},
|
||||||
|
{2, nullptr, "GetReceiveEventHandle"},
|
||||||
|
{3, nullptr, "Receive"},
|
||||||
|
{4, nullptr, "ReceiveWithTick"},
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class OvlnRcv final : public ServiceFramework<OvlnRcv> {
|
||||||
|
public:
|
||||||
|
explicit OvlnRcv(Core::System& system_) : ServiceFramework{system_, "ovln:rcv"} {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, &OvlnRcv::OpenReceiver, "OpenReceiver"},
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void OpenReceiver(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_PSC, "called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushIpcInterface<IReceiver>(system);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void LoopProcess(Core::System& system) {
|
void LoopProcess(Core::System& system) {
|
||||||
auto server_manager = std::make_unique<ServerManager>(system);
|
auto server_manager = std::make_unique<ServerManager>(system);
|
||||||
|
|
||||||
server_manager->RegisterNamedService("psc:c", std::make_shared<IPmControl>(system));
|
server_manager->RegisterNamedService("psc:c", std::make_shared<IPmControl>(system));
|
||||||
server_manager->RegisterNamedService("psc:m", std::make_shared<IPmService>(system));
|
server_manager->RegisterNamedService("psc:m", std::make_shared<IPmService>(system));
|
||||||
|
server_manager->RegisterNamedService("ovln:rcv", std::make_shared<OvlnRcv>(system));
|
||||||
|
|
||||||
auto time = std::make_shared<Time::TimeManager>(system);
|
auto time = std::make_shared<Time::TimeManager>(system);
|
||||||
|
|
||||||
|
@ -158,9 +158,11 @@ void ISettingsServer::GetKeyCodeMap2(HLERequestContext& ctx) {
|
|||||||
|
|
||||||
void ISettingsServer::GetDeviceNickName(HLERequestContext& ctx) {
|
void ISettingsServer::GetDeviceNickName(HLERequestContext& ctx) {
|
||||||
LOG_DEBUG(Service_SET, "called");
|
LOG_DEBUG(Service_SET, "called");
|
||||||
|
|
||||||
|
ctx.WriteBuffer(Settings::values.device_name.GetValue());
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
rb.Push(ResultSuccess);
|
rb.Push(ResultSuccess);
|
||||||
ctx.WriteBuffer(Settings::values.device_name.GetValue());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Service::Set
|
} // namespace Service::Set
|
||||||
|
@ -87,6 +87,7 @@ private:
|
|||||||
void SetExternalSteadyClockSourceId(HLERequestContext& ctx);
|
void SetExternalSteadyClockSourceId(HLERequestContext& ctx);
|
||||||
void GetUserSystemClockContext(HLERequestContext& ctx);
|
void GetUserSystemClockContext(HLERequestContext& ctx);
|
||||||
void SetUserSystemClockContext(HLERequestContext& ctx);
|
void SetUserSystemClockContext(HLERequestContext& ctx);
|
||||||
|
void GetLockScreenFlag(HLERequestContext& ctx);
|
||||||
void GetAccountSettings(HLERequestContext& ctx);
|
void GetAccountSettings(HLERequestContext& ctx);
|
||||||
void SetAccountSettings(HLERequestContext& ctx);
|
void SetAccountSettings(HLERequestContext& ctx);
|
||||||
void GetEulaVersions(HLERequestContext& ctx);
|
void GetEulaVersions(HLERequestContext& ctx);
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "common/fs/fs.h"
|
#include "common/fs/fs.h"
|
||||||
#include "common/fs/path_util.h"
|
#include "common/fs/path_util.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
|
#include "core/hle/service/glue/glue_manager.h"
|
||||||
#include "core/file_sys/card_image.h"
|
#include "core/file_sys/card_image.h"
|
||||||
#include "core/file_sys/content_archive.h"
|
#include "core/file_sys/content_archive.h"
|
||||||
#include "core/file_sys/control_metadata.h"
|
#include "core/file_sys/control_metadata.h"
|
||||||
@ -326,6 +327,21 @@ void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir) {
|
|||||||
const auto control = cache.GetEntry(game.title_id, ContentRecordType::Control);
|
const auto control = cache.GetEntry(game.title_id, ContentRecordType::Control);
|
||||||
if (control != nullptr) {
|
if (control != nullptr) {
|
||||||
GetMetadataFromControlNCA(patch, *control, icon, name);
|
GetMetadataFromControlNCA(patch, *control, icon, name);
|
||||||
|
|
||||||
|
std::vector<u8> nacp_data;
|
||||||
|
FileSys::NACP nacp;
|
||||||
|
if (loader->ReadControlData(nacp) == Loader::ResultStatus::Success) {
|
||||||
|
nacp_data = nacp.GetRawBytes();
|
||||||
|
} else {
|
||||||
|
nacp_data.resize(sizeof(FileSys::RawNACP));
|
||||||
|
}
|
||||||
|
Service::Glue::ApplicationLaunchProperty launch{};
|
||||||
|
launch.title_id = program_id;
|
||||||
|
launch.version = patch.GetGameVersion().value_or(0);
|
||||||
|
launch.base_game_storage_id = FileSys::StorageId::NandUser;
|
||||||
|
launch.update_storage_id = FileSys::StorageId::NandSystem;
|
||||||
|
|
||||||
|
system.GetARPManager().Register(launch.title_id, launch, std::move(nacp_data));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto entry = MakeGameListEntry(file->GetFullPath(), name, file->GetSize(), icon, *loader,
|
auto entry = MakeGameListEntry(file->GetFullPath(), name, file->GetSize(), icon, *loader,
|
||||||
|
@ -1593,6 +1593,7 @@ void GMainWindow::ConnectMenuEvents() {
|
|||||||
[this]() { OnCabinet(Service::NFP::CabinetMode::StartRestorer); });
|
[this]() { OnCabinet(Service::NFP::CabinetMode::StartRestorer); });
|
||||||
connect_menu(ui->action_Load_Cabinet_Formatter,
|
connect_menu(ui->action_Load_Cabinet_Formatter,
|
||||||
[this]() { OnCabinet(Service::NFP::CabinetMode::StartFormatter); });
|
[this]() { OnCabinet(Service::NFP::CabinetMode::StartFormatter); });
|
||||||
|
connect_menu(ui->action_Load_QLaunch, &GMainWindow::OnQlaunch);
|
||||||
connect_menu(ui->action_Load_Mii_Edit, &GMainWindow::OnMiiEdit);
|
connect_menu(ui->action_Load_Mii_Edit, &GMainWindow::OnMiiEdit);
|
||||||
connect_menu(ui->action_Open_Controller_Menu, &GMainWindow::OnOpenControllerMenu);
|
connect_menu(ui->action_Open_Controller_Menu, &GMainWindow::OnOpenControllerMenu);
|
||||||
connect_menu(ui->action_Capture_Screenshot, &GMainWindow::OnCaptureScreenshot);
|
connect_menu(ui->action_Capture_Screenshot, &GMainWindow::OnCaptureScreenshot);
|
||||||
@ -1628,6 +1629,7 @@ void GMainWindow::UpdateMenuState() {
|
|||||||
ui->action_Load_Cabinet_Restorer,
|
ui->action_Load_Cabinet_Restorer,
|
||||||
ui->action_Load_Cabinet_Formatter,
|
ui->action_Load_Cabinet_Formatter,
|
||||||
ui->action_Load_Mii_Edit,
|
ui->action_Load_Mii_Edit,
|
||||||
|
ui->action_Load_QLaunch,
|
||||||
ui->action_Open_Controller_Menu};
|
ui->action_Open_Controller_Menu};
|
||||||
|
|
||||||
for (QAction* action : running_actions) {
|
for (QAction* action : running_actions) {
|
||||||
@ -4218,6 +4220,29 @@ void GMainWindow::OnCabinet(Service::NFP::CabinetMode mode) {
|
|||||||
BootGame(filename, LibraryAppletParameters(CabinetId, Service::AM::AppletId::Cabinet));
|
BootGame(filename, LibraryAppletParameters(CabinetId, Service::AM::AppletId::Cabinet));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GMainWindow::OnQlaunch() {
|
||||||
|
constexpr u64 MiiEditId = 0x0100000000001000ull;
|
||||||
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents();
|
||||||
|
if (!bis_system) {
|
||||||
|
QMessageBox::warning(this, tr("No firmware available"),
|
||||||
|
tr("Please install the firmware to use the Mii editor."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto mii_applet_nca = bis_system->GetEntry(MiiEditId, FileSys::ContentRecordType::Program);
|
||||||
|
if (!mii_applet_nca) {
|
||||||
|
QMessageBox::warning(this, tr("Mii Edit Applet"),
|
||||||
|
tr("Mii editor is not available. Please reinstall firmware."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
system->GetAppletManager().SetCurrentAppletId(Service::AM::Applets::AppletId::QLaunch);
|
||||||
|
|
||||||
|
const auto filename = QString::fromStdString((mii_applet_nca->GetFullPath()));
|
||||||
|
UISettings::values.roms_path = QFileInfo(filename).path();
|
||||||
|
BootGame(filename);
|
||||||
|
}
|
||||||
|
|
||||||
void GMainWindow::OnMiiEdit() {
|
void GMainWindow::OnMiiEdit() {
|
||||||
constexpr u64 MiiEditId = static_cast<u64>(Service::AM::AppletProgramId::MiiEdit);
|
constexpr u64 MiiEditId = static_cast<u64>(Service::AM::AppletProgramId::MiiEdit);
|
||||||
auto bis_system = system->GetFileSystemController().GetSystemNANDContents();
|
auto bis_system = system->GetFileSystemController().GetSystemNANDContents();
|
||||||
|
@ -395,6 +395,7 @@ private slots:
|
|||||||
void ResetWindowSize900();
|
void ResetWindowSize900();
|
||||||
void ResetWindowSize1080();
|
void ResetWindowSize1080();
|
||||||
void OnAlbum();
|
void OnAlbum();
|
||||||
|
void OnQlaunch();
|
||||||
void OnCabinet(Service::NFP::CabinetMode mode);
|
void OnCabinet(Service::NFP::CabinetMode mode);
|
||||||
void OnMiiEdit();
|
void OnMiiEdit();
|
||||||
void OnOpenControllerMenu();
|
void OnOpenControllerMenu();
|
||||||
|
@ -159,6 +159,7 @@
|
|||||||
<addaction name="action_Rederive"/>
|
<addaction name="action_Rederive"/>
|
||||||
<addaction name="action_Verify_installed_contents"/>
|
<addaction name="action_Verify_installed_contents"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
|
<addaction name="action_Load_QLaunch"/>
|
||||||
<addaction name="menu_cabinet_applet"/>
|
<addaction name="menu_cabinet_applet"/>
|
||||||
<addaction name="action_Load_Album"/>
|
<addaction name="action_Load_Album"/>
|
||||||
<addaction name="action_Load_Mii_Edit"/>
|
<addaction name="action_Load_Mii_Edit"/>
|
||||||
@ -402,6 +403,11 @@
|
|||||||
<string>&Format Amiibo</string>
|
<string>&Format Amiibo</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="action_Load_QLaunch">
|
||||||
|
<property name="text">
|
||||||
|
<string>Open &Home menu</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
<action name="action_Load_Mii_Edit">
|
<action name="action_Load_Mii_Edit">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Open &Mii Editor</string>
|
<string>Open &Mii Editor</string>
|
||||||
|
Reference in New Issue
Block a user