Просмотр исходного кода

ns: rewrite IApplicationManagerInterface

Liam 2 лет назад
Родитель
Сommit
2e96921f9c

+ 2 - 0
src/core/CMakeLists.txt

@@ -741,6 +741,8 @@ add_library(core STATIC
     hle/service/npns/npns.h
     hle/service/ns/account_proxy_interface.cpp
     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.h
     hle/service/ns/content_management_interface.cpp

+ 2 - 1
src/core/hle/service/am/service/application_functions.cpp

@@ -16,6 +16,7 @@
 #include "core/hle/service/filesystem/filesystem.h"
 #include "core/hle/service/filesystem/save_data_controller.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/sm/sm.h"
 
@@ -167,7 +168,7 @@ Result IApplicationFunctions::GetDesiredLanguage(Out<u64> out_language_code) {
     auto app_man = ns_am2->GetApplicationManagerInterface();
 
     // Get desired application language
-    u8 desired_language{};
+    NS::ApplicationLanguage desired_language{};
     R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
 
     // Convert to settings language code.

+ 2 - 1
src/core/hle/service/am/service/library_applet_self_accessor.cpp

@@ -14,6 +14,7 @@
 #include "core/hle/service/cmif_serialization.h"
 #include "core/hle/service/filesystem/filesystem.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/sm/sm.h"
 
@@ -260,7 +261,7 @@ Result ILibraryAppletSelfAccessor::GetMainAppletApplicationDesiredLanguage(
     auto app_man = ns_am2->GetApplicationManagerInterface();
 
     // Get desired application language
-    u8 desired_language{};
+    NS::ApplicationLanguage desired_language{};
     R_TRY(app_man->GetApplicationDesiredLanguage(&desired_language, supported_languages));
 
     // Convert to settings language code.

+ 518 - 0
src/core/hle/service/ns/application_manager_interface.cpp

@@ -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 - 0
src/core/hle/service/ns/application_manager_interface.h

@@ -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

+ 1 - 1
src/core/hle/service/ns/content_management_interface.h

@@ -14,7 +14,7 @@ public:
     explicit IContentManagementInterface(Core::System& system_);
     ~IContentManagementInterface() override;
 
-private:
+public:
     Result CalculateApplicationOccupiedSize(Out<ApplicationOccupiedSize> out_size,
                                             u64 application_id);
     Result CheckSdCardMountStatus();

+ 26 - 439
src/core/hle/service/ns/ns.cpp

@@ -12,6 +12,7 @@
 #include "core/hle/service/glue/glue_manager.h"
 #include "core/hle/service/ipc_helpers.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/content_management_interface.h"
 #include "core/hle/service/ns/develop_interface.h"
@@ -35,445 +36,6 @@
 
 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} {
     // clang-format off
     static const FunctionInfo functions[] = {
@@ -500,6 +62,31 @@ std::shared_ptr<IApplicationManagerInterface> NS::GetApplicationManagerInterface
     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) {
     auto server_manager = std::make_unique<ServerManager>(system);
 

+ 6 - 43
src/core/hle/service/ns/ns.h

@@ -9,28 +9,9 @@ namespace Core {
 class System;
 }
 
-namespace Service {
+namespace Service::NS {
 
-namespace FileSystem {
-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 IApplicationManagerInterface;
 
 class NS final : public ServiceFramework<NS> {
 public:
@@ -41,32 +22,14 @@ public:
 
 private:
     template <typename T, typename... Args>
-    void PushInterface(HLERequestContext& ctx) {
-        LOG_DEBUG(Service_NS, "called");
-
-        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
-        rb.Push(ResultSuccess);
-        rb.PushIpcInterface<T>(system);
-    }
+    void PushInterface(HLERequestContext& ctx);
 
-    void PushIApplicationManagerInterface(HLERequestContext& ctx) {
-        LOG_DEBUG(Service_NS, "called");
-
-        IPC::ResponseBuilder rb{ctx, 2, 0, 1};
-        rb.Push(ResultSuccess);
-        rb.PushIpcInterface<IApplicationManagerInterface>(system);
-    }
+    void PushIApplicationManagerInterface(HLERequestContext& ctx);
 
     template <typename T, typename... Args>
-    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)...);
-    }
+    std::shared_ptr<T> GetInterface(Args&&... args) const;
 };
 
 void LoopProcess(Core::System& system);
 
-} // namespace NS
-} // namespace Service
+} // namespace Service::NS

+ 9 - 0
src/core/hle/service/ns/ns_types.h

@@ -4,6 +4,7 @@
 #pragma once
 
 #include "common/common_funcs.h"
+#include "common/uuid.h"
 #include "core/file_sys/romfs_factory.h"
 
 namespace Service::NS {
@@ -54,6 +55,14 @@ struct ApplicationView {
     u8 unk_x45[0xb];    ///< Unknown.
 };
 
+struct ApplicationRightsOnClient {
+    u64 application_id;
+    Common::UUID uid;
+    u8 flags;
+    u8 flags2;
+    INSERT_PADDING_BYTES(0x6);
+};
+
 /// NsPromotionInfo
 struct PromotionInfo {
     u64 start_timestamp; ///< POSIX timestamp for the promotion start.

+ 2 - 2
src/core/hle/service/ns/read_only_application_control_data_interface.cpp

@@ -71,7 +71,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationControlData(
 }
 
 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);
 
     // Get language code from settings
@@ -97,7 +97,7 @@ Result IReadOnlyApplicationControlDataInterface::GetApplicationDesiredLanguage(
     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);
+            *out_desired_language = lang;
             R_SUCCEED();
         }
     }

+ 3 - 2
src/core/hle/service/ns/read_only_application_control_data_interface.h

@@ -16,12 +16,13 @@ public:
     explicit IReadOnlyApplicationControlDataInterface(Core::System& system_);
     ~IReadOnlyApplicationControlDataInterface() override;
 
-private:
+public:
     Result GetApplicationControlData(OutBuffer<BufferAttr_HipcMapAlias> out_buffer,
                                      Out<u32> out_actual_size,
                                      ApplicationControlSource application_control_source,
                                      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,
                                                     ApplicationLanguage application_language);
 };