From 5b9fcd5a70ed247999b9ef9ef3698c6c2bd3639a Mon Sep 17 00:00:00 2001
From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com>
Date: Thu, 17 Aug 2023 20:27:50 +0300
Subject: [PATCH] [BOSS] RegisterNewArrivalEvent

---
 include/services/boss.hpp  |  1 +
 src/core/services/boss.cpp | 12 ++++++++++++
 2 files changed, 13 insertions(+)

diff --git a/include/services/boss.hpp b/include/services/boss.hpp
index b2347829..55c5135e 100644
--- a/include/services/boss.hpp
+++ b/include/services/boss.hpp
@@ -21,6 +21,7 @@ class BOSSService {
 	void getTaskState(u32 messagePointer);
 	void getTaskStorageInfo(u32 messagePointer);
 	void receiveProperty(u32 messagePointer);
+	void registerNewArrivalEvent(u32 messagePointer);
 	void registerStorageEntry(u32 messagePointer);
 	void unregisterStorage(u32 messagePointer);
 	void unregisterTask(u32 messagePointer);
diff --git a/src/core/services/boss.cpp b/src/core/services/boss.cpp
index 86b937c1..c4037a31 100644
--- a/src/core/services/boss.cpp
+++ b/src/core/services/boss.cpp
@@ -6,6 +6,7 @@ namespace BOSSCommands {
 		InitializeSession = 0x00010082,
 		UnregisterStorage = 0x00030000,
 		GetTaskStorageInfo = 0x00040000,
+		RegisterNewArrivalEvent = 0x00080002,
 		GetOptoutFlag = 0x000A0000,
 		UnregisterTask = 0x000C0082,
 		GetTaskIdList = 0x000E0000,
@@ -36,6 +37,7 @@ void BOSSService::handleSyncRequest(u32 messagePointer) {
 		case BOSSCommands::GetTaskStorageInfo: getTaskStorageInfo(messagePointer); break;
 		case BOSSCommands::InitializeSession: initializeSession(messagePointer); break;
 		case BOSSCommands::ReceiveProperty: receiveProperty(messagePointer); break;
+		case BOSSCommands::RegisterNewArrivalEvent: registerNewArrivalEvent(messagePointer); break;
 		case BOSSCommands::RegisterStorageEntry: registerStorageEntry(messagePointer); break;
 		case BOSSCommands::UnregisterStorage: unregisterStorage(messagePointer); break;
 		case BOSSCommands::UnregisterTask: unregisterTask(messagePointer); break;
@@ -109,6 +111,16 @@ void BOSSService::receiveProperty(u32 messagePointer) {
 	mem.write32(messagePointer + 8, 0); // Read size
 }
 
+// This seems to accept a KEvent as a parameter and register it for something Spotpass related
+// I need to update the 3DBrew page when it's known what it does properly
+void BOSSService::registerNewArrivalEvent(u32 messagePointer) {
+	const Handle eventHandle = mem.read32(messagePointer + 4); // Kernel event handle to register
+	log("BOSS::RegisterNewArrivalEvent (handle = %X)\n", eventHandle);
+
+	mem.write32(messagePointer, IPC::responseHeader(0x8, 1, 0));
+	mem.write32(messagePointer + 4, Result::Success);
+}
+
 void BOSSService::cancelTask(u32 messagePointer) {
 	log("BOSS::CancelTask (stubbed)\n");
 	mem.write32(messagePointer, IPC::responseHeader(0x1E, 1, 2));