mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	nim: Fully stub nim:u service. (#6290)
This commit is contained in:
		
							parent
							
								
									bf73cb57ca
								
							
						
					
					
						commit
						cda358443f
					
				
					 2 changed files with 1215 additions and 26 deletions
				
			
		|  | @ -3,9 +3,9 @@ | ||||||
| // Refer to the license.txt file included.
 | // Refer to the license.txt file included.
 | ||||||
| 
 | 
 | ||||||
| #include "common/archives.h" | #include "common/archives.h" | ||||||
|  | #include "common/string_util.h" | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/hle/ipc_helpers.h" | #include "core/hle/ipc_helpers.h" | ||||||
| #include "core/hle/kernel/event.h" |  | ||||||
| #include "core/hle/service/nim/nim_u.h" | #include "core/hle/service/nim/nim_u.h" | ||||||
| 
 | 
 | ||||||
| SERVICE_CONSTRUCT_IMPL(Service::NIM::NIM_U) | SERVICE_CONSTRUCT_IMPL(Service::NIM::NIM_U) | ||||||
|  | @ -13,37 +13,736 @@ SERIALIZE_EXPORT_IMPL(Service::NIM::NIM_U) | ||||||
| 
 | 
 | ||||||
| namespace Service::NIM { | namespace Service::NIM { | ||||||
| 
 | 
 | ||||||
|  | enum class SystemUpdateState : u32 { | ||||||
|  |     NotInitialized, | ||||||
|  |     StartingSystemUpdate, | ||||||
|  |     FetchingHashAndAccountStatus, | ||||||
|  |     InstallingNewTickets, | ||||||
|  |     InstallingTitles, | ||||||
|  |     UpdateComplete, | ||||||
|  |     SystemUpdatesDisabled, | ||||||
|  |     Unknown7, | ||||||
|  |     Unknown8, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct SystemUpdateProgress { | ||||||
|  |     SystemUpdateState state; | ||||||
|  |     u32 last_operation_result; | ||||||
|  |     u64 current_title_downloaded_bytes; | ||||||
|  |     u64 current_title_total_bytes; | ||||||
|  |     u64 titles_downloaded; | ||||||
|  |     u64 titles_total; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static_assert(sizeof(SystemUpdateProgress) == 0x28, "SystemUpdateProgress structure size is wrong"); | ||||||
|  | 
 | ||||||
|  | enum class TitleDownloadState : u32 { | ||||||
|  |     NotInitialized, | ||||||
|  |     StartingTitleDownload, | ||||||
|  |     InstallingTmd, | ||||||
|  |     CommittingTmd, | ||||||
|  |     InstallingContents, | ||||||
|  |     ContentsInstalled, | ||||||
|  |     CommittingTitles, | ||||||
|  |     Finished, | ||||||
|  |     Unknown8, | ||||||
|  |     Unknown9, | ||||||
|  |     BackgroundDownloadFailed, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct TitleDownloadProgress { | ||||||
|  |     TitleDownloadState state; | ||||||
|  |     u32 last_operation_result; | ||||||
|  |     u64 downloaded_bytes; | ||||||
|  |     u64 total_bytes; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static_assert(sizeof(TitleDownloadProgress) == 0x18, | ||||||
|  |               "TitleDownloadProgress structure size is wrong"); | ||||||
|  | 
 | ||||||
|  | struct TitleDownloadConfig { | ||||||
|  |     u64 title_id; | ||||||
|  |     u32 title_version; | ||||||
|  |     u32 unknown_1; | ||||||
|  |     u8 age_rating; | ||||||
|  |     u8 media_type; | ||||||
|  |     INSERT_PADDING_BYTES(2); | ||||||
|  |     u32 unknown_2; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static_assert(sizeof(TitleDownloadConfig) == 0x18, "TitleDownloadConfig structure size is wrong"); | ||||||
|  | 
 | ||||||
|  | #pragma pack(1) | ||||||
|  | struct BackgroundTitleDownloadConfig { | ||||||
|  |     TitleDownloadConfig base_config; | ||||||
|  |     u8 unknown_1; | ||||||
|  |     u8 unknown_2; | ||||||
|  |     INSERT_PADDING_BYTES(6); | ||||||
|  |     u64 requester_title_id; | ||||||
|  |     std::array<u16, 0x48> title_name; | ||||||
|  |     u16 title_name_terminator; | ||||||
|  |     std::array<u16, 0x24> developer_name; | ||||||
|  |     u16 developer_name_terminator; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static_assert(sizeof(BackgroundTitleDownloadConfig) == 0x104, | ||||||
|  |               "BackgroundTitleDownloadConfig structure size is wrong"); | ||||||
|  | 
 | ||||||
|  | struct BackgroundTitleDownloadTaskInfo { | ||||||
|  |     BackgroundTitleDownloadConfig config; | ||||||
|  |     INSERT_PADDING_BYTES(4); | ||||||
|  |     TitleDownloadProgress progress; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static_assert(sizeof(BackgroundTitleDownloadTaskInfo) == 0x120, | ||||||
|  |               "BackgroundTitleDownloadTaskInfo structure size is wrong"); | ||||||
|  | 
 | ||||||
|  | struct AutoTitleDownloadTaskInfo { | ||||||
|  |     u64 task_id; | ||||||
|  |     u64 title_id; | ||||||
|  |     u32 title_version; | ||||||
|  |     u8 unknown_4[0x14]; | ||||||
|  |     u64 required_size; | ||||||
|  |     u32 last_operation_result_code; | ||||||
|  |     u32 last_operation_customer_support_code; | ||||||
|  |     std::array<u16, 0x48> title_name; | ||||||
|  |     u16 title_name_terminator; | ||||||
|  |     std::array<u16, 0x24> developer_name; | ||||||
|  |     u16 developer_name_terminator; | ||||||
|  |     u8 unknown_5[0x24]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static_assert(sizeof(AutoTitleDownloadTaskInfo) == 0x138, | ||||||
|  |               "AutoTitleDownloadTaskInfo structure size is wrong"); | ||||||
|  | 
 | ||||||
|  | struct AutoDbgDat { | ||||||
|  |     u8 unknown_1[0x4]; | ||||||
|  |     u32 num_auto_download_tasks; | ||||||
|  |     u8 unknown_2[0x100]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static_assert(sizeof(AutoDbgDat) == 0x108, "AutoDbgDat structure size is wrong"); | ||||||
|  | 
 | ||||||
| NIM_U::NIM_U(Core::System& system) : ServiceFramework("nim:u", 2) { | NIM_U::NIM_U(Core::System& system) : ServiceFramework("nim:u", 2) { | ||||||
|     const FunctionInfo functions[] = { |     const FunctionInfo functions[] = { | ||||||
|         {0x00010000, nullptr, "StartSysUpdate"}, |         {0x00010000, &NIM_U::StartNetworkUpdate, "StartNetworkUpdate"}, | ||||||
|         {0x00020000, nullptr, "GetUpdateDownloadProgress"}, |         {0x00020000, &NIM_U::GetProgress, "GetProgress"}, | ||||||
|         {0x00040000, nullptr, "FinishTitlesInstall"}, |         {0x00030000, &NIM_U::Cancel, "Cancel"}, | ||||||
|         {0x00050000, &NIM_U::CheckForSysUpdateEvent, "CheckForSysUpdateEvent"}, |         {0x00040000, &NIM_U::CommitSystemTitles, "CommitSystemTitles"}, | ||||||
|         {0x00090000, &NIM_U::CheckSysUpdateAvailable, "CheckSysUpdateAvailable"}, |         {0x00050000, &NIM_U::GetBackgroundEventForMenu, "GetBackgroundEventForMenu"}, | ||||||
|         {0x000A0000, nullptr, "GetState"}, |         {0x00060000, &NIM_U::GetBackgroundEventForNews, "GetBackgroundEventForNews"}, | ||||||
|         {0x000B0000, nullptr, "GetSystemTitleHash"}, |         {0x00070000, &NIM_U::FormatSaveData, "FormatSaveData"}, | ||||||
|  |         {0x00080000, &NIM_U::GetCustomerSupportCode, "GetCustomerSupportCode"}, | ||||||
|  |         {0x00090000, &NIM_U::IsCommittableAllSystemTitles, "IsCommittableAllSystemTitles"}, | ||||||
|  |         {0x000A0000, &NIM_U::GetBackgroundProgress, "GetBackgroundProgress"}, | ||||||
|  |         {0x000B0000, &NIM_U::GetSavedHash, "GetSavedHash"}, | ||||||
|  |         {0x000C0082, &NIM_U::UnregisterTask, "UnregisterTask"}, | ||||||
|  |         {0x000D0080, &NIM_U::IsRegistered, "IsRegistered"}, | ||||||
|  |         {0x000E0080, &NIM_U::FindTaskInfo, "FindTaskInfo"}, | ||||||
|  |         {0x000F0042, &NIM_U::GetTaskInfos, "GetTaskInfos"}, | ||||||
|  |         {0x00100000, &NIM_U::DeleteUnmanagedContexts, "DeleteUnmanagedContexts"}, | ||||||
|  |         {0x00110000, &NIM_U::UpdateAutoTitleDownloadTasksAsync, | ||||||
|  |          "UpdateAutoTitleDownloadTasksAsync"}, | ||||||
|  |         {0x00120000, &NIM_U::StartPendingAutoTitleDownloadTasksAsync, | ||||||
|  |          "StartPendingAutoTitleDownloadTasksAsync"}, | ||||||
|  |         {0x00130000, &NIM_U::GetAsyncResult, "GetAsyncResult"}, | ||||||
|  |         {0x00140000, &NIM_U::CancelAsyncCall, "CancelAsyncCall"}, | ||||||
|  |         {0x00150000, &NIM_U::IsPendingAutoTitleDownloadTasks, "IsPendingAutoTitleDownloadTasks"}, | ||||||
|  |         {0x00160000, &NIM_U::GetNumAutoTitleDownloadTasks, "GetNumAutoTitleDownloadTasks"}, | ||||||
|  |         {0x00170042, &NIM_U::GetAutoTitleDownloadTaskInfos, "GetAutoTitleDownloadTaskInfos"}, | ||||||
|  |         {0x00180080, &NIM_U::CancelAutoTitleDownloadTask, "CancelAutoTitleDownloadTask"}, | ||||||
|  |         {0x00190002, &NIM_U::SetAutoDbgDat, "SetAutoDbgDat"}, | ||||||
|  |         {0x001A0002, &NIM_U::GetAutoDbgDat, "GetAutoDbgDat"}, | ||||||
|  |         {0x001B0042, &NIM_U::SetDbgTasks, "SetDbgTasks"}, | ||||||
|  |         {0x001C0042, &NIM_U::GetDbgTasks, "GetDbgTasks"}, | ||||||
|  |         {0x001D0000, &NIM_U::DeleteDbgData, "DeleteDbgData"}, | ||||||
|  |         {0x001E0042, &NIM_U::SetTslXml, "SetTslXml"}, | ||||||
|  |         {0x001F0000, &NIM_U::GetTslXmlSize, "GetTslXmlSize"}, | ||||||
|  |         {0x00200042, &NIM_U::GetTslXml, "GetTslXml"}, | ||||||
|  |         {0x00210000, &NIM_U::DeleteTslXml, "DeleteTslXml"}, | ||||||
|  |         {0x00220042, &NIM_U::SetDtlXml, "SetDtlXml"}, | ||||||
|  |         {0x00230000, &NIM_U::GetDtlXmlSize, "GetDtlXmlSize"}, | ||||||
|  |         {0x00240042, &NIM_U::GetDtlXml, "GetDtlXml"}, | ||||||
|  |         {0x00250000, &NIM_U::UpdateAccountStatus, "UpdateAccountStatus"}, | ||||||
|  |         {0x00260180, &NIM_U::StartTitleDownload, "StartTitleDownload"}, | ||||||
|  |         {0x00270000, &NIM_U::StopTitleDownload, "StopTitleDownload"}, | ||||||
|  |         {0x00280000, &NIM_U::GetTitleDownloadProgress, "GetTitleDownloadProgress"}, | ||||||
|  |         {0x00290246, &NIM_U::RegisterTask, "RegisterTask"}, | ||||||
|  |         {0x002A0000, &NIM_U::IsSystemUpdateAvailable, "IsSystemUpdateAvailable"}, | ||||||
|  |         {0x002B0000, &NIM_U::Unknown2B, "Unknown2B"}, | ||||||
|  |         {0x002C0000, &NIM_U::UpdateTickets, "UpdateTickets"}, | ||||||
|  |         {0x002D00C0, &NIM_U::DownloadTitleSeedAsync, "DownloadTitleSeedAsync"}, | ||||||
|  |         {0x002E0000, &NIM_U::DownloadMissingTitleSeedsAsync, "DownloadMissingTitleSeedsAsync"}, | ||||||
|     }; |     }; | ||||||
|     RegisterHandlers(functions); |     RegisterHandlers(functions); | ||||||
|     nim_system_update_event = |     nim_system_update_event_for_menu = | ||||||
|         system.Kernel().CreateEvent(Kernel::ResetType::OneShot, "NIM System Update Event"); |         system.Kernel().CreateEvent(Kernel::ResetType::OneShot, "NIM System Update Event (Menu)"); | ||||||
|  |     nim_system_update_event_for_news = | ||||||
|  |         system.Kernel().CreateEvent(Kernel::ResetType::OneShot, "NIM System Update Event (News)"); | ||||||
|  |     nim_async_completion_event = | ||||||
|  |         system.Kernel().CreateEvent(Kernel::ResetType::OneShot, "NIM Async Completion Event"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| NIM_U::~NIM_U() = default; | NIM_U::~NIM_U() = default; | ||||||
| 
 | 
 | ||||||
| void NIM_U::CheckForSysUpdateEvent(Kernel::HLERequestContext& ctx) { | void NIM_U::StartNetworkUpdate(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx, 0x5, 0, 0); // 0x50000
 |     IPC::RequestParser rp(ctx, 0x1, 0, 0); // 0x10000
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|     rb.Push(RESULT_SUCCESS); |     rb.Push(RESULT_SUCCESS); | ||||||
|     rb.PushCopyObjects(nim_system_update_event); | 
 | ||||||
|     LOG_TRACE(Service_NIM, "called"); |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void NIM_U::CheckSysUpdateAvailable(Kernel::HLERequestContext& ctx) { | void NIM_U::GetProgress(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x2, 0, 0); // 0x20000
 | ||||||
|  | 
 | ||||||
|  |     SystemUpdateProgress progress{}; | ||||||
|  |     std::memset(&progress, 0, sizeof(progress)); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(13, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushRaw(progress); | ||||||
|  |     rb.Push(0); | ||||||
|  |     rb.Push(0); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::Cancel(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x3, 0, 0); // 0x30000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::CommitSystemTitles(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x4, 0, 0); // 0x40000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetBackgroundEventForMenu(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x5, 0, 0); // 0x50000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushCopyObjects(nim_system_update_event_for_menu); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetBackgroundEventForNews(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x6, 0, 0); // 0x60000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushCopyObjects(nim_system_update_event_for_news); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::FormatSaveData(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x7, 0, 0); // 0x70000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetCustomerSupportCode(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x8, 0, 0); // 0x80000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(0); // Customer support code
 | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::IsCommittableAllSystemTitles(Kernel::HLERequestContext& ctx) { | ||||||
|     IPC::RequestParser rp(ctx, 0x9, 0, 0); // 0x90000
 |     IPC::RequestParser rp(ctx, 0x9, 0, 0); // 0x90000
 | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|     rb.Push(RESULT_SUCCESS); |     rb.Push(RESULT_SUCCESS); | ||||||
|     rb.Push(false); // No update available
 |     rb.Push(false); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetBackgroundProgress(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0xA, 0, 0); // 0xA0000
 | ||||||
|  | 
 | ||||||
|  |     SystemUpdateProgress progress{}; | ||||||
|  |     std::memset(&progress, 0, sizeof(progress)); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(13, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushRaw(progress); | ||||||
|  |     rb.Push(0); | ||||||
|  |     rb.Push(0); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetSavedHash(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0xB, 0, 0); // 0xB0000
 | ||||||
|  | 
 | ||||||
|  |     std::array<char, 0x24> hash{}; | ||||||
|  |     std::memset(&hash, 0, sizeof(hash)); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(10, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushRaw(hash); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::UnregisterTask(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0xC, 2, 2); // 0xC0082
 | ||||||
|  | 
 | ||||||
|  |     const u64 title_id = rp.Pop<u64>(); | ||||||
|  |     const u32 process_id = rp.PopPID(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::NIM, ErrorSummary::NotFound, | ||||||
|  |                        ErrorLevel::Status)); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called title_id={:016X}, process_id={:08X}", title_id, | ||||||
|  |                 process_id); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::IsRegistered(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0xD, 2, 0); // 0xD0080
 | ||||||
|  | 
 | ||||||
|  |     const u64 title_id = rp.Pop<u64>(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(false); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called title_id={:016X}", title_id); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::FindTaskInfo(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0xE, 2, 0); // 0xE0080
 | ||||||
|  | 
 | ||||||
|  |     const u64 title_id = rp.Pop<u64>(); | ||||||
|  | 
 | ||||||
|  |     std::vector<u8> buffer(0x120, 0); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(ResultCode(ErrorDescription::NotFound, ErrorModule::NIM, ErrorSummary::NotFound, | ||||||
|  |                        ErrorLevel::Status)); | ||||||
|  |     rb.PushStaticBuffer(std::move(buffer), 0); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called title_id={:016X}", title_id); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetTaskInfos(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0xF, 1, 2); // 0xF0042
 | ||||||
|  | 
 | ||||||
|  |     const u64 max_task_infos = rp.Pop<u32>(); | ||||||
|  |     auto& task_infos_buffer = rp.PopMappedBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(0); | ||||||
|  |     rb.PushMappedBuffer(task_infos_buffer); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called max_task_infos={:08X}, task_infos_buffer=0x{:08X}", | ||||||
|  |                 max_task_infos, task_infos_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::DeleteUnmanagedContexts(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x10, 0, 0); // 0x100000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::UpdateAutoTitleDownloadTasksAsync(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x11, 0, 0); // 0x110000
 | ||||||
|  | 
 | ||||||
|  |     // Since this is a stub, signal the completion event so the caller won't get stuck waiting.
 | ||||||
|  |     nim_async_completion_event->Signal(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushCopyObjects(nim_async_completion_event); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::StartPendingAutoTitleDownloadTasksAsync(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x11, 0, 0); // 0x120000
 | ||||||
|  | 
 | ||||||
|  |     // Since this is a stub, signal the completion event so the caller won't get stuck waiting.
 | ||||||
|  |     nim_async_completion_event->Signal(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushCopyObjects(nim_async_completion_event); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetAsyncResult(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x13, 0, 0); // 0x130000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(3, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(0); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::CancelAsyncCall(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x14, 0, 0); // 0x140000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::IsPendingAutoTitleDownloadTasks(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x15, 0, 0); // 0x150000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(false); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetNumAutoTitleDownloadTasks(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x16, 0, 0); // 0x160000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(0); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetAutoTitleDownloadTaskInfos(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x17, 1, 2); // 0x170042
 | ||||||
|  | 
 | ||||||
|  |     const u64 max_task_infos = rp.Pop<u32>(); | ||||||
|  |     auto& task_infos_buffer = rp.PopMappedBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(0); | ||||||
|  |     rb.PushMappedBuffer(task_infos_buffer); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called max_task_infos={:08X}, task_infos_buffer=0x{:08X}", | ||||||
|  |                 max_task_infos, task_infos_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::CancelAutoTitleDownloadTask(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x18, 2, 0); // 0x180080
 | ||||||
|  | 
 | ||||||
|  |     const u64 task_id = rp.Pop<u64>(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called task_id={:016X}", task_id); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::SetAutoDbgDat(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x19, 0, 2); // 0x190002
 | ||||||
|  | 
 | ||||||
|  |     auto& auto_dbg_dat_buffer = rp.PopMappedBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushMappedBuffer(auto_dbg_dat_buffer); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called auto_dbg_dat_buffer=0x{:08X}", | ||||||
|  |                 auto_dbg_dat_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetAutoDbgDat(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x1A, 0, 2); // 0x1A0002
 | ||||||
|  | 
 | ||||||
|  |     auto& auto_dbg_dat_buffer = rp.PopMappedBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushMappedBuffer(auto_dbg_dat_buffer); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called auto_dbg_dat_buffer=0x{:08X}", | ||||||
|  |                 auto_dbg_dat_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::SetDbgTasks(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x1B, 1, 2); // 0x1B0042
 | ||||||
|  | 
 | ||||||
|  |     const u64 max_task_infos = rp.Pop<u32>(); | ||||||
|  |     auto& task_infos_buffer = rp.PopMappedBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushMappedBuffer(task_infos_buffer); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called max_task_infos={:08X}, task_infos_buffer=0x{:08X}", | ||||||
|  |                 max_task_infos, task_infos_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetDbgTasks(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x1C, 1, 2); // 0x1C0042
 | ||||||
|  | 
 | ||||||
|  |     const u64 max_task_infos = rp.Pop<u32>(); | ||||||
|  |     auto& task_infos_buffer = rp.PopMappedBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(0); | ||||||
|  |     rb.PushMappedBuffer(task_infos_buffer); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called max_task_infos={:08X}, task_infos_buffer=0x{:08X}", | ||||||
|  |                 max_task_infos, task_infos_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::DeleteDbgData(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x1D, 0, 0); // 0x1D0000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::SetTslXml(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x1E, 1, 2); // 0x1E0042
 | ||||||
|  | 
 | ||||||
|  |     const u32 buffer_size = rp.Pop<u32>(); | ||||||
|  |     auto& xml_buffer = rp.PopMappedBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushMappedBuffer(xml_buffer); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called buffer_size={:08X}, xml_buffer=0x{:08X}", | ||||||
|  |                 buffer_size, xml_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetTslXmlSize(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x1F, 0, 0); // 0x1F0000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(3, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push<u64>(0); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetTslXml(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x20, 1, 2); // 0x200042
 | ||||||
|  | 
 | ||||||
|  |     const u32 buffer_capacity = rp.Pop<u32>(); | ||||||
|  |     auto& xml_buffer = rp.PopMappedBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushMappedBuffer(xml_buffer); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called buffer_capacity={:08X}, xml_buffer=0x{:08X}", | ||||||
|  |                 buffer_capacity, xml_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::DeleteTslXml(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x21, 0, 0); // 0x210000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::SetDtlXml(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x22, 1, 2); // 0x220042
 | ||||||
|  | 
 | ||||||
|  |     const u32 buffer_size = rp.Pop<u32>(); | ||||||
|  |     auto& xml_buffer = rp.PopMappedBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushMappedBuffer(xml_buffer); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called buffer_size={:08X}, xml_buffer=0x{:08X}", | ||||||
|  |                 buffer_size, xml_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetDtlXmlSize(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x23, 0, 0); // 0x230000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(3, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push<u64>(0); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetDtlXml(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x24, 1, 2); // 0x240042
 | ||||||
|  | 
 | ||||||
|  |     const u32 buffer_capacity = rp.Pop<u32>(); | ||||||
|  |     auto& xml_buffer = rp.PopMappedBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushMappedBuffer(xml_buffer); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called buffer_capacity={:08X}, xml_buffer=0x{:08X}", | ||||||
|  |                 buffer_capacity, xml_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::UpdateAccountStatus(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x25, 0, 0); // 0x250000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(3, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(0); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::StartTitleDownload(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x26, 6, 0); // 0x260180
 | ||||||
|  | 
 | ||||||
|  |     const auto& download_config = rp.PopRaw<TitleDownloadConfig>(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called title_id={:016X}", download_config.title_id); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::StopTitleDownload(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x27, 0, 0); // 0x270000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::GetTitleDownloadProgress(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x28, 0, 0); // 0x280000
 | ||||||
|  | 
 | ||||||
|  |     TitleDownloadProgress progress{}; | ||||||
|  |     std::memset(&progress, 0, sizeof(progress)); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(9, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushRaw(progress); | ||||||
|  |     rb.Push(0); | ||||||
|  |     rb.Push(0); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::RegisterTask(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x29, 9, 6); // 0x290246
 | ||||||
|  | 
 | ||||||
|  |     const auto& download_config = rp.PopRaw<TitleDownloadConfig>(); | ||||||
|  |     const u32 unknown_1 = rp.Pop<u32>(); | ||||||
|  |     const u32 unknown_2 = rp.Pop<u32>(); | ||||||
|  |     const u32 unknown_3 = rp.Pop<u32>(); | ||||||
|  |     const u32 pid = rp.PopPID(); | ||||||
|  |     const auto& title_name = rp.PopStaticBuffer(); | ||||||
|  |     const auto& developer_name = rp.PopStaticBuffer(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     const auto title_name_end = std::find(title_name.begin(), title_name.end(), u'\0'); | ||||||
|  |     const auto title_name_utf8 = | ||||||
|  |         Common::UTF16ToUTF8(std::u16string{title_name.begin(), title_name_end}); | ||||||
|  | 
 | ||||||
|  |     const auto developer_name_end = std::find(developer_name.begin(), developer_name.end(), u'\0'); | ||||||
|  |     const auto developer_name_utf8 = | ||||||
|  |         Common::UTF16ToUTF8(std::u16string{developer_name.begin(), developer_name_end}); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, | ||||||
|  |                 "(STUBBED) called title_id={:016X}, unknown_1={:08X}, unknown_2={:08X}, " | ||||||
|  |                 "unknown_3={:08X}, pid={:08X}, title_name='{}', developer_name='{}'", | ||||||
|  |                 download_config.title_id, unknown_1, unknown_2, unknown_3, pid, title_name_utf8, | ||||||
|  |                 developer_name_utf8); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::IsSystemUpdateAvailable(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x2A, 0, 0); // 0x2A0000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(4, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(0); | ||||||
|  |     rb.Push(false); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::Unknown2B(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x2B, 0, 0); // 0x2B0000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::UpdateTickets(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x2C, 0, 0); // 0x2C0000
 | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(3, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(0); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::DownloadTitleSeedAsync(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x2D, 3, 0); // 0x2D00C0
 | ||||||
|  | 
 | ||||||
|  |     const u64 title_id = rp.Pop<u64>(); | ||||||
|  |     const u16 country_code = rp.Pop<u16>(); | ||||||
|  | 
 | ||||||
|  |     // Since this is a stub, signal the completion event so the caller won't get stuck waiting.
 | ||||||
|  |     nim_async_completion_event->Signal(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushCopyObjects(nim_async_completion_event); | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_NIM, "(STUBBED) called title_id={:016X}, country_code={:04X}", title_id, | ||||||
|  |                 country_code); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void NIM_U::DownloadMissingTitleSeedsAsync(Kernel::HLERequestContext& ctx) { | ||||||
|  |     IPC::RequestParser rp(ctx, 0x2E, 0, 0); // 0x2E0000
 | ||||||
|  | 
 | ||||||
|  |     // Since this is a stub, signal the completion event so the caller won't get stuck waiting.
 | ||||||
|  |     nim_async_completion_event->Signal(); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.PushCopyObjects(nim_async_completion_event); | ||||||
| 
 | 
 | ||||||
|     LOG_WARNING(Service_NIM, "(STUBBED) called"); |     LOG_WARNING(Service_NIM, "(STUBBED) called"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -20,32 +20,522 @@ public: | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     /**
 |     /**
 | ||||||
|      * NIM::CheckForSysUpdateEvent service function |      * NIM::StartNetworkUpdate service function | ||||||
|      *  Inputs: |      *  Inputs: | ||||||
|      *      1 : None |      *      1 : None | ||||||
|      *  Outputs: |      *  Outputs: | ||||||
|      *      1 : Result of function, 0 on success, otherwise error code |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|      *      2 : Copy handle descriptor |  | ||||||
|      *      3 : System Update event handle |  | ||||||
|      */ |      */ | ||||||
|     void CheckForSysUpdateEvent(Kernel::HLERequestContext& ctx); |     void StartNetworkUpdate(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|     /**
 |     /**
 | ||||||
|      * NIM::CheckSysUpdateAvailable service function |      * NIM::GetProgress service function | ||||||
|      *  Inputs: |      *  Inputs: | ||||||
|      *      1 : None |      *      1 : None | ||||||
|      *  Outputs: |      *  Outputs: | ||||||
|      *      1 : Result of function, 0 on success, otherwise error code |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|      *      2 : u8 flag, 0 = no system update available, 1 = system update available. |      *      2-11 : SystemUpdateProgress structure for the foreground system update | ||||||
|  |      *      12: ? | ||||||
|  |      *      13: ? | ||||||
|      */ |      */ | ||||||
|     void CheckSysUpdateAvailable(Kernel::HLERequestContext& ctx); |     void GetProgress(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|     std::shared_ptr<Kernel::Event> nim_system_update_event; |     /**
 | ||||||
|  |      * NIM::Cancel service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void Cancel(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::CommitSystemTitles service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void CommitSystemTitles(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetBackgroundEventForMenu service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Copy handle IPC header | ||||||
|  |      *      3 : System update ready event handle for home menu | ||||||
|  |      */ | ||||||
|  |     void GetBackgroundEventForMenu(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetBackgroundEventForNews service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Copy handle IPC header | ||||||
|  |      *      3 : System update ready event handle for news module | ||||||
|  |      */ | ||||||
|  |     void GetBackgroundEventForNews(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::FormatSaveData service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void FormatSaveData(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetCustomerSupportCode service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Customer support code for the last system update error | ||||||
|  |      */ | ||||||
|  |     void GetCustomerSupportCode(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::IsCommittableAllSystemTitles service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Boolean indicating whether system titles are ready to commit | ||||||
|  |      */ | ||||||
|  |     void IsCommittableAllSystemTitles(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetBackgroundProgress service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2-11 : SystemUpdateProgress structure for the background system update | ||||||
|  |      *      12: ? | ||||||
|  |      *      13: ? | ||||||
|  |      */ | ||||||
|  |     void GetBackgroundProgress(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetSavedHash service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2-10 : NUL-terminated saved system update hash | ||||||
|  |      */ | ||||||
|  |     void GetSavedHash(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::UnregisterTask service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1-2 : Title ID | ||||||
|  |      *      3 : Process ID IPC Header | ||||||
|  |      *      4 : Process ID (Auto-filled by kernel) | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void UnregisterTask(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::IsRegistered service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1-2 : Title ID | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Boolean indicating whether a download task is registered for the title ID | ||||||
|  |      */ | ||||||
|  |     void IsRegistered(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::FindTaskInfo service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1-2 : Title ID | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Static Buffer IPC Header (ID = 0, Size = 0x120) | ||||||
|  |      *      3 : BackgroundTitleDownloadTaskInfo structure pointer | ||||||
|  |      */ | ||||||
|  |     void FindTaskInfo(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetTaskInfos service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : Maximum Number of BackgroundTitleDownloadTaskInfos | ||||||
|  |      *      2 : Mapped Output Buffer IPC Header | ||||||
|  |      *      3 : BackgroundTitleDownloadTaskInfos Output Buffer Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Number of BackgroundTitleDownloadTaskInfos Read | ||||||
|  |      *      3 : Mapped Output Buffer IPC Header | ||||||
|  |      *      4 : BackgroundTitleDownloadTaskInfos Output Buffer Pointer | ||||||
|  |      */ | ||||||
|  |     void GetTaskInfos(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::DeleteUnmanagedContexts service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void DeleteUnmanagedContexts(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::UpdateAutoTitleDownloadTasksAsync service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Copy Handle IPC Header | ||||||
|  |      *      3 : Event handle signaled when the operation completes | ||||||
|  |      */ | ||||||
|  |     void UpdateAutoTitleDownloadTasksAsync(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::StartPendingAutoTitleDownloadTasksAsync service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Copy Handle IPC Header | ||||||
|  |      *      3 : Event handle signaled when the operation completes | ||||||
|  |      */ | ||||||
|  |     void StartPendingAutoTitleDownloadTasksAsync(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetAsyncResult service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Async operation result code | ||||||
|  |      *      3 : Async operation customer support code | ||||||
|  |      */ | ||||||
|  |     void GetAsyncResult(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::CancelAsyncCall service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void CancelAsyncCall(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::IsPendingAutoTitleDownloadTasks service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Boolean indicating whether there are auto title downloads ready to start | ||||||
|  |      */ | ||||||
|  |     void IsPendingAutoTitleDownloadTasks(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetNumAutoTitleDownloadTasks service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Number of auto title download tasks | ||||||
|  |      */ | ||||||
|  |     void GetNumAutoTitleDownloadTasks(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetAutoTitleDownloadTasks service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : Maximum number of AutoTitleDownloadTaskInfos | ||||||
|  |      *      2 : Mapped Output Buffer IPC Header | ||||||
|  |      *      3 : AutoTitleDownloadTaskInfos Output Buffer Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Number of AutoTitleDownloadTaskInfos Read | ||||||
|  |      *      3 : Mapped Output Buffer IPC Header | ||||||
|  |      *      4 : AutoTitleDownloadTaskInfos Output Buffer Pointer | ||||||
|  |      */ | ||||||
|  |     void GetAutoTitleDownloadTaskInfos(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::CancelAutoTitleDownloadTask service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1-2 : Auto Title Download Task ID | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void CancelAutoTitleDownloadTask(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::SetAutoDbgDat service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : Mapped Input Buffer IPC Header | ||||||
|  |      *      2 : AutoDbgDat Input Buffer Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Mapped Input Buffer IPC Header | ||||||
|  |      *      3 : AutoDbgDat Input Buffer Pointer | ||||||
|  |      */ | ||||||
|  |     void SetAutoDbgDat(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetAutoDbgDat service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : Mapped Output Buffer IPC Header | ||||||
|  |      *      2 : AutoDbgDat Output Buffer Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Mapped Output Buffer IPC Header | ||||||
|  |      *      3 : AutoDbgDat Output Buffer Pointer | ||||||
|  |      */ | ||||||
|  |     void GetAutoDbgDat(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::SetDbgTasks service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : Number of AutoTitleDownloadTaskInfos | ||||||
|  |      *      2 : Mapped Input Buffer IPC Header | ||||||
|  |      *      3 : AutoTitleDownloadTaskInfos Input Buffer Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      3 : Mapped Input Buffer IPC Header | ||||||
|  |      *      4 : AutoTitleDownloadTaskInfos Input Buffer Pointer | ||||||
|  |      */ | ||||||
|  |     void SetDbgTasks(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetDbgTasks service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : Maximum number of AutoTitleDownloadTaskInfos | ||||||
|  |      *      2 : Mapped Output Buffer IPC Header | ||||||
|  |      *      3 : AutoTitleDownloadTaskInfos Output Buffer Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Number of AutoTitleDownloadTaskInfos Read | ||||||
|  |      *      3 : Mapped Output Buffer IPC Header | ||||||
|  |      *      4 : AutoTitleDownloadTaskInfos Output Buffer Pointer | ||||||
|  |      */ | ||||||
|  |     void GetDbgTasks(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::DeleteDbgData service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void DeleteDbgData(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::SetTslXml service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : Buffer Size | ||||||
|  |      *      2 : Mapped Input Buffer IPC Header | ||||||
|  |      *      3 : XML Input Buffer Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Mapped Input Buffer IPC Header | ||||||
|  |      *      3 : XML Input Buffer Pointer | ||||||
|  |      */ | ||||||
|  |     void SetTslXml(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetTslXmlSize service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2-3 : XML Size | ||||||
|  |      */ | ||||||
|  |     void GetTslXmlSize(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetTslXml service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : Buffer Capacity | ||||||
|  |      *      2 : Mapped Output Buffer IPC Header | ||||||
|  |      *      3 : XML Output Buffer Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Mapped Output Buffer IPC Header | ||||||
|  |      *      3 : XML Output Buffer Pointer | ||||||
|  |      */ | ||||||
|  |     void GetTslXml(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::DeleteTslXml service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void DeleteTslXml(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::SetDtlXml service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : Buffer Size | ||||||
|  |      *      2 : Mapped Input Buffer IPC Header | ||||||
|  |      *      3 : XML Input Buffer Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Mapped Input Buffer IPC Header | ||||||
|  |      *      3 : XML Input Buffer Pointer | ||||||
|  |      */ | ||||||
|  |     void SetDtlXml(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetDtlXmlSize service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2-3 : XML Size | ||||||
|  |      */ | ||||||
|  |     void GetDtlXmlSize(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetDtlXml service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : Buffer Capacity | ||||||
|  |      *      2 : Mapped Output Buffer IPC Header | ||||||
|  |      *      3 : XML Output Buffer Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Mapped Output Buffer IPC Header | ||||||
|  |      *      3 : XML Output Buffer Pointer | ||||||
|  |      */ | ||||||
|  |     void GetDtlXml(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::UpdateAccountStatus service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Result of the actual operation | ||||||
|  |      *      3 : Customer support code of the actual operation | ||||||
|  |      */ | ||||||
|  |     void UpdateAccountStatus(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::StartTitleDownload service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1-6 : TitleDownloadConfig structure | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void StartTitleDownload(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::StopDownload service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void StopTitleDownload(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::GetTitleDownloadProgress service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2-7 : TitleDownloadProgress structure | ||||||
|  |      *      8: ? | ||||||
|  |      *      9: ? | ||||||
|  |      */ | ||||||
|  |     void GetTitleDownloadProgress(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::RegisterTask service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1-6 : TitleDownloadConfig structure | ||||||
|  |      *      7: ? | ||||||
|  |      *      8: ? | ||||||
|  |      *      9: ? | ||||||
|  |      *      10: Process ID IPC Header | ||||||
|  |      *      11: Process ID (Auto-filled by Kernel) | ||||||
|  |      *      12: Static Buffer IPC Header (ID = 0, Size = 0x90) | ||||||
|  |      *      13: Title Name UTF-16 String Pointer | ||||||
|  |      *      14: Static Buffer IPC Header (ID = 1, Size = 0x48) | ||||||
|  |      *      15: Developer Name UTF-16 String Pointer | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void RegisterTask(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::IsSystemUpdateAvailable service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Result code from the actual operation | ||||||
|  |      *      3 : Customer support code from the actual operation | ||||||
|  |      *      4 : Boolean indicating whether a system update is available | ||||||
|  |      */ | ||||||
|  |     void IsSystemUpdateAvailable(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::Unknown2B service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      */ | ||||||
|  |     void Unknown2B(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::UpdateTickets service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Result code from the actual operation | ||||||
|  |      *      3 : Customer support code from the actual operation | ||||||
|  |      */ | ||||||
|  |     void UpdateTickets(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::DownloadTitleSeedAsync service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1-2 : Title ID | ||||||
|  |      *      3: u16 Country Code | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Copy Handle IPC Header | ||||||
|  |      *      3 : Event handle signaled when the operation completes | ||||||
|  |      */ | ||||||
|  |     void DownloadTitleSeedAsync(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * NIM::DownloadMissingTitleSeedsAsync service function | ||||||
|  |      *  Inputs: | ||||||
|  |      *      1 : None | ||||||
|  |      *  Outputs: | ||||||
|  |      *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |      *      2 : Copy Handle IPC Header | ||||||
|  |      *      3 : Event handle signaled when the operation completes | ||||||
|  |      */ | ||||||
|  |     void DownloadMissingTitleSeedsAsync(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |     std::shared_ptr<Kernel::Event> nim_system_update_event_for_menu; | ||||||
|  |     std::shared_ptr<Kernel::Event> nim_system_update_event_for_news; | ||||||
|  |     std::shared_ptr<Kernel::Event> nim_async_completion_event; | ||||||
| 
 | 
 | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|         ar& boost::serialization::base_object<Kernel::SessionRequestHandler>(*this); |         ar& boost::serialization::base_object<Kernel::SessionRequestHandler>(*this); | ||||||
|         ar& nim_system_update_event; |         ar& nim_system_update_event_for_menu; | ||||||
|  |         ar& nim_system_update_event_for_news; | ||||||
|  |         ar& nim_async_completion_event; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue