From f3042672fbe7e9272aff4ed2df70f239819b6165 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Thu, 24 Aug 2023 15:35:44 +0300 Subject: [PATCH] More FRD stuffs --- include/services/frd.hpp | 2 ++ src/core/services/frd.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/include/services/frd.hpp b/include/services/frd.hpp index 17e50bc4..7dc4fb84 100644 --- a/include/services/frd.hpp +++ b/include/services/frd.hpp @@ -23,7 +23,9 @@ class FRDService { // Service commands void attachToEventNotification(u32 messagePointer); + void getFriendAttributeFlags(u32 messagePointer); void getFriendKeyList(u32 messagePointer); + void getFriendPresence(u32 messagePointer); void getMyFriendKey(u32 messagePointer); void getMyMii(u32 messagePointer); void getMyPresence(u32 messagePointer); diff --git a/src/core/services/frd.cpp b/src/core/services/frd.cpp index 67683dc1..1dada5a5 100644 --- a/src/core/services/frd.cpp +++ b/src/core/services/frd.cpp @@ -18,6 +18,8 @@ namespace FRDCommands { GetMyScreenName = 0x00090000, GetMyMii = 0x000A0000, GetFriendKeyList = 0x00110080, + GetFriendPresence = 0x00120042, + GetFriendAttributeFlags = 0x00170042, UpdateGameModeDescription = 0x001D0002, }; } @@ -28,7 +30,9 @@ void FRDService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { case FRDCommands::AttachToEventNotification: attachToEventNotification(messagePointer); break; + case FRDCommands::GetFriendAttributeFlags: getFriendAttributeFlags(messagePointer); break; case FRDCommands::GetFriendKeyList: getFriendKeyList(messagePointer); break; + case FRDCommands::GetFriendPresence: getFriendPresence(messagePointer); break; case FRDCommands::GetMyFriendKey: getMyFriendKey(messagePointer); break; case FRDCommands::GetMyMii: getMyMii(messagePointer); break; case FRDCommands::GetMyPresence: getMyPresence(messagePointer); break; @@ -96,6 +100,29 @@ void FRDService::getMyPresence(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void FRDService::getFriendAttributeFlags(u32 messagePointer) { + log("FRD::GetFriendAttributeFlags\n"); + const u32 count = mem.read32(messagePointer + 4); + const u32 buffer = mem.read32(messagePointer + 0x104); // Buffer to write flag info to. + + + // Clear all flags. Assume one flag == 1 byte (u8) for now. + for (u32 i = 0; i < count; i++) { + const u32 pointer = buffer + (i * sizeof(u8)); + for (u32 j = 0; j < sizeof(u8); j++) { + mem.write8(pointer + j, 0); + } + } +} + +void FRDService::getFriendPresence(u32 messagePointer) { + Helpers::warn("FRD::GetFriendPresence (stubbed)"); + + // TODO: Implement and document this, + mem.write32(messagePointer, IPC::responseHeader(0x12, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + void FRDService::getMyProfile(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0x7, 3, 0)); // Not sure if the header here has the correct # of responses? mem.write32(messagePointer + 4, Result::Success);