mirror of
https://github.com/yuzu-emu/yuzu-mainline
synced 2024-11-25 14:08:54 +00:00
ns: rewrite IApplicationManagerInterface
This commit is contained in:
parent
cf0de18982
commit
2e96921f9c
11 changed files with 633 additions and 489 deletions
|
@ -741,6 +741,8 @@ add_library(core STATIC
|
||||||
hle/service/npns/npns.h
|
hle/service/npns/npns.h
|
||||||
hle/service/ns/account_proxy_interface.cpp
|
hle/service/ns/account_proxy_interface.cpp
|
||||||
hle/service/ns/account_proxy_interface.h
|
hle/service/ns/account_proxy_interface.h
|
||||||
|
hle/service/ns/application_manager_interface.cpp
|
||||||
|
hle/service/ns/application_manager_interface.h
|
||||||
hle/service/ns/application_version_interface.cpp
|
hle/service/ns/application_version_interface.cpp
|
||||||
hle/service/ns/application_version_interface.h
|
hle/service/ns/application_version_interface.h
|
||||||
hle/service/ns/content_management_interface.cpp
|
hle/service/ns/content_management_interface.cpp
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "core/hle/service/filesystem/filesystem.h"
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
#include "core/hle/service/filesystem/save_data_controller.h"
|
#include "core/hle/service/filesystem/save_data_controller.h"
|
||||||
#include "core/hle/service/glue/glue_manager.h"
|
#include "core/hle/service/glue/glue_manager.h"
|
||||||
|
#include "core/hle/service/ns/application_manager_interface.h"
|
||||||
#include "core/hle/service/ns/ns.h"
|
#include "core/hle/service/ns/ns.h"
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
|
|
||||||
|
@ -167,7 +168,7 @@ Result IApplicationFunctions::GetDesiredLanguage(Out<u64> out_language_code) {
|
||||||
auto app_man = ns_am2->GetApplicationManagerInterface();
|
auto app_man = ns_am2->GetApplicationManagerInterface();
|
||||||
|
|
||||||
// Get desired application language
|
// Get desired application language
|
||||||
u8 desired_language{};
|
NS::ApplicationLanguage desired_language{};
|
||||||
R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
|
R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
|
||||||
|
|
||||||
// Convert to settings language code.
|
// Convert to settings language code.
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "core/hle/service/cmif_serialization.h"
|
#include "core/hle/service/cmif_serialization.h"
|
||||||
#include "core/hle/service/filesystem/filesystem.h"
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
#include "core/hle/service/glue/glue_manager.h"
|
#include "core/hle/service/glue/glue_manager.h"
|
||||||
|
#include "core/hle/service/ns/application_manager_interface.h"
|
||||||
#include "core/hle/service/ns/ns.h"
|
#include "core/hle/service/ns/ns.h"
|
||||||
#include "core/hle/service/sm/sm.h"
|
#include "core/hle/service/sm/sm.h"
|
||||||
|
|
||||||
|
@ -260,7 +261,7 @@ Result ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage(
|
||||||
auto app_man = ns_am2->GetApplicationManagerInterface();
|
auto app_man = ns_am2->GetApplicationManagerInterface();
|
||||||
|
|
||||||
// Get desired application language
|
// Get desired application language
|
||||||
u8 desired_language{};
|
NS::ApplicationLanguage desired_language{};
|
||||||
R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
|
R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
|
||||||
|
|
||||||
// Convert to settings language code.
|
// Convert to settings language code.
|
||||||
|
|
518
src/core/hle/service/ns/application_manager_interface.cpp
Normal file
518
src/core/hle/service/ns/application_manager_interface.cpp
Normal file
|
@ -0,0 +1,518 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "core/file_sys/nca_metadata.h"
|
||||||
|
#include "core/file_sys/registered_cache.h"
|
||||||
|
#include "core/hle/service/cmif_serialization.h"
|
||||||
|
#include "core/hle/service/filesystem/filesystem.h"
|
||||||
|
#include "core/hle/service/ns/application_manager_interface.h"
|
||||||
|
#include "core/hle/service/ns/content_management_interface.h"
|
||||||
|
#include "core/hle/service/ns/read_only_application_control_data_interface.h"
|
||||||
|
|
||||||
|
namespace Service::NS {
|
||||||
|
|
||||||
|
IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_)
|
||||||
|
: ServiceFramework{system_, "IApplicationManagerInterface"},
|
||||||
|
service_context{system, "IApplicationManagerInterface"},
|
||||||
|
record_update_system_event{service_context}, sd_card_mount_status_event{service_context},
|
||||||
|
gamecard_update_detection_event{service_context},
|
||||||
|
gamecard_mount_status_event{service_context}, gamecard_mount_failure_event{service_context} {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, D<&IApplicationManagerInterface::ListApplicationRecord>, "ListApplicationRecord"},
|
||||||
|
{1, nullptr, "GenerateApplicationRecordCount"},
|
||||||
|
{2, D<&IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent>, "GetApplicationRecordUpdateSystemEvent"},
|
||||||
|
{3, nullptr, "GetApplicationViewDeprecated"},
|
||||||
|
{4, nullptr, "DeleteApplicationEntity"},
|
||||||
|
{5, nullptr, "DeleteApplicationCompletely"},
|
||||||
|
{6, nullptr, "IsAnyApplicationEntityRedundant"},
|
||||||
|
{7, nullptr, "DeleteRedundantApplicationEntity"},
|
||||||
|
{8, nullptr, "IsApplicationEntityMovable"},
|
||||||
|
{9, nullptr, "MoveApplicationEntity"},
|
||||||
|
{11, nullptr, "CalculateApplicationOccupiedSize"},
|
||||||
|
{16, nullptr, "PushApplicationRecord"},
|
||||||
|
{17, nullptr, "ListApplicationRecordContentMeta"},
|
||||||
|
{19, nullptr, "LaunchApplicationOld"},
|
||||||
|
{21, nullptr, "GetApplicationContentPath"},
|
||||||
|
{22, nullptr, "TerminateApplication"},
|
||||||
|
{23, nullptr, "ResolveApplicationContentPath"},
|
||||||
|
{26, nullptr, "BeginInstallApplication"},
|
||||||
|
{27, nullptr, "DeleteApplicationRecord"},
|
||||||
|
{30, nullptr, "RequestApplicationUpdateInfo"},
|
||||||
|
{31, nullptr, "Unknown31"},
|
||||||
|
{32, nullptr, "CancelApplicationDownload"},
|
||||||
|
{33, nullptr, "ResumeApplicationDownload"},
|
||||||
|
{35, nullptr, "UpdateVersionList"},
|
||||||
|
{36, nullptr, "PushLaunchVersion"},
|
||||||
|
{37, nullptr, "ListRequiredVersion"},
|
||||||
|
{38, D<&IApplicationManagerInterface::CheckApplicationLaunchVersion>, "CheckApplicationLaunchVersion"},
|
||||||
|
{39, nullptr, "CheckApplicationLaunchRights"},
|
||||||
|
{40, nullptr, "GetApplicationLogoData"},
|
||||||
|
{41, nullptr, "CalculateApplicationDownloadRequiredSize"},
|
||||||
|
{42, nullptr, "CleanupSdCard"},
|
||||||
|
{43, D<&IApplicationManagerInterface::CheckSdCardMountStatus>, "CheckSdCardMountStatus"},
|
||||||
|
{44, D<&IApplicationManagerInterface::GetSdCardMountStatusChangedEvent>, "GetSdCardMountStatusChangedEvent"},
|
||||||
|
{45, nullptr, "GetGameCardAttachmentEvent"},
|
||||||
|
{46, nullptr, "GetGameCardAttachmentInfo"},
|
||||||
|
{47, nullptr, "GetTotalSpaceSize"},
|
||||||
|
{48, D<&IApplicationManagerInterface::GetFreeSpaceSize>, "GetFreeSpaceSize"},
|
||||||
|
{49, nullptr, "GetSdCardRemovedEvent"},
|
||||||
|
{52, D<&IApplicationManagerInterface::GetGameCardUpdateDetectionEvent>, "GetGameCardUpdateDetectionEvent"},
|
||||||
|
{53, nullptr, "DisableApplicationAutoDelete"},
|
||||||
|
{54, nullptr, "EnableApplicationAutoDelete"},
|
||||||
|
{55, D<&IApplicationManagerInterface::GetApplicationDesiredLanguage>, "GetApplicationDesiredLanguage"},
|
||||||
|
{56, nullptr, "SetApplicationTerminateResult"},
|
||||||
|
{57, nullptr, "ClearApplicationTerminateResult"},
|
||||||
|
{58, nullptr, "GetLastSdCardMountUnexpectedResult"},
|
||||||
|
{59, D<&IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode>, "ConvertApplicationLanguageToLanguageCode"},
|
||||||
|
{60, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
|
||||||
|
{61, nullptr, "GetBackgroundDownloadStressTaskInfo"},
|
||||||
|
{62, nullptr, "GetGameCardStopper"},
|
||||||
|
{63, nullptr, "IsSystemProgramInstalled"},
|
||||||
|
{64, nullptr, "StartApplyDeltaTask"},
|
||||||
|
{65, nullptr, "GetRequestServerStopper"},
|
||||||
|
{66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
|
||||||
|
{67, nullptr, "CancelApplicationApplyDelta"},
|
||||||
|
{68, nullptr, "ResumeApplicationApplyDelta"},
|
||||||
|
{69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"},
|
||||||
|
{70, D<&IApplicationManagerInterface::ResumeAll>, "ResumeAll"},
|
||||||
|
{71, D<&IApplicationManagerInterface::GetStorageSize>, "GetStorageSize"},
|
||||||
|
{80, nullptr, "RequestDownloadApplication"},
|
||||||
|
{81, nullptr, "RequestDownloadAddOnContent"},
|
||||||
|
{82, nullptr, "DownloadApplication"},
|
||||||
|
{83, nullptr, "CheckApplicationResumeRights"},
|
||||||
|
{84, nullptr, "GetDynamicCommitEvent"},
|
||||||
|
{85, nullptr, "RequestUpdateApplication2"},
|
||||||
|
{86, nullptr, "EnableApplicationCrashReport"},
|
||||||
|
{87, nullptr, "IsApplicationCrashReportEnabled"},
|
||||||
|
{90, nullptr, "BoostSystemMemoryResourceLimit"},
|
||||||
|
{91, nullptr, "DeprecatedLaunchApplication"},
|
||||||
|
{92, nullptr, "GetRunningApplicationProgramId"},
|
||||||
|
{93, nullptr, "GetMainApplicationProgramIndex"},
|
||||||
|
{94, nullptr, "LaunchApplication"},
|
||||||
|
{95, nullptr, "GetApplicationLaunchInfo"},
|
||||||
|
{96, nullptr, "AcquireApplicationLaunchInfo"},
|
||||||
|
{97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"},
|
||||||
|
{98, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
|
||||||
|
{99, nullptr, "LaunchDevMenu"},
|
||||||
|
{100, nullptr, "ResetToFactorySettings"},
|
||||||
|
{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
|
||||||
|
{102, nullptr, "ResetToFactorySettingsForRefurbishment"},
|
||||||
|
{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
|
||||||
|
{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
|
||||||
|
{105, nullptr, "RequestResetToFactorySettingsSecurely"},
|
||||||
|
{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
|
||||||
|
{200, nullptr, "CalculateUserSaveDataStatistics"},
|
||||||
|
{201, nullptr, "DeleteUserSaveDataAll"},
|
||||||
|
{210, nullptr, "DeleteUserSystemSaveData"},
|
||||||
|
{211, nullptr, "DeleteSaveData"},
|
||||||
|
{220, nullptr, "UnregisterNetworkServiceAccount"},
|
||||||
|
{221, nullptr, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"},
|
||||||
|
{300, nullptr, "GetApplicationShellEvent"},
|
||||||
|
{301, nullptr, "PopApplicationShellEventInfo"},
|
||||||
|
{302, nullptr, "LaunchLibraryApplet"},
|
||||||
|
{303, nullptr, "TerminateLibraryApplet"},
|
||||||
|
{304, nullptr, "LaunchSystemApplet"},
|
||||||
|
{305, nullptr, "TerminateSystemApplet"},
|
||||||
|
{306, nullptr, "LaunchOverlayApplet"},
|
||||||
|
{307, nullptr, "TerminateOverlayApplet"},
|
||||||
|
{400, D<&IApplicationManagerInterface::GetApplicationControlData>, "GetApplicationControlData"},
|
||||||
|
{401, nullptr, "InvalidateAllApplicationControlCache"},
|
||||||
|
{402, nullptr, "RequestDownloadApplicationControlData"},
|
||||||
|
{403, nullptr, "GetMaxApplicationControlCacheCount"},
|
||||||
|
{404, nullptr, "InvalidateApplicationControlCache"},
|
||||||
|
{405, nullptr, "ListApplicationControlCacheEntryInfo"},
|
||||||
|
{406, nullptr, "GetApplicationControlProperty"},
|
||||||
|
{407, nullptr, "ListApplicationTitle"},
|
||||||
|
{408, nullptr, "ListApplicationIcon"},
|
||||||
|
{502, nullptr, "RequestCheckGameCardRegistration"},
|
||||||
|
{503, nullptr, "RequestGameCardRegistrationGoldPoint"},
|
||||||
|
{504, nullptr, "RequestRegisterGameCard"},
|
||||||
|
{505, D<&IApplicationManagerInterface::GetGameCardMountFailureEvent>, "GetGameCardMountFailureEvent"},
|
||||||
|
{506, nullptr, "IsGameCardInserted"},
|
||||||
|
{507, nullptr, "EnsureGameCardAccess"},
|
||||||
|
{508, nullptr, "GetLastGameCardMountFailureResult"},
|
||||||
|
{509, nullptr, "ListApplicationIdOnGameCard"},
|
||||||
|
{510, nullptr, "GetGameCardPlatformRegion"},
|
||||||
|
{600, nullptr, "CountApplicationContentMeta"},
|
||||||
|
{601, nullptr, "ListApplicationContentMetaStatus"},
|
||||||
|
{602, nullptr, "ListAvailableAddOnContent"},
|
||||||
|
{603, nullptr, "GetOwnedApplicationContentMetaStatus"},
|
||||||
|
{604, nullptr, "RegisterContentsExternalKey"},
|
||||||
|
{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
|
||||||
|
{606, nullptr, "GetContentMetaStorage"},
|
||||||
|
{607, nullptr, "ListAvailableAddOnContent"},
|
||||||
|
{609, nullptr, "ListAvailabilityAssuredAddOnContent"},
|
||||||
|
{610, nullptr, "GetInstalledContentMetaStorage"},
|
||||||
|
{611, nullptr, "PrepareAddOnContent"},
|
||||||
|
{700, nullptr, "PushDownloadTaskList"},
|
||||||
|
{701, nullptr, "ClearTaskStatusList"},
|
||||||
|
{702, nullptr, "RequestDownloadTaskList"},
|
||||||
|
{703, nullptr, "RequestEnsureDownloadTask"},
|
||||||
|
{704, nullptr, "ListDownloadTaskStatus"},
|
||||||
|
{705, nullptr, "RequestDownloadTaskListData"},
|
||||||
|
{800, nullptr, "RequestVersionList"},
|
||||||
|
{801, nullptr, "ListVersionList"},
|
||||||
|
{802, nullptr, "RequestVersionListData"},
|
||||||
|
{900, nullptr, "GetApplicationRecord"},
|
||||||
|
{901, nullptr, "GetApplicationRecordProperty"},
|
||||||
|
{902, nullptr, "EnableApplicationAutoUpdate"},
|
||||||
|
{903, nullptr, "DisableApplicationAutoUpdate"},
|
||||||
|
{904, nullptr, "TouchApplication"},
|
||||||
|
{905, nullptr, "RequestApplicationUpdate"},
|
||||||
|
{906, D<&IApplicationManagerInterface::IsApplicationUpdateRequested>, "IsApplicationUpdateRequested"},
|
||||||
|
{907, nullptr, "WithdrawApplicationUpdateRequest"},
|
||||||
|
{908, nullptr, "ListApplicationRecordInstalledContentMeta"},
|
||||||
|
{909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"},
|
||||||
|
{910, nullptr, "HasApplicationRecord"},
|
||||||
|
{911, nullptr, "SetPreInstalledApplication"},
|
||||||
|
{912, nullptr, "ClearPreInstalledApplicationFlag"},
|
||||||
|
{913, nullptr, "ListAllApplicationRecord"},
|
||||||
|
{914, nullptr, "HideApplicationRecord"},
|
||||||
|
{915, nullptr, "ShowApplicationRecord"},
|
||||||
|
{916, nullptr, "IsApplicationAutoDeleteDisabled"},
|
||||||
|
{1000, nullptr, "RequestVerifyApplicationDeprecated"},
|
||||||
|
{1001, nullptr, "CorruptApplicationForDebug"},
|
||||||
|
{1002, nullptr, "RequestVerifyAddOnContentsRights"},
|
||||||
|
{1003, nullptr, "RequestVerifyApplication"},
|
||||||
|
{1004, nullptr, "CorruptContentForDebug"},
|
||||||
|
{1200, nullptr, "NeedsUpdateVulnerability"},
|
||||||
|
{1300, D<&IApplicationManagerInterface::IsAnyApplicationEntityInstalled>, "IsAnyApplicationEntityInstalled"},
|
||||||
|
{1301, nullptr, "DeleteApplicationContentEntities"},
|
||||||
|
{1302, nullptr, "CleanupUnrecordedApplicationEntity"},
|
||||||
|
{1303, nullptr, "CleanupAddOnContentsWithNoRights"},
|
||||||
|
{1304, nullptr, "DeleteApplicationContentEntity"},
|
||||||
|
{1305, nullptr, "TryDeleteRunningApplicationEntity"},
|
||||||
|
{1306, nullptr, "TryDeleteRunningApplicationCompletely"},
|
||||||
|
{1307, nullptr, "TryDeleteRunningApplicationContentEntities"},
|
||||||
|
{1308, nullptr, "DeleteApplicationCompletelyForDebug"},
|
||||||
|
{1309, nullptr, "CleanupUnavailableAddOnContents"},
|
||||||
|
{1310, nullptr, "RequestMoveApplicationEntity"},
|
||||||
|
{1311, nullptr, "EstimateSizeToMove"},
|
||||||
|
{1312, nullptr, "HasMovableEntity"},
|
||||||
|
{1313, nullptr, "CleanupOrphanContents"},
|
||||||
|
{1314, nullptr, "CheckPreconditionSatisfiedToMove"},
|
||||||
|
{1400, nullptr, "PrepareShutdown"},
|
||||||
|
{1500, nullptr, "FormatSdCard"},
|
||||||
|
{1501, nullptr, "NeedsSystemUpdateToFormatSdCard"},
|
||||||
|
{1502, nullptr, "GetLastSdCardFormatUnexpectedResult"},
|
||||||
|
{1504, nullptr, "InsertSdCard"},
|
||||||
|
{1505, nullptr, "RemoveSdCard"},
|
||||||
|
{1506, nullptr, "GetSdCardStartupStatus"},
|
||||||
|
{1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
|
||||||
|
{1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
|
||||||
|
{1700, nullptr, "ListApplicationDownloadingContentMeta"},
|
||||||
|
{1701, D<&IApplicationManagerInterface::GetApplicationView>, "GetApplicationView"},
|
||||||
|
{1702, nullptr, "GetApplicationDownloadTaskStatus"},
|
||||||
|
{1703, nullptr, "GetApplicationViewDownloadErrorContext"},
|
||||||
|
{1704, D<&IApplicationManagerInterface::GetApplicationViewWithPromotionInfo>, "GetApplicationViewWithPromotionInfo"},
|
||||||
|
{1705, nullptr, "IsPatchAutoDeletableApplication"},
|
||||||
|
{1800, nullptr, "IsNotificationSetupCompleted"},
|
||||||
|
{1801, nullptr, "GetLastNotificationInfoCount"},
|
||||||
|
{1802, nullptr, "ListLastNotificationInfo"},
|
||||||
|
{1803, nullptr, "ListNotificationTask"},
|
||||||
|
{1900, nullptr, "IsActiveAccount"},
|
||||||
|
{1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"},
|
||||||
|
{1902, nullptr, "GetApplicationTicketInfo"},
|
||||||
|
{1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"},
|
||||||
|
{2000, nullptr, "GetSystemDeliveryInfo"},
|
||||||
|
{2001, nullptr, "SelectLatestSystemDeliveryInfo"},
|
||||||
|
{2002, nullptr, "VerifyDeliveryProtocolVersion"},
|
||||||
|
{2003, nullptr, "GetApplicationDeliveryInfo"},
|
||||||
|
{2004, nullptr, "HasAllContentsToDeliver"},
|
||||||
|
{2005, nullptr, "CompareApplicationDeliveryInfo"},
|
||||||
|
{2006, nullptr, "CanDeliverApplication"},
|
||||||
|
{2007, nullptr, "ListContentMetaKeyToDeliverApplication"},
|
||||||
|
{2008, nullptr, "NeedsSystemUpdateToDeliverApplication"},
|
||||||
|
{2009, nullptr, "EstimateRequiredSize"},
|
||||||
|
{2010, nullptr, "RequestReceiveApplication"},
|
||||||
|
{2011, nullptr, "CommitReceiveApplication"},
|
||||||
|
{2012, nullptr, "GetReceiveApplicationProgress"},
|
||||||
|
{2013, nullptr, "RequestSendApplication"},
|
||||||
|
{2014, nullptr, "GetSendApplicationProgress"},
|
||||||
|
{2015, nullptr, "CompareSystemDeliveryInfo"},
|
||||||
|
{2016, nullptr, "ListNotCommittedContentMeta"},
|
||||||
|
{2017, nullptr, "CreateDownloadTask"},
|
||||||
|
{2018, nullptr, "GetApplicationDeliveryInfoHash"},
|
||||||
|
{2050, D<&IApplicationManagerInterface::GetApplicationRightsOnClient>, "GetApplicationRightsOnClient"},
|
||||||
|
{2051, nullptr, "InvalidateRightsIdCache"},
|
||||||
|
{2100, D<&IApplicationManagerInterface::GetApplicationTerminateResult>, "GetApplicationTerminateResult"},
|
||||||
|
{2101, nullptr, "GetRawApplicationTerminateResult"},
|
||||||
|
{2150, nullptr, "CreateRightsEnvironment"},
|
||||||
|
{2151, nullptr, "DestroyRightsEnvironment"},
|
||||||
|
{2152, nullptr, "ActivateRightsEnvironment"},
|
||||||
|
{2153, nullptr, "DeactivateRightsEnvironment"},
|
||||||
|
{2154, nullptr, "ForceActivateRightsContextForExit"},
|
||||||
|
{2155, nullptr, "UpdateRightsEnvironmentStatus"},
|
||||||
|
{2156, nullptr, "CreateRightsEnvironmentForMicroApplication"},
|
||||||
|
{2160, nullptr, "AddTargetApplicationToRightsEnvironment"},
|
||||||
|
{2161, nullptr, "SetUsersToRightsEnvironment"},
|
||||||
|
{2170, nullptr, "GetRightsEnvironmentStatus"},
|
||||||
|
{2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"},
|
||||||
|
{2180, nullptr, "RequestExtendRightsInRightsEnvironment"},
|
||||||
|
{2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"},
|
||||||
|
{2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"},
|
||||||
|
{2190, nullptr, "GetRightsEnvironmentHandleForApplication"},
|
||||||
|
{2199, nullptr, "GetRightsEnvironmentCountForDebug"},
|
||||||
|
{2200, nullptr, "GetGameCardApplicationCopyIdentifier"},
|
||||||
|
{2201, nullptr, "GetInstalledApplicationCopyIdentifier"},
|
||||||
|
{2250, nullptr, "RequestReportActiveELicence"},
|
||||||
|
{2300, nullptr, "ListEventLog"},
|
||||||
|
{2350, nullptr, "PerformAutoUpdateByApplicationId"},
|
||||||
|
{2351, nullptr, "RequestNoDownloadRightsErrorResolution"},
|
||||||
|
{2352, nullptr, "RequestResolveNoDownloadRightsError"},
|
||||||
|
{2353, nullptr, "GetApplicationDownloadTaskInfo"},
|
||||||
|
{2354, nullptr, "PrioritizeApplicationBackgroundTask"},
|
||||||
|
{2355, nullptr, "PreferStorageEfficientUpdate"},
|
||||||
|
{2356, nullptr, "RequestStorageEfficientUpdatePreferable"},
|
||||||
|
{2357, nullptr, "EnableMultiCoreDownload"},
|
||||||
|
{2358, nullptr, "DisableMultiCoreDownload"},
|
||||||
|
{2359, nullptr, "IsMultiCoreDownloadEnabled"},
|
||||||
|
{2400, nullptr, "GetPromotionInfo"},
|
||||||
|
{2401, nullptr, "CountPromotionInfo"},
|
||||||
|
{2402, nullptr, "ListPromotionInfo"},
|
||||||
|
{2403, nullptr, "ImportPromotionJsonForDebug"},
|
||||||
|
{2404, nullptr, "ClearPromotionInfoForDebug"},
|
||||||
|
{2500, nullptr, "ConfirmAvailableTime"},
|
||||||
|
{2510, nullptr, "CreateApplicationResource"},
|
||||||
|
{2511, nullptr, "GetApplicationResource"},
|
||||||
|
{2513, nullptr, "LaunchMicroApplication"},
|
||||||
|
{2514, nullptr, "ClearTaskOfAsyncTaskManager"},
|
||||||
|
{2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"},
|
||||||
|
{2516, nullptr, "EnsureApplicationCertificate"},
|
||||||
|
{2517, nullptr, "CreateApplicationInstance"},
|
||||||
|
{2518, nullptr, "UpdateQualificationForDebug"},
|
||||||
|
{2519, nullptr, "IsQualificationTransitionSupported"},
|
||||||
|
{2520, nullptr, "IsQualificationTransitionSupportedByProcessId"},
|
||||||
|
{2521, nullptr, "GetRightsUserChangedEvent"},
|
||||||
|
{2522, nullptr, "IsRomRedirectionAvailable"},
|
||||||
|
{2800, nullptr, "GetApplicationIdOfPreomia"},
|
||||||
|
{3000, nullptr, "RegisterDeviceLockKey"},
|
||||||
|
{3001, nullptr, "UnregisterDeviceLockKey"},
|
||||||
|
{3002, nullptr, "VerifyDeviceLockKey"},
|
||||||
|
{3003, nullptr, "HideApplicationIcon"},
|
||||||
|
{3004, nullptr, "ShowApplicationIcon"},
|
||||||
|
{3005, nullptr, "HideApplicationTitle"},
|
||||||
|
{3006, nullptr, "ShowApplicationTitle"},
|
||||||
|
{3007, nullptr, "EnableGameCard"},
|
||||||
|
{3008, nullptr, "DisableGameCard"},
|
||||||
|
{3009, nullptr, "EnableLocalContentShare"},
|
||||||
|
{3010, nullptr, "DisableLocalContentShare"},
|
||||||
|
{3011, nullptr, "IsApplicationIconHidden"},
|
||||||
|
{3012, nullptr, "IsApplicationTitleHidden"},
|
||||||
|
{3013, nullptr, "IsGameCardEnabled"},
|
||||||
|
{3014, nullptr, "IsLocalContentShareEnabled"},
|
||||||
|
{3050, nullptr, "ListAssignELicenseTaskResult"},
|
||||||
|
{9999, nullptr, "GetApplicationCertificate"},
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
}
|
||||||
|
|
||||||
|
IApplicationManagerInterface::~IApplicationManagerInterface() = default;
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetApplicationControlData(
|
||||||
|
OutBuffer<BufferAttr_HipcMapAlias> out_buffer, Out<u32> out_actual_size,
|
||||||
|
ApplicationControlSource application_control_source, u64 application_id) {
|
||||||
|
LOG_DEBUG(Service_NS, "called");
|
||||||
|
R_RETURN(IReadOnlyApplicationControlDataInterface(system).GetApplicationControlData(
|
||||||
|
out_buffer, out_actual_size, application_control_source, application_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetApplicationDesiredLanguage(
|
||||||
|
Out<ApplicationLanguage> out_desired_language, u32 supported_languages) {
|
||||||
|
LOG_DEBUG(Service_NS, "called");
|
||||||
|
R_RETURN(IReadOnlyApplicationControlDataInterface(system).GetApplicationDesiredLanguage(
|
||||||
|
out_desired_language, supported_languages));
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode(
|
||||||
|
Out<u64> out_language_code, ApplicationLanguage application_language) {
|
||||||
|
LOG_DEBUG(Service_NS, "called");
|
||||||
|
R_RETURN(
|
||||||
|
IReadOnlyApplicationControlDataInterface(system).ConvertApplicationLanguageToLanguageCode(
|
||||||
|
out_language_code, application_language));
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::ListApplicationRecord(
|
||||||
|
OutArray<ApplicationRecord, BufferAttr_HipcMapAlias> out_records, Out<s32> out_count,
|
||||||
|
s32 offset) {
|
||||||
|
const auto limit = out_records.size();
|
||||||
|
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called");
|
||||||
|
const auto& cache = system.GetContentProviderUnion();
|
||||||
|
const auto installed_games = cache.ListEntriesFilterOrigin(
|
||||||
|
std::nullopt, FileSys::TitleType::Application, FileSys::ContentRecordType::Program);
|
||||||
|
|
||||||
|
size_t i = 0;
|
||||||
|
u8 ii = 24;
|
||||||
|
|
||||||
|
for (const auto& [slot, game] : installed_games) {
|
||||||
|
if (i >= limit) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (game.title_id == 0 || game.title_id < 0x0100000000001FFFull) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (offset > 0) {
|
||||||
|
offset--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplicationRecord record{};
|
||||||
|
record.application_id = game.title_id;
|
||||||
|
record.type = ApplicationRecordType::Installed;
|
||||||
|
record.unknown = 0; // 2 = needs update
|
||||||
|
record.unknown2 = ii++;
|
||||||
|
|
||||||
|
out_records[i++] = record;
|
||||||
|
}
|
||||||
|
|
||||||
|
*out_count = static_cast<s32>(i);
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetApplicationRecordUpdateSystemEvent(
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called");
|
||||||
|
|
||||||
|
record_update_system_event.Signal();
|
||||||
|
*out_event = record_update_system_event.GetHandle();
|
||||||
|
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetGameCardMountFailureEvent(
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called");
|
||||||
|
*out_event = gamecard_mount_failure_event.GetHandle();
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::IsAnyApplicationEntityInstalled(
|
||||||
|
Out<bool> out_is_any_application_entity_installed) {
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called");
|
||||||
|
*out_is_any_application_entity_installed = true;
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetApplicationView(
|
||||||
|
OutArray<ApplicationView, BufferAttr_HipcMapAlias> out_application_views,
|
||||||
|
InArray<u64, BufferAttr_HipcMapAlias> application_ids) {
|
||||||
|
const auto size = std::min(out_application_views.size(), application_ids.size());
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called, size={}", application_ids.size());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < size; i++) {
|
||||||
|
ApplicationView view{};
|
||||||
|
view.application_id = application_ids[i];
|
||||||
|
view.unk = 0x70000;
|
||||||
|
view.flags = 0x401f17;
|
||||||
|
|
||||||
|
out_application_views[i] = view;
|
||||||
|
}
|
||||||
|
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetApplicationViewWithPromotionInfo(
|
||||||
|
OutArray<ApplicationViewWithPromotionInfo, BufferAttr_HipcMapAlias> out_application_views,
|
||||||
|
InArray<u64, BufferAttr_HipcMapAlias> application_ids) {
|
||||||
|
const auto size = std::min(out_application_views.size(), application_ids.size());
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called, size={}", application_ids.size());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < size; i++) {
|
||||||
|
ApplicationViewWithPromotionInfo view{};
|
||||||
|
view.view.application_id = application_ids[i];
|
||||||
|
view.view.unk = 0x70000;
|
||||||
|
view.view.flags = 0x401f17;
|
||||||
|
view.promotion = {};
|
||||||
|
|
||||||
|
out_application_views[i] = view;
|
||||||
|
}
|
||||||
|
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetApplicationRightsOnClient(
|
||||||
|
OutArray<ApplicationRightsOnClient, BufferAttr_HipcMapAlias> out_rights, Out<u32> out_count,
|
||||||
|
Common::UUID account_id, u32 flags, u64 application_id) {
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called, flags={}, application_id={:016X}, account_id={}",
|
||||||
|
flags, application_id, account_id.FormattedString());
|
||||||
|
|
||||||
|
if (!out_rights.empty()) {
|
||||||
|
out_rights[0] = {
|
||||||
|
.application_id = application_id,
|
||||||
|
.uid = account_id,
|
||||||
|
.flags = 0,
|
||||||
|
.flags2 = 0,
|
||||||
|
};
|
||||||
|
*out_count = 1;
|
||||||
|
} else {
|
||||||
|
*out_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::CheckSdCardMountStatus() {
|
||||||
|
LOG_DEBUG(Service_NS, "called");
|
||||||
|
R_RETURN(IContentManagementInterface(system).CheckSdCardMountStatus());
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetSdCardMountStatusChangedEvent(
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called");
|
||||||
|
*out_event = sd_card_mount_status_event.GetHandle();
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetFreeSpaceSize(Out<s64> out_free_space_size,
|
||||||
|
FileSys::StorageId storage_id) {
|
||||||
|
LOG_DEBUG(Service_NS, "called");
|
||||||
|
R_RETURN(IContentManagementInterface(system).GetFreeSpaceSize(out_free_space_size, storage_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetGameCardUpdateDetectionEvent(
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called");
|
||||||
|
*out_event = gamecard_update_detection_event.GetHandle();
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::ResumeAll() {
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called");
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetStorageSize(Out<s64> out_total_space_size,
|
||||||
|
Out<s64> out_free_space_size,
|
||||||
|
FileSys::StorageId storage_id) {
|
||||||
|
LOG_INFO(Service_NS, "called, storage_id={}", storage_id);
|
||||||
|
*out_total_space_size = system.GetFileSystemController().GetTotalSpaceSize(storage_id);
|
||||||
|
*out_free_space_size = system.GetFileSystemController().GetFreeSpaceSize(storage_id);
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::IsApplicationUpdateRequested(Out<bool> out_update_required,
|
||||||
|
Out<u32> out_update_version,
|
||||||
|
u64 application_id) {
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called. application_id={:016X}", application_id);
|
||||||
|
*out_update_required = false;
|
||||||
|
*out_update_version = 0;
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::CheckApplicationLaunchVersion(u64 application_id) {
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called. application_id={:016X}", application_id);
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IApplicationManagerInterface::GetApplicationTerminateResult(Out<Result> out_result,
|
||||||
|
u64 application_id) {
|
||||||
|
LOG_WARNING(Service_NS, "(STUBBED) called. application_id={:016X}", application_id);
|
||||||
|
*out_result = ResultSuccess;
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Service::NS
|
62
src/core/hle/service/ns/application_manager_interface.h
Normal file
62
src/core/hle/service/ns/application_manager_interface.h
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "core/hle/service/cmif_types.h"
|
||||||
|
#include "core/hle/service/ns/language.h"
|
||||||
|
#include "core/hle/service/ns/ns_types.h"
|
||||||
|
#include "core/hle/service/os/event.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Service::NS {
|
||||||
|
|
||||||
|
class IApplicationManagerInterface final : public ServiceFramework<IApplicationManagerInterface> {
|
||||||
|
public:
|
||||||
|
explicit IApplicationManagerInterface(Core::System& system_);
|
||||||
|
~IApplicationManagerInterface() override;
|
||||||
|
|
||||||
|
Result GetApplicationControlData(OutBuffer<BufferAttr_HipcMapAlias> out_buffer,
|
||||||
|
Out<u32> out_actual_size,
|
||||||
|
ApplicationControlSource application_control_source,
|
||||||
|
u64 application_id);
|
||||||
|
Result GetApplicationDesiredLanguage(Out<ApplicationLanguage> out_desired_language,
|
||||||
|
u32 supported_languages);
|
||||||
|
Result ConvertApplicationLanguageToLanguageCode(Out<u64> out_language_code,
|
||||||
|
ApplicationLanguage application_language);
|
||||||
|
Result ListApplicationRecord(OutArray<ApplicationRecord, BufferAttr_HipcMapAlias> out_records,
|
||||||
|
Out<s32> out_count, s32 offset);
|
||||||
|
Result GetApplicationRecordUpdateSystemEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||||
|
Result GetGameCardMountFailureEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||||
|
Result IsAnyApplicationEntityInstalled(Out<bool> out_is_any_application_entity_installed);
|
||||||
|
Result GetApplicationView(
|
||||||
|
OutArray<ApplicationView, BufferAttr_HipcMapAlias> out_application_views,
|
||||||
|
InArray<u64, BufferAttr_HipcMapAlias> application_ids);
|
||||||
|
Result GetApplicationViewWithPromotionInfo(
|
||||||
|
OutArray<ApplicationViewWithPromotionInfo, BufferAttr_HipcMapAlias> out_application_views,
|
||||||
|
InArray<u64, BufferAttr_HipcMapAlias> application_ids);
|
||||||
|
Result GetApplicationRightsOnClient(
|
||||||
|
OutArray<ApplicationRightsOnClient, BufferAttr_HipcMapAlias> out_rights, Out<u32> out_count,
|
||||||
|
Common::UUID account_id, u32 flags, u64 application_id);
|
||||||
|
Result CheckSdCardMountStatus();
|
||||||
|
Result GetSdCardMountStatusChangedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||||
|
Result GetFreeSpaceSize(Out<s64> out_free_space_size, FileSys::StorageId storage_id);
|
||||||
|
Result GetGameCardUpdateDetectionEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||||
|
Result ResumeAll();
|
||||||
|
Result GetStorageSize(Out<s64> out_total_space_size, Out<s64> out_free_space_size,
|
||||||
|
FileSys::StorageId storage_id);
|
||||||
|
Result IsApplicationUpdateRequested(Out<bool> out_update_required, Out<u32> out_update_version,
|
||||||
|
u64 application_id);
|
||||||
|
Result CheckApplicationLaunchVersion(u64 application_id);
|
||||||
|
Result GetApplicationTerminateResult(Out<Result> out_result, u64 application_id);
|
||||||
|
|
||||||
|
private:
|
||||||
|
KernelHelpers::ServiceContext service_context;
|
||||||
|
Event record_update_system_event;
|
||||||
|
Event sd_card_mount_status_event;
|
||||||
|
Event gamecard_update_detection_event;
|
||||||
|
Event gamecard_mount_status_event;
|
||||||
|
Event gamecard_mount_failure_event;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Service::NS
|
|
@ -14,7 +14,7 @@ public:
|
||||||
explicit IContentManagementInterface(Core::System& system_);
|
explicit IContentManagementInterface(Core::System& system_);
|
||||||
~IContentManagementInterface() override;
|
~IContentManagementInterface() override;
|
||||||
|
|
||||||
private:
|
public:
|
||||||
Result CalculateApplicationOccupiedSize(Out<ApplicationOccupiedSize> out_size,
|
Result CalculateApplicationOccupiedSize(Out<ApplicationOccupiedSize> out_size,
|
||||||
u64 application_id);
|
u64 application_id);
|
||||||
Result CheckSdCardMountStatus();
|
Result CheckSdCardMountStatus();
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "core/hle/service/glue/glue_manager.h"
|
#include "core/hle/service/glue/glue_manager.h"
|
||||||
#include "core/hle/service/ipc_helpers.h"
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
#include "core/hle/service/ns/account_proxy_interface.h"
|
#include "core/hle/service/ns/account_proxy_interface.h"
|
||||||
|
#include "core/hle/service/ns/application_manager_interface.h"
|
||||||
#include "core/hle/service/ns/application_version_interface.h"
|
#include "core/hle/service/ns/application_version_interface.h"
|
||||||
#include "core/hle/service/ns/content_management_interface.h"
|
#include "core/hle/service/ns/content_management_interface.h"
|
||||||
#include "core/hle/service/ns/develop_interface.h"
|
#include "core/hle/service/ns/develop_interface.h"
|
||||||
|
@ -35,445 +36,6 @@
|
||||||
|
|
||||||
namespace Service::NS {
|
namespace Service::NS {
|
||||||
|
|
||||||
IApplicationManagerInterface::IApplicationManagerInterface(Core::System& system_)
|
|
||||||
: ServiceFramework{system_, "IApplicationManagerInterface"} {
|
|
||||||
// clang-format off
|
|
||||||
static const FunctionInfo functions[] = {
|
|
||||||
{0, nullptr, "ListApplicationRecord"},
|
|
||||||
{1, nullptr, "GenerateApplicationRecordCount"},
|
|
||||||
{2, nullptr, "GetApplicationRecordUpdateSystemEvent"},
|
|
||||||
{3, nullptr, "GetApplicationViewDeprecated"},
|
|
||||||
{4, nullptr, "DeleteApplicationEntity"},
|
|
||||||
{5, nullptr, "DeleteApplicationCompletely"},
|
|
||||||
{6, nullptr, "IsAnyApplicationEntityRedundant"},
|
|
||||||
{7, nullptr, "DeleteRedundantApplicationEntity"},
|
|
||||||
{8, nullptr, "IsApplicationEntityMovable"},
|
|
||||||
{9, nullptr, "MoveApplicationEntity"},
|
|
||||||
{11, nullptr, "CalculateApplicationOccupiedSize"},
|
|
||||||
{16, nullptr, "PushApplicationRecord"},
|
|
||||||
{17, nullptr, "ListApplicationRecordContentMeta"},
|
|
||||||
{19, nullptr, "LaunchApplicationOld"},
|
|
||||||
{21, nullptr, "GetApplicationContentPath"},
|
|
||||||
{22, nullptr, "TerminateApplication"},
|
|
||||||
{23, nullptr, "ResolveApplicationContentPath"},
|
|
||||||
{26, nullptr, "BeginInstallApplication"},
|
|
||||||
{27, nullptr, "DeleteApplicationRecord"},
|
|
||||||
{30, nullptr, "RequestApplicationUpdateInfo"},
|
|
||||||
{31, nullptr, "Unknown31"},
|
|
||||||
{32, nullptr, "CancelApplicationDownload"},
|
|
||||||
{33, nullptr, "ResumeApplicationDownload"},
|
|
||||||
{35, nullptr, "UpdateVersionList"},
|
|
||||||
{36, nullptr, "PushLaunchVersion"},
|
|
||||||
{37, nullptr, "ListRequiredVersion"},
|
|
||||||
{38, nullptr, "CheckApplicationLaunchVersion"},
|
|
||||||
{39, nullptr, "CheckApplicationLaunchRights"},
|
|
||||||
{40, nullptr, "GetApplicationLogoData"},
|
|
||||||
{41, nullptr, "CalculateApplicationDownloadRequiredSize"},
|
|
||||||
{42, nullptr, "CleanupSdCard"},
|
|
||||||
{43, nullptr, "CheckSdCardMountStatus"},
|
|
||||||
{44, nullptr, "GetSdCardMountStatusChangedEvent"},
|
|
||||||
{45, nullptr, "GetGameCardAttachmentEvent"},
|
|
||||||
{46, nullptr, "GetGameCardAttachmentInfo"},
|
|
||||||
{47, nullptr, "GetTotalSpaceSize"},
|
|
||||||
{48, nullptr, "GetFreeSpaceSize"},
|
|
||||||
{49, nullptr, "GetSdCardRemovedEvent"},
|
|
||||||
{52, nullptr, "GetGameCardUpdateDetectionEvent"},
|
|
||||||
{53, nullptr, "DisableApplicationAutoDelete"},
|
|
||||||
{54, nullptr, "EnableApplicationAutoDelete"},
|
|
||||||
{55, &IApplicationManagerInterface::GetApplicationDesiredLanguage, "GetApplicationDesiredLanguage"},
|
|
||||||
{56, nullptr, "SetApplicationTerminateResult"},
|
|
||||||
{57, nullptr, "ClearApplicationTerminateResult"},
|
|
||||||
{58, nullptr, "GetLastSdCardMountUnexpectedResult"},
|
|
||||||
{59, &IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode, "ConvertApplicationLanguageToLanguageCode"},
|
|
||||||
{60, nullptr, "ConvertLanguageCodeToApplicationLanguage"},
|
|
||||||
{61, nullptr, "GetBackgroundDownloadStressTaskInfo"},
|
|
||||||
{62, nullptr, "GetGameCardStopper"},
|
|
||||||
{63, nullptr, "IsSystemProgramInstalled"},
|
|
||||||
{64, nullptr, "StartApplyDeltaTask"},
|
|
||||||
{65, nullptr, "GetRequestServerStopper"},
|
|
||||||
{66, nullptr, "GetBackgroundApplyDeltaStressTaskInfo"},
|
|
||||||
{67, nullptr, "CancelApplicationApplyDelta"},
|
|
||||||
{68, nullptr, "ResumeApplicationApplyDelta"},
|
|
||||||
{69, nullptr, "CalculateApplicationApplyDeltaRequiredSize"},
|
|
||||||
{70, nullptr, "ResumeAll"},
|
|
||||||
{71, nullptr, "GetStorageSize"},
|
|
||||||
{80, nullptr, "RequestDownloadApplication"},
|
|
||||||
{81, nullptr, "RequestDownloadAddOnContent"},
|
|
||||||
{82, nullptr, "DownloadApplication"},
|
|
||||||
{83, nullptr, "CheckApplicationResumeRights"},
|
|
||||||
{84, nullptr, "GetDynamicCommitEvent"},
|
|
||||||
{85, nullptr, "RequestUpdateApplication2"},
|
|
||||||
{86, nullptr, "EnableApplicationCrashReport"},
|
|
||||||
{87, nullptr, "IsApplicationCrashReportEnabled"},
|
|
||||||
{90, nullptr, "BoostSystemMemoryResourceLimit"},
|
|
||||||
{91, nullptr, "DeprecatedLaunchApplication"},
|
|
||||||
{92, nullptr, "GetRunningApplicationProgramId"},
|
|
||||||
{93, nullptr, "GetMainApplicationProgramIndex"},
|
|
||||||
{94, nullptr, "LaunchApplication"},
|
|
||||||
{95, nullptr, "GetApplicationLaunchInfo"},
|
|
||||||
{96, nullptr, "AcquireApplicationLaunchInfo"},
|
|
||||||
{97, nullptr, "GetMainApplicationProgramIndexByApplicationLaunchInfo"},
|
|
||||||
{98, nullptr, "EnableApplicationAllThreadDumpOnCrash"},
|
|
||||||
{99, nullptr, "LaunchDevMenu"},
|
|
||||||
{100, nullptr, "ResetToFactorySettings"},
|
|
||||||
{101, nullptr, "ResetToFactorySettingsWithoutUserSaveData"},
|
|
||||||
{102, nullptr, "ResetToFactorySettingsForRefurbishment"},
|
|
||||||
{103, nullptr, "ResetToFactorySettingsWithPlatformRegion"},
|
|
||||||
{104, nullptr, "ResetToFactorySettingsWithPlatformRegionAuthentication"},
|
|
||||||
{105, nullptr, "RequestResetToFactorySettingsSecurely"},
|
|
||||||
{106, nullptr, "RequestResetToFactorySettingsWithPlatformRegionAuthenticationSecurely"},
|
|
||||||
{200, nullptr, "CalculateUserSaveDataStatistics"},
|
|
||||||
{201, nullptr, "DeleteUserSaveDataAll"},
|
|
||||||
{210, nullptr, "DeleteUserSystemSaveData"},
|
|
||||||
{211, nullptr, "DeleteSaveData"},
|
|
||||||
{220, nullptr, "UnregisterNetworkServiceAccount"},
|
|
||||||
{221, nullptr, "UnregisterNetworkServiceAccountWithUserSaveDataDeletion"},
|
|
||||||
{300, nullptr, "GetApplicationShellEvent"},
|
|
||||||
{301, nullptr, "PopApplicationShellEventInfo"},
|
|
||||||
{302, nullptr, "LaunchLibraryApplet"},
|
|
||||||
{303, nullptr, "TerminateLibraryApplet"},
|
|
||||||
{304, nullptr, "LaunchSystemApplet"},
|
|
||||||
{305, nullptr, "TerminateSystemApplet"},
|
|
||||||
{306, nullptr, "LaunchOverlayApplet"},
|
|
||||||
{307, nullptr, "TerminateOverlayApplet"},
|
|
||||||
{400, &IApplicationManagerInterface::GetApplicationControlData, "GetApplicationControlData"},
|
|
||||||
{401, nullptr, "InvalidateAllApplicationControlCache"},
|
|
||||||
{402, nullptr, "RequestDownloadApplicationControlData"},
|
|
||||||
{403, nullptr, "GetMaxApplicationControlCacheCount"},
|
|
||||||
{404, nullptr, "InvalidateApplicationControlCache"},
|
|
||||||
{405, nullptr, "ListApplicationControlCacheEntryInfo"},
|
|
||||||
{406, nullptr, "GetApplicationControlProperty"},
|
|
||||||
{407, nullptr, "ListApplicationTitle"},
|
|
||||||
{408, nullptr, "ListApplicationIcon"},
|
|
||||||
{502, nullptr, "RequestCheckGameCardRegistration"},
|
|
||||||
{503, nullptr, "RequestGameCardRegistrationGoldPoint"},
|
|
||||||
{504, nullptr, "RequestRegisterGameCard"},
|
|
||||||
{505, nullptr, "GetGameCardMountFailureEvent"},
|
|
||||||
{506, nullptr, "IsGameCardInserted"},
|
|
||||||
{507, nullptr, "EnsureGameCardAccess"},
|
|
||||||
{508, nullptr, "GetLastGameCardMountFailureResult"},
|
|
||||||
{509, nullptr, "ListApplicationIdOnGameCard"},
|
|
||||||
{510, nullptr, "GetGameCardPlatformRegion"},
|
|
||||||
{600, nullptr, "CountApplicationContentMeta"},
|
|
||||||
{601, nullptr, "ListApplicationContentMetaStatus"},
|
|
||||||
{602, nullptr, "ListAvailableAddOnContent"},
|
|
||||||
{603, nullptr, "GetOwnedApplicationContentMetaStatus"},
|
|
||||||
{604, nullptr, "RegisterContentsExternalKey"},
|
|
||||||
{605, nullptr, "ListApplicationContentMetaStatusWithRightsCheck"},
|
|
||||||
{606, nullptr, "GetContentMetaStorage"},
|
|
||||||
{607, nullptr, "ListAvailableAddOnContent"},
|
|
||||||
{609, nullptr, "ListAvailabilityAssuredAddOnContent"},
|
|
||||||
{610, nullptr, "GetInstalledContentMetaStorage"},
|
|
||||||
{611, nullptr, "PrepareAddOnContent"},
|
|
||||||
{700, nullptr, "PushDownloadTaskList"},
|
|
||||||
{701, nullptr, "ClearTaskStatusList"},
|
|
||||||
{702, nullptr, "RequestDownloadTaskList"},
|
|
||||||
{703, nullptr, "RequestEnsureDownloadTask"},
|
|
||||||
{704, nullptr, "ListDownloadTaskStatus"},
|
|
||||||
{705, nullptr, "RequestDownloadTaskListData"},
|
|
||||||
{800, nullptr, "RequestVersionList"},
|
|
||||||
{801, nullptr, "ListVersionList"},
|
|
||||||
{802, nullptr, "RequestVersionListData"},
|
|
||||||
{900, nullptr, "GetApplicationRecord"},
|
|
||||||
{901, nullptr, "GetApplicationRecordProperty"},
|
|
||||||
{902, nullptr, "EnableApplicationAutoUpdate"},
|
|
||||||
{903, nullptr, "DisableApplicationAutoUpdate"},
|
|
||||||
{904, nullptr, "TouchApplication"},
|
|
||||||
{905, nullptr, "RequestApplicationUpdate"},
|
|
||||||
{906, nullptr, "IsApplicationUpdateRequested"},
|
|
||||||
{907, nullptr, "WithdrawApplicationUpdateRequest"},
|
|
||||||
{908, nullptr, "ListApplicationRecordInstalledContentMeta"},
|
|
||||||
{909, nullptr, "WithdrawCleanupAddOnContentsWithNoRightsRecommendation"},
|
|
||||||
{910, nullptr, "HasApplicationRecord"},
|
|
||||||
{911, nullptr, "SetPreInstalledApplication"},
|
|
||||||
{912, nullptr, "ClearPreInstalledApplicationFlag"},
|
|
||||||
{913, nullptr, "ListAllApplicationRecord"},
|
|
||||||
{914, nullptr, "HideApplicationRecord"},
|
|
||||||
{915, nullptr, "ShowApplicationRecord"},
|
|
||||||
{916, nullptr, "IsApplicationAutoDeleteDisabled"},
|
|
||||||
{1000, nullptr, "RequestVerifyApplicationDeprecated"},
|
|
||||||
{1001, nullptr, "CorruptApplicationForDebug"},
|
|
||||||
{1002, nullptr, "RequestVerifyAddOnContentsRights"},
|
|
||||||
{1003, nullptr, "RequestVerifyApplication"},
|
|
||||||
{1004, nullptr, "CorruptContentForDebug"},
|
|
||||||
{1200, nullptr, "NeedsUpdateVulnerability"},
|
|
||||||
{1300, nullptr, "IsAnyApplicationEntityInstalled"},
|
|
||||||
{1301, nullptr, "DeleteApplicationContentEntities"},
|
|
||||||
{1302, nullptr, "CleanupUnrecordedApplicationEntity"},
|
|
||||||
{1303, nullptr, "CleanupAddOnContentsWithNoRights"},
|
|
||||||
{1304, nullptr, "DeleteApplicationContentEntity"},
|
|
||||||
{1305, nullptr, "TryDeleteRunningApplicationEntity"},
|
|
||||||
{1306, nullptr, "TryDeleteRunningApplicationCompletely"},
|
|
||||||
{1307, nullptr, "TryDeleteRunningApplicationContentEntities"},
|
|
||||||
{1308, nullptr, "DeleteApplicationCompletelyForDebug"},
|
|
||||||
{1309, nullptr, "CleanupUnavailableAddOnContents"},
|
|
||||||
{1310, nullptr, "RequestMoveApplicationEntity"},
|
|
||||||
{1311, nullptr, "EstimateSizeToMove"},
|
|
||||||
{1312, nullptr, "HasMovableEntity"},
|
|
||||||
{1313, nullptr, "CleanupOrphanContents"},
|
|
||||||
{1314, nullptr, "CheckPreconditionSatisfiedToMove"},
|
|
||||||
{1400, nullptr, "PrepareShutdown"},
|
|
||||||
{1500, nullptr, "FormatSdCard"},
|
|
||||||
{1501, nullptr, "NeedsSystemUpdateToFormatSdCard"},
|
|
||||||
{1502, nullptr, "GetLastSdCardFormatUnexpectedResult"},
|
|
||||||
{1504, nullptr, "InsertSdCard"},
|
|
||||||
{1505, nullptr, "RemoveSdCard"},
|
|
||||||
{1506, nullptr, "GetSdCardStartupStatus"},
|
|
||||||
{1600, nullptr, "GetSystemSeedForPseudoDeviceId"},
|
|
||||||
{1601, nullptr, "ResetSystemSeedForPseudoDeviceId"},
|
|
||||||
{1700, nullptr, "ListApplicationDownloadingContentMeta"},
|
|
||||||
{1701, nullptr, "GetApplicationView"},
|
|
||||||
{1702, nullptr, "GetApplicationDownloadTaskStatus"},
|
|
||||||
{1703, nullptr, "GetApplicationViewDownloadErrorContext"},
|
|
||||||
{1704, nullptr, "GetApplicationViewWithPromotionInfo"},
|
|
||||||
{1705, nullptr, "IsPatchAutoDeletableApplication"},
|
|
||||||
{1800, nullptr, "IsNotificationSetupCompleted"},
|
|
||||||
{1801, nullptr, "GetLastNotificationInfoCount"},
|
|
||||||
{1802, nullptr, "ListLastNotificationInfo"},
|
|
||||||
{1803, nullptr, "ListNotificationTask"},
|
|
||||||
{1900, nullptr, "IsActiveAccount"},
|
|
||||||
{1901, nullptr, "RequestDownloadApplicationPrepurchasedRights"},
|
|
||||||
{1902, nullptr, "GetApplicationTicketInfo"},
|
|
||||||
{1903, nullptr, "RequestDownloadApplicationPrepurchasedRightsForAccount"},
|
|
||||||
{2000, nullptr, "GetSystemDeliveryInfo"},
|
|
||||||
{2001, nullptr, "SelectLatestSystemDeliveryInfo"},
|
|
||||||
{2002, nullptr, "VerifyDeliveryProtocolVersion"},
|
|
||||||
{2003, nullptr, "GetApplicationDeliveryInfo"},
|
|
||||||
{2004, nullptr, "HasAllContentsToDeliver"},
|
|
||||||
{2005, nullptr, "CompareApplicationDeliveryInfo"},
|
|
||||||
{2006, nullptr, "CanDeliverApplication"},
|
|
||||||
{2007, nullptr, "ListContentMetaKeyToDeliverApplication"},
|
|
||||||
{2008, nullptr, "NeedsSystemUpdateToDeliverApplication"},
|
|
||||||
{2009, nullptr, "EstimateRequiredSize"},
|
|
||||||
{2010, nullptr, "RequestReceiveApplication"},
|
|
||||||
{2011, nullptr, "CommitReceiveApplication"},
|
|
||||||
{2012, nullptr, "GetReceiveApplicationProgress"},
|
|
||||||
{2013, nullptr, "RequestSendApplication"},
|
|
||||||
{2014, nullptr, "GetSendApplicationProgress"},
|
|
||||||
{2015, nullptr, "CompareSystemDeliveryInfo"},
|
|
||||||
{2016, nullptr, "ListNotCommittedContentMeta"},
|
|
||||||
{2017, nullptr, "CreateDownloadTask"},
|
|
||||||
{2018, nullptr, "GetApplicationDeliveryInfoHash"},
|
|
||||||
{2050, nullptr, "GetApplicationRightsOnClient"},
|
|
||||||
{2051, nullptr, "InvalidateRightsIdCache"},
|
|
||||||
{2100, nullptr, "GetApplicationTerminateResult"},
|
|
||||||
{2101, nullptr, "GetRawApplicationTerminateResult"},
|
|
||||||
{2150, nullptr, "CreateRightsEnvironment"},
|
|
||||||
{2151, nullptr, "DestroyRightsEnvironment"},
|
|
||||||
{2152, nullptr, "ActivateRightsEnvironment"},
|
|
||||||
{2153, nullptr, "DeactivateRightsEnvironment"},
|
|
||||||
{2154, nullptr, "ForceActivateRightsContextForExit"},
|
|
||||||
{2155, nullptr, "UpdateRightsEnvironmentStatus"},
|
|
||||||
{2156, nullptr, "CreateRightsEnvironmentForMicroApplication"},
|
|
||||||
{2160, nullptr, "AddTargetApplicationToRightsEnvironment"},
|
|
||||||
{2161, nullptr, "SetUsersToRightsEnvironment"},
|
|
||||||
{2170, nullptr, "GetRightsEnvironmentStatus"},
|
|
||||||
{2171, nullptr, "GetRightsEnvironmentStatusChangedEvent"},
|
|
||||||
{2180, nullptr, "RequestExtendRightsInRightsEnvironment"},
|
|
||||||
{2181, nullptr, "GetResultOfExtendRightsInRightsEnvironment"},
|
|
||||||
{2182, nullptr, "SetActiveRightsContextUsingStateToRightsEnvironment"},
|
|
||||||
{2190, nullptr, "GetRightsEnvironmentHandleForApplication"},
|
|
||||||
{2199, nullptr, "GetRightsEnvironmentCountForDebug"},
|
|
||||||
{2200, nullptr, "GetGameCardApplicationCopyIdentifier"},
|
|
||||||
{2201, nullptr, "GetInstalledApplicationCopyIdentifier"},
|
|
||||||
{2250, nullptr, "RequestReportActiveELicence"},
|
|
||||||
{2300, nullptr, "ListEventLog"},
|
|
||||||
{2350, nullptr, "PerformAutoUpdateByApplicationId"},
|
|
||||||
{2351, nullptr, "RequestNoDownloadRightsErrorResolution"},
|
|
||||||
{2352, nullptr, "RequestResolveNoDownloadRightsError"},
|
|
||||||
{2353, nullptr, "GetApplicationDownloadTaskInfo"},
|
|
||||||
{2354, nullptr, "PrioritizeApplicationBackgroundTask"},
|
|
||||||
{2355, nullptr, "PreferStorageEfficientUpdate"},
|
|
||||||
{2356, nullptr, "RequestStorageEfficientUpdatePreferable"},
|
|
||||||
{2357, nullptr, "EnableMultiCoreDownload"},
|
|
||||||
{2358, nullptr, "DisableMultiCoreDownload"},
|
|
||||||
{2359, nullptr, "IsMultiCoreDownloadEnabled"},
|
|
||||||
{2400, nullptr, "GetPromotionInfo"},
|
|
||||||
{2401, nullptr, "CountPromotionInfo"},
|
|
||||||
{2402, nullptr, "ListPromotionInfo"},
|
|
||||||
{2403, nullptr, "ImportPromotionJsonForDebug"},
|
|
||||||
{2404, nullptr, "ClearPromotionInfoForDebug"},
|
|
||||||
{2500, nullptr, "ConfirmAvailableTime"},
|
|
||||||
{2510, nullptr, "CreateApplicationResource"},
|
|
||||||
{2511, nullptr, "GetApplicationResource"},
|
|
||||||
{2513, nullptr, "LaunchMicroApplication"},
|
|
||||||
{2514, nullptr, "ClearTaskOfAsyncTaskManager"},
|
|
||||||
{2515, nullptr, "CleanupAllPlaceHolderAndFragmentsIfNoTask"},
|
|
||||||
{2516, nullptr, "EnsureApplicationCertificate"},
|
|
||||||
{2517, nullptr, "CreateApplicationInstance"},
|
|
||||||
{2518, nullptr, "UpdateQualificationForDebug"},
|
|
||||||
{2519, nullptr, "IsQualificationTransitionSupported"},
|
|
||||||
{2520, nullptr, "IsQualificationTransitionSupportedByProcessId"},
|
|
||||||
{2521, nullptr, "GetRightsUserChangedEvent"},
|
|
||||||
{2522, nullptr, "IsRomRedirectionAvailable"},
|
|
||||||
{2800, nullptr, "GetApplicationIdOfPreomia"},
|
|
||||||
{3000, nullptr, "RegisterDeviceLockKey"},
|
|
||||||
{3001, nullptr, "UnregisterDeviceLockKey"},
|
|
||||||
{3002, nullptr, "VerifyDeviceLockKey"},
|
|
||||||
{3003, nullptr, "HideApplicationIcon"},
|
|
||||||
{3004, nullptr, "ShowApplicationIcon"},
|
|
||||||
{3005, nullptr, "HideApplicationTitle"},
|
|
||||||
{3006, nullptr, "ShowApplicationTitle"},
|
|
||||||
{3007, nullptr, "EnableGameCard"},
|
|
||||||
{3008, nullptr, "DisableGameCard"},
|
|
||||||
{3009, nullptr, "EnableLocalContentShare"},
|
|
||||||
{3010, nullptr, "DisableLocalContentShare"},
|
|
||||||
{3011, nullptr, "IsApplicationIconHidden"},
|
|
||||||
{3012, nullptr, "IsApplicationTitleHidden"},
|
|
||||||
{3013, nullptr, "IsGameCardEnabled"},
|
|
||||||
{3014, nullptr, "IsLocalContentShareEnabled"},
|
|
||||||
{3050, nullptr, "ListAssignELicenseTaskResult"},
|
|
||||||
{9999, nullptr, "GetApplicationCertificate"},
|
|
||||||
};
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
|
||||||
}
|
|
||||||
|
|
||||||
IApplicationManagerInterface::~IApplicationManagerInterface() = default;
|
|
||||||
|
|
||||||
void IApplicationManagerInterface::GetApplicationControlData(HLERequestContext& ctx) {
|
|
||||||
IPC::RequestParser rp{ctx};
|
|
||||||
const auto flag = rp.PopRaw<u64>();
|
|
||||||
LOG_DEBUG(Service_NS, "called with flag={:016X}", flag);
|
|
||||||
|
|
||||||
const auto title_id = rp.PopRaw<u64>();
|
|
||||||
|
|
||||||
const auto size = ctx.GetWriteBufferSize();
|
|
||||||
|
|
||||||
const FileSys::PatchManager pm{title_id, system.GetFileSystemController(),
|
|
||||||
system.GetContentProvider()};
|
|
||||||
const auto control = pm.GetControlMetadata();
|
|
||||||
|
|
||||||
std::vector<u8> out;
|
|
||||||
|
|
||||||
if (control.first != nullptr) {
|
|
||||||
if (size < 0x4000) {
|
|
||||||
LOG_ERROR(Service_NS,
|
|
||||||
"output buffer is too small! (actual={:016X}, expected_min=0x4000)", size);
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
// TODO(DarkLordZach): Find a better error code for this.
|
|
||||||
rb.Push(ResultUnknown);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
out.resize(0x4000);
|
|
||||||
const auto bytes = control.first->GetRawBytes();
|
|
||||||
std::memcpy(out.data(), bytes.data(), bytes.size());
|
|
||||||
} else {
|
|
||||||
LOG_WARNING(Service_NS, "missing NACP data for title_id={:016X}, defaulting to zeros.",
|
|
||||||
title_id);
|
|
||||||
out.resize(std::min<u64>(0x4000, size));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (control.second != nullptr) {
|
|
||||||
if (size < 0x4000 + control.second->GetSize()) {
|
|
||||||
LOG_ERROR(Service_NS,
|
|
||||||
"output buffer is too small! (actual={:016X}, expected_min={:016X})", size,
|
|
||||||
0x4000 + control.second->GetSize());
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
// TODO(DarkLordZach): Find a better error code for this.
|
|
||||||
rb.Push(ResultUnknown);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
out.resize(0x4000 + control.second->GetSize());
|
|
||||||
control.second->Read(out.data() + 0x4000, control.second->GetSize());
|
|
||||||
} else {
|
|
||||||
LOG_WARNING(Service_NS, "missing icon data for title_id={:016X}, defaulting to zeros.",
|
|
||||||
title_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.WriteBuffer(out);
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push<u32>(static_cast<u32>(out.size()));
|
|
||||||
}
|
|
||||||
|
|
||||||
void IApplicationManagerInterface::GetApplicationDesiredLanguage(HLERequestContext& ctx) {
|
|
||||||
IPC::RequestParser rp{ctx};
|
|
||||||
const auto supported_languages = rp.Pop<u32>();
|
|
||||||
|
|
||||||
u8 desired_language{};
|
|
||||||
const auto res = GetApplicationDesiredLanguage(&desired_language, supported_languages);
|
|
||||||
if (res == ResultSuccess) {
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push<u32>(desired_language);
|
|
||||||
} else {
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Result IApplicationManagerInterface::GetApplicationDesiredLanguage(u8* out_desired_language,
|
|
||||||
const u32 supported_languages) {
|
|
||||||
LOG_DEBUG(Service_NS, "called with supported_languages={:08X}", supported_languages);
|
|
||||||
|
|
||||||
// Get language code from settings
|
|
||||||
const auto language_code =
|
|
||||||
Set::GetLanguageCodeFromIndex(static_cast<s32>(Settings::values.language_index.GetValue()));
|
|
||||||
|
|
||||||
// Convert to application language, get priority list
|
|
||||||
const auto application_language = ConvertToApplicationLanguage(language_code);
|
|
||||||
if (application_language == std::nullopt) {
|
|
||||||
LOG_ERROR(Service_NS, "Could not convert application language! language_code={}",
|
|
||||||
language_code);
|
|
||||||
return Service::NS::ResultApplicationLanguageNotFound;
|
|
||||||
}
|
|
||||||
const auto priority_list = GetApplicationLanguagePriorityList(*application_language);
|
|
||||||
if (!priority_list) {
|
|
||||||
LOG_ERROR(Service_NS,
|
|
||||||
"Could not find application language priorities! application_language={}",
|
|
||||||
*application_language);
|
|
||||||
return Service::NS::ResultApplicationLanguageNotFound;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to find a valid language.
|
|
||||||
for (const auto lang : *priority_list) {
|
|
||||||
const auto supported_flag = GetSupportedLanguageFlag(lang);
|
|
||||||
if (supported_languages == 0 || (supported_languages & supported_flag) == supported_flag) {
|
|
||||||
*out_desired_language = static_cast<u8>(lang);
|
|
||||||
return ResultSuccess;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_ERROR(Service_NS, "Could not find a valid language! supported_languages={:08X}",
|
|
||||||
supported_languages);
|
|
||||||
return Service::NS::ResultApplicationLanguageNotFound;
|
|
||||||
}
|
|
||||||
|
|
||||||
void IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode(
|
|
||||||
HLERequestContext& ctx) {
|
|
||||||
IPC::RequestParser rp{ctx};
|
|
||||||
const auto application_language = rp.Pop<u8>();
|
|
||||||
|
|
||||||
u64 language_code{};
|
|
||||||
const auto res = ConvertApplicationLanguageToLanguageCode(&language_code, application_language);
|
|
||||||
if (res == ResultSuccess) {
|
|
||||||
IPC::ResponseBuilder rb{ctx, 4};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push(language_code);
|
|
||||||
} else {
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(res);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Result IApplicationManagerInterface::ConvertApplicationLanguageToLanguageCode(
|
|
||||||
u64* out_language_code, u8 application_language) {
|
|
||||||
const auto language_code =
|
|
||||||
ConvertToLanguageCode(static_cast<ApplicationLanguage>(application_language));
|
|
||||||
if (language_code == std::nullopt) {
|
|
||||||
LOG_ERROR(Service_NS, "Language not found! application_language={}", application_language);
|
|
||||||
return Service::NS::ResultApplicationLanguageNotFound;
|
|
||||||
}
|
|
||||||
|
|
||||||
*out_language_code = static_cast<u64>(*language_code);
|
|
||||||
return ResultSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS::NS(const char* name, Core::System& system_) : ServiceFramework{system_, name} {
|
NS::NS(const char* name, Core::System& system_) : ServiceFramework{system_, name} {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
|
@ -500,6 +62,31 @@ std::shared_ptr<IApplicationManagerInterface> NS::GetApplicationManagerInterface
|
||||||
return GetInterface<IApplicationManagerInterface>(system);
|
return GetInterface<IApplicationManagerInterface>(system);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, typename... Args>
|
||||||
|
void NS::PushInterface(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_NS, "called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushIpcInterface<T>(system);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NS::PushIApplicationManagerInterface(HLERequestContext& ctx) {
|
||||||
|
LOG_DEBUG(Service_NS, "called");
|
||||||
|
|
||||||
|
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||||
|
rb.Push(ResultSuccess);
|
||||||
|
rb.PushIpcInterface<IApplicationManagerInterface>(system);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T, typename... Args>
|
||||||
|
std::shared_ptr<T> NS::GetInterface(Args&&... args) const {
|
||||||
|
static_assert(std::is_base_of_v<SessionRequestHandler, T>,
|
||||||
|
"Not a base of ServiceFrameworkBase");
|
||||||
|
|
||||||
|
return std::make_shared<T>(std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
|
@ -9,28 +9,9 @@ namespace Core {
|
||||||
class System;
|
class System;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Service {
|
namespace Service::NS {
|
||||||
|
|
||||||
namespace FileSystem {
|
class IApplicationManagerInterface;
|
||||||
class FileSystemController;
|
|
||||||
} // namespace FileSystem
|
|
||||||
|
|
||||||
namespace NS {
|
|
||||||
|
|
||||||
class IApplicationManagerInterface final : public ServiceFramework<IApplicationManagerInterface> {
|
|
||||||
public:
|
|
||||||
explicit IApplicationManagerInterface(Core::System& system_);
|
|
||||||
~IApplicationManagerInterface() override;
|
|
||||||
|
|
||||||
Result GetApplicationDesiredLanguage(u8* out_desired_language, u32 supported_languages);
|
|
||||||
Result ConvertApplicationLanguageToLanguageCode(u64* out_language_code,
|
|
||||||
u8 application_language);
|
|
||||||
|
|
||||||
private:
|
|
||||||
void GetApplicationControlData(HLERequestContext& ctx);
|
|
||||||
void GetApplicationDesiredLanguage(HLERequestContext& ctx);
|
|
||||||
void ConvertApplicationLanguageToLanguageCode(HLERequestContext& ctx);
|
|
||||||
};
|
|
||||||
|
|
||||||
class NS final : public ServiceFramework<NS> {
|
class NS final : public ServiceFramework<NS> {
|
||||||
public:
|
public:
|
||||||
|
@ -41,32 +22,14 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template <typename T, typename... Args>
|
template <typename T, typename... Args>
|
||||||
void PushInterface(HLERequestContext& ctx) {
|
void PushInterface(HLERequestContext& ctx);
|
||||||
LOG_DEBUG(Service_NS, "called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
void PushIApplicationManagerInterface(HLERequestContext& ctx);
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.PushIpcInterface<T>(system);
|
|
||||||
}
|
|
||||||
|
|
||||||
void PushIApplicationManagerInterface(HLERequestContext& ctx) {
|
|
||||||
LOG_DEBUG(Service_NS, "called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.PushIpcInterface<IApplicationManagerInterface>(system);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename... Args>
|
template <typename T, typename... Args>
|
||||||
std::shared_ptr<T> GetInterface(Args&&... args) const {
|
std::shared_ptr<T> GetInterface(Args&&... args) const;
|
||||||
static_assert(std::is_base_of_v<SessionRequestHandler, T>,
|
|
||||||
"Not a base of ServiceFrameworkBase");
|
|
||||||
|
|
||||||
return std::make_shared<T>(std::forward<Args>(args)...);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void LoopProcess(Core::System& system);
|
void LoopProcess(Core::System& system);
|
||||||
|
|
||||||
} // namespace NS
|
} // namespace Service::NS
|
||||||
} // namespace Service
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
|
#include "common/uuid.h"
|
||||||
#include "core/file_sys/romfs_factory.h"
|
#include "core/file_sys/romfs_factory.h"
|
||||||
|
|
||||||
namespace Service::NS {
|
namespace Service::NS {
|
||||||
|
@ -54,6 +55,14 @@ struct ApplicationView {
|
||||||
u8 unk_x45[0xb]; ///< Unknown.
|
u8 unk_x45[0xb]; ///< Unknown.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ApplicationRightsOnClient {
|
||||||
|
u64 application_id;
|
||||||
|
Common::UUID uid;
|
||||||
|
u8 flags;
|
||||||
|
u8 flags2;
|
||||||
|
INSERT_PADDING_BYTES(0x6);
|
||||||
|
};
|
||||||
|
|
||||||
/// NsPromotionInfo
|
/// NsPromotionInfo
|
||||||
struct PromotionInfo {
|
struct PromotionInfo {
|
||||||
u64 start_timestamp; ///< POSIX timestamp for the promotion start.
|
u64 start_timestamp; ///< POSIX timestamp for the promotion start.
|
||||||
|
|
|
@ -71,7 +71,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData(
|
||||||
}
|
}
|
||||||
|
|
||||||
Result IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage(
|
Result IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage(
|
||||||
Out<u8> out_desired_language, u32 supported_languages) {
|
Out<ApplicationLanguage> out_desired_language, u32 supported_languages) {
|
||||||
LOG_INFO(Service_NS, "called with supported_languages={:08X}", supported_languages);
|
LOG_INFO(Service_NS, "called with supported_languages={:08X}", supported_languages);
|
||||||
|
|
||||||
// Get language code from settings
|
// Get language code from settings
|
||||||
|
@ -97,7 +97,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage(
|
||||||
for (const auto lang : *priority_list) {
|
for (const auto lang : *priority_list) {
|
||||||
const auto supported_flag = GetSupportedLanguageFlag(lang);
|
const auto supported_flag = GetSupportedLanguageFlag(lang);
|
||||||
if (supported_languages == 0 || (supported_languages & supported_flag) == supported_flag) {
|
if (supported_languages == 0 || (supported_languages & supported_flag) == supported_flag) {
|
||||||
*out_desired_language = static_cast<u8>(lang);
|
*out_desired_language = lang;
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,12 +16,13 @@ public:
|
||||||
explicit IReadOnlyApplicationControlDataInterface(Core::System& system_);
|
explicit IReadOnlyApplicationControlDataInterface(Core::System& system_);
|
||||||
~IReadOnlyApplicationControlDataInterface() override;
|
~IReadOnlyApplicationControlDataInterface() override;
|
||||||
|
|
||||||
private:
|
public:
|
||||||
Result GetApplicationControlData(OutBuffer<BufferAttr_HipcMapAlias> out_buffer,
|
Result GetApplicationControlData(OutBuffer<BufferAttr_HipcMapAlias> out_buffer,
|
||||||
Out<u32> out_actual_size,
|
Out<u32> out_actual_size,
|
||||||
ApplicationControlSource application_control_source,
|
ApplicationControlSource application_control_source,
|
||||||
u64 application_id);
|
u64 application_id);
|
||||||
Result GetApplicationDesiredLanguage(Out<u8> out_desired_language, u32 supported_languages);
|
Result GetApplicationDesiredLanguage(Out<ApplicationLanguage> out_desired_language,
|
||||||
|
u32 supported_languages);
|
||||||
Result ConvertApplicationLanguageToLanguageCode(Out<u64> out_language_code,
|
Result ConvertApplicationLanguageToLanguageCode(Out<u64> out_language_code,
|
||||||
ApplicationLanguage application_language);
|
ApplicationLanguage application_language);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue