From 7019023cbc1d0f6b82cf80e5970a41befdec71ca Mon Sep 17 00:00:00 2001
From: Narr the Reg <juangerman-13@hotmail.com>
Date: Fri, 23 Feb 2024 13:01:59 -0600
Subject: [PATCH] service: btdrv: Add EnableRadio for Qlaunch

---
 src/core/hle/service/btdrv/btdrv.cpp | 32 +++++++++++++++++-----------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/src/core/hle/service/btdrv/btdrv.cpp b/src/core/hle/service/btdrv/btdrv.cpp
index 38cdd57ad0..83618a956b 100644
--- a/src/core/hle/service/btdrv/btdrv.cpp
+++ b/src/core/hle/service/btdrv/btdrv.cpp
@@ -5,6 +5,7 @@
 #include "core/core.h"
 #include "core/hle/kernel/k_event.h"
 #include "core/hle/service/btdrv/btdrv.h"
+#include "core/hle/service/cmif_serialization.h"
 #include "core/hle/service/ipc_helpers.h"
 #include "core/hle/service/kernel_helpers.h"
 #include "core/hle/service/server_manager.h"
@@ -13,9 +14,9 @@
 
 namespace Service::BtDrv {
 
-class Bt final : public ServiceFramework<Bt> {
+class IBluetoothUser final : public ServiceFramework<IBluetoothUser> {
 public:
-    explicit Bt(Core::System& system_)
+    explicit IBluetoothUser(Core::System& system_)
         : ServiceFramework{system_, "bt"}, service_context{system_, "bt"} {
         // clang-format off
         static const FunctionInfo functions[] = {
@@ -28,7 +29,7 @@ public:
             {6, nullptr, "SetLeResponse"},
             {7, nullptr, "LeSendIndication"},
             {8, nullptr, "GetLeEventInfo"},
-            {9, &Bt::RegisterBleEvent, "RegisterBleEvent"},
+            {9, C<&IBluetoothUser::RegisterBleEvent>, "RegisterBleEvent"},
         };
         // clang-format on
         RegisterHandlers(functions);
@@ -36,17 +37,16 @@ public:
         register_event = service_context.CreateEvent("BT:RegisterEvent");
     }
 
-    ~Bt() override {
+    ~IBluetoothUser() override {
         service_context.CloseEvent(register_event);
     }
 
 private:
-    void RegisterBleEvent(HLERequestContext& ctx) {
+    Result RegisterBleEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
         LOG_WARNING(Service_BTM, "(STUBBED) called");
 
-        IPC::ResponseBuilder rb{ctx, 2, 1};
-        rb.Push(ResultSuccess);
-        rb.PushCopyObjects(register_event->GetReadableEvent());
+        *out_event = &register_event->GetReadableEvent();
+        R_SUCCEED();
     }
 
     KernelHelpers::ServiceContext service_context;
@@ -54,9 +54,9 @@ private:
     Kernel::KEvent* register_event;
 };
 
-class BtDrv final : public ServiceFramework<BtDrv> {
+class IBluetoothDriver final : public ServiceFramework<IBluetoothDriver> {
 public:
-    explicit BtDrv(Core::System& system_) : ServiceFramework{system_, "btdrv"} {
+    explicit IBluetoothDriver(Core::System& system_) : ServiceFramework{system_, "btdrv"} {
         // clang-format off
         static const FunctionInfo functions[] = {
             {0, nullptr, "InitializeBluetoothDriver"},
@@ -93,7 +93,7 @@ public:
             {31, nullptr, "EnableMcMode"},
             {32, nullptr, "EnableLlrScan"},
             {33, nullptr, "DisableLlrScan"},
-            {34, nullptr, "EnableRadio"},
+            {34, C<&IBluetoothDriver::EnableRadio>, "EnableRadio"},
             {35, nullptr, "SetVisibility"},
             {36, nullptr, "EnableTbfcScan"},
             {37, nullptr, "RegisterHidReportEvent"},
@@ -195,13 +195,19 @@ public:
 
         RegisterHandlers(functions);
     }
+
+private:
+    Result EnableRadio() {
+        LOG_WARNING(Service_BTDRV, "(STUBBED) called");
+        R_SUCCEED();
+    }
 };
 
 void LoopProcess(Core::System& system) {
     auto server_manager = std::make_unique<ServerManager>(system);
 
-    server_manager->RegisterNamedService("btdrv", std::make_shared<BtDrv>(system));
-    server_manager->RegisterNamedService("bt", std::make_shared<Bt>(system));
+    server_manager->RegisterNamedService("btdrv", std::make_shared<IBluetoothDriver>(system));
+    server_manager->RegisterNamedService("bt", std::make_shared<IBluetoothUser>(system));
     ServerManager::RunServer(std::move(server_manager));
 }