From 261a4f0311ab87429d9eb519f842550e57a47c8c Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Sat, 11 Aug 2018 21:29:58 -0400
Subject: [PATCH] friend: Fix CreateFriendService to return an IFriendService
 interface.

---
 src/core/hle/service/friend/friend.cpp | 88 +++++++++++++++++++++++++-
 1 file changed, 86 insertions(+), 2 deletions(-)

diff --git a/src/core/hle/service/friend/friend.cpp b/src/core/hle/service/friend/friend.cpp
index fb4d89068e..729dc883be 100644
--- a/src/core/hle/service/friend/friend.cpp
+++ b/src/core/hle/service/friend/friend.cpp
@@ -9,10 +9,94 @@
 
 namespace Service::Friend {
 
+class IFriendService final : public ServiceFramework<IFriendService> {
+public:
+    IFriendService() : ServiceFramework("IFriendService") {
+        static const FunctionInfo functions[] = {
+            {0, nullptr, "GetCompletionEvent"},
+            {1, nullptr, "Cancel"},
+            {10100, nullptr, "GetFriendListIds"},
+            {10101, nullptr, "GetFriendList"},
+            {10102, nullptr, "UpdateFriendInfo"},
+            {10110, nullptr, "GetFriendProfileImage"},
+            {10200, nullptr, "SendFriendRequestForApplication"},
+            {10211, nullptr, "AddFacedFriendRequestForApplication"},
+            {10400, nullptr, "GetBlockedUserListIds"},
+            {10500, nullptr, "GetProfileList"},
+            {10600, nullptr, "DeclareOpenOnlinePlaySession"},
+            {10601, nullptr, "DeclareCloseOnlinePlaySession"},
+            {10610, nullptr, "UpdateUserPresence"},
+            {10700, nullptr, "GetPlayHistoryRegistrationKey"},
+            {10701, nullptr, "GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId"},
+            {10702, nullptr, "AddPlayHistory"},
+            {11000, nullptr, "GetProfileImageUrl"},
+            {20100, nullptr, "GetFriendCount"},
+            {20101, nullptr, "GetNewlyFriendCount"},
+            {20102, nullptr, "GetFriendDetailedInfo"},
+            {20103, nullptr, "SyncFriendList"},
+            {20104, nullptr, "RequestSyncFriendList"},
+            {20110, nullptr, "LoadFriendSetting"},
+            {20200, nullptr, "GetReceivedFriendRequestCount"},
+            {20201, nullptr, "GetFriendRequestList"},
+            {20300, nullptr, "GetFriendCandidateList"},
+            {20301, nullptr, "GetNintendoNetworkIdInfo"},
+            {20302, nullptr, "GetSnsAccountLinkage"},
+            {20303, nullptr, "GetSnsAccountProfile"},
+            {20304, nullptr, "GetSnsAccountFriendList"},
+            {20400, nullptr, "GetBlockedUserList"},
+            {20401, nullptr, "SyncBlockedUserList"},
+            {20500, nullptr, "GetProfileExtraList"},
+            {20501, nullptr, "GetRelationship"},
+            {20600, nullptr, "GetUserPresenceView"},
+            {20700, nullptr, "GetPlayHistoryList"},
+            {20701, nullptr, "GetPlayHistoryStatistics"},
+            {20800, nullptr, "LoadUserSetting"},
+            {20801, nullptr, "SyncUserSetting"},
+            {20900, nullptr, "RequestListSummaryOverlayNotification"},
+            {21000, nullptr, "GetExternalApplicationCatalog"},
+            {30100, nullptr, "DropFriendNewlyFlags"},
+            {30101, nullptr, "DeleteFriend"},
+            {30110, nullptr, "DropFriendNewlyFlag"},
+            {30120, nullptr, "ChangeFriendFavoriteFlag"},
+            {30121, nullptr, "ChangeFriendOnlineNotificationFlag"},
+            {30200, nullptr, "SendFriendRequest"},
+            {30201, nullptr, "SendFriendRequestWithApplicationInfo"},
+            {30202, nullptr, "CancelFriendRequest"},
+            {30203, nullptr, "AcceptFriendRequest"},
+            {30204, nullptr, "RejectFriendRequest"},
+            {30205, nullptr, "ReadFriendRequest"},
+            {30210, nullptr, "GetFacedFriendRequestRegistrationKey"},
+            {30211, nullptr, "AddFacedFriendRequest"},
+            {30212, nullptr, "CancelFacedFriendRequest"},
+            {30213, nullptr, "GetFacedFriendRequestProfileImage"},
+            {30214, nullptr, "GetFacedFriendRequestProfileImageFromPath"},
+            {30215, nullptr, "SendFriendRequestWithExternalApplicationCatalogId"},
+            {30216, nullptr, "ResendFacedFriendRequest"},
+            {30217, nullptr, "SendFriendRequestWithNintendoNetworkIdInfo"},
+            {30300, nullptr, "GetSnsAccountLinkPageUrl"},
+            {30301, nullptr, "UnlinkSnsAccount"},
+            {30400, nullptr, "BlockUser"},
+            {30401, nullptr, "BlockUserWithApplicationInfo"},
+            {30402, nullptr, "UnblockUser"},
+            {30500, nullptr, "GetProfileExtraFromFriendCode"},
+            {30700, nullptr, "DeletePlayHistory"},
+            {30810, nullptr, "ChangePresencePermission"},
+            {30811, nullptr, "ChangeFriendRequestReception"},
+            {30812, nullptr, "ChangePlayLogPermission"},
+            {30820, nullptr, "IssueFriendCode"},
+            {30830, nullptr, "ClearPlayLog"},
+            {49900, nullptr, "DeleteNetworkServiceAccountCache"},
+        };
+
+        RegisterHandlers(functions);
+    }
+};
+
 void Module::Interface::CreateFriendService(Kernel::HLERequestContext& ctx) {
-    IPC::ResponseBuilder rb{ctx, 2};
+    IPC::ResponseBuilder rb{ctx, 2, 0, 1};
     rb.Push(RESULT_SUCCESS);
-    LOG_WARNING(Service_Friend, "(STUBBED) called");
+    rb.PushIpcInterface<IFriendService>();
+    LOG_DEBUG(Service_ACC, "called");
 }
 
 Module::Interface::Interface(std::shared_ptr<Module> module, const char* name)