summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/service/prepo/prepo.cpp86
1 files changed, 71 insertions, 15 deletions
diff --git a/src/core/hle/service/prepo/prepo.cpp b/src/core/hle/service/prepo/prepo.cpp
index 7e134f5c1..d56ce0eb9 100644
--- a/src/core/hle/service/prepo/prepo.cpp
+++ b/src/core/hle/service/prepo/prepo.cpp
@@ -2,18 +2,14 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <json.hpp>
6#include "common/file_util.h"
7#include "common/hex_util.h" 5#include "common/hex_util.h"
8#include "common/logging/log.h" 6#include "common/logging/log.h"
9#include "common/scm_rev.h"
10#include "core/hle/ipc_helpers.h" 7#include "core/hle/ipc_helpers.h"
11#include "core/hle/kernel/process.h" 8#include "core/hle/kernel/process.h"
12#include "core/hle/service/acc/profile_manager.h" 9#include "core/hle/service/acc/profile_manager.h"
13#include "core/hle/service/prepo/prepo.h" 10#include "core/hle/service/prepo/prepo.h"
14#include "core/hle/service/service.h" 11#include "core/hle/service/service.h"
15#include "core/reporter.h" 12#include "core/reporter.h"
16#include "core/settings.h"
17 13
18namespace Service::PlayReport { 14namespace Service::PlayReport {
19 15
@@ -22,14 +18,14 @@ public:
22 explicit PlayReport(const char* name) : ServiceFramework{name} { 18 explicit PlayReport(const char* name) : ServiceFramework{name} {
23 // clang-format off 19 // clang-format off
24 static const FunctionInfo functions[] = { 20 static const FunctionInfo functions[] = {
25 {10100, nullptr, "SaveReportOld"}, 21 {10100, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old>, "SaveReportOld"},
26 {10101, &PlayReport::SaveReportWithUserOld, "SaveReportWithUserOld"}, 22 {10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"},
27 {10102, nullptr, "SaveReport"}, 23 {10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::New>, "SaveReport"},
28 {10103, nullptr, "SaveReportWithUser"}, 24 {10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::New>, "SaveReportWithUser"},
29 {10200, nullptr, "RequestImmediateTransmission"}, 25 {10200, nullptr, "RequestImmediateTransmission"},
30 {10300, nullptr, "GetTransmissionStatus"}, 26 {10300, nullptr, "GetTransmissionStatus"},
31 {20100, nullptr, "SaveSystemReport"}, 27 {20100, &PlayReport::SaveSystemReport, "SaveSystemReport"},
32 {20101, nullptr, "SaveSystemReportWithUser"}, 28 {20101, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"},
33 {20200, nullptr, "SetOperationMode"}, 29 {20200, nullptr, "SetOperationMode"},
34 {30100, nullptr, "ClearStorage"}, 30 {30100, nullptr, "ClearStorage"},
35 {30200, nullptr, "ClearStatistics"}, 31 {30200, nullptr, "ClearStatistics"},
@@ -47,7 +43,28 @@ public:
47 } 43 }
48 44
49private: 45private:
50 void SaveReportWithUserOld(Kernel::HLERequestContext& ctx) { 46 template <Core::Reporter::PlayReportType Type>
47 void SaveReport(Kernel::HLERequestContext& ctx) {
48 IPC::RequestParser rp{ctx};
49 const auto process_id = rp.PopRaw<u64>();
50
51 const auto data1 = ctx.ReadBuffer(0);
52 const auto data2 = ctx.ReadBuffer(1);
53
54 LOG_DEBUG(Service_PREPO,
55 "called, type={:02X}, process_id={:016X}, data1_size={:016X}, data2_size={:016X}",
56 static_cast<u8>(Type), process_id, data1.size(), data2.size());
57
58 const auto& reporter{Core::System::GetInstance().GetReporter()};
59 reporter.SavePlayReport(Type, Core::CurrentProcess()->GetTitleID(), {data1, data2},
60 process_id);
61
62 IPC::ResponseBuilder rb{ctx, 2};
63 rb.Push(RESULT_SUCCESS);
64 }
65
66 template <Core::Reporter::PlayReportType Type>
67 void SaveReportWithUser(Kernel::HLERequestContext& ctx) {
51 IPC::RequestParser rp{ctx}; 68 IPC::RequestParser rp{ctx};
52 const auto user_id = rp.PopRaw<u128>(); 69 const auto user_id = rp.PopRaw<u128>();
53 const auto process_id = rp.PopRaw<u64>(); 70 const auto process_id = rp.PopRaw<u64>();
@@ -57,12 +74,51 @@ private:
57 74
58 LOG_DEBUG( 75 LOG_DEBUG(
59 Service_PREPO, 76 Service_PREPO,
60 "called, user_id={:016X}{:016X}, unk1={:016X}, data1_size={:016X}, data2_size={:016X}", 77 "called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, data1_size={:016X}, "
61 user_id[1], user_id[0], process_id, data1.size(), data2.size()); 78 "data2_size={:016X}",
79 static_cast<u8>(Type), user_id[1], user_id[0], process_id, data1.size(), data2.size());
80
81 const auto& reporter{Core::System::GetInstance().GetReporter()};
82 reporter.SavePlayReport(Type, Core::CurrentProcess()->GetTitleID(), {data1, data2},
83 process_id, user_id);
84
85 IPC::ResponseBuilder rb{ctx, 2};
86 rb.Push(RESULT_SUCCESS);
87 }
88
89 void SaveSystemReport(Kernel::HLERequestContext& ctx) {
90 IPC::RequestParser rp{ctx};
91 const auto title_id = rp.PopRaw<u64>();
92
93 const auto data1 = ctx.ReadBuffer(0);
94 const auto data2 = ctx.ReadBuffer(1);
95
96 LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}",
97 title_id, data1.size(), data2.size());
98
99 const auto& reporter{Core::System::GetInstance().GetReporter()};
100 reporter.SavePlayReport(Core::Reporter::PlayReportType::System, title_id, {data1, data2});
101
102 IPC::ResponseBuilder rb{ctx, 2};
103 rb.Push(RESULT_SUCCESS);
104 }
105
106 void SaveSystemReportWithUser(Kernel::HLERequestContext& ctx) {
107 IPC::RequestParser rp{ctx};
108 const auto user_id = rp.PopRaw<u128>();
109 const auto title_id = rp.PopRaw<u64>();
110
111 const auto data1 = ctx.ReadBuffer(0);
112 const auto data2 = ctx.ReadBuffer(1);
113
114 LOG_DEBUG(Service_PREPO,
115 "called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, "
116 "data2_size={:016X}",
117 user_id[1], user_id[0], title_id, data1.size(), data2.size());
62 118
63 const auto& reporter{Core::System::GetInstance().GetReporter()}; 119 const auto& reporter{Core::System::GetInstance().GetReporter()};
64 reporter.SavePlayReport(Core::CurrentProcess()->GetTitleID(), process_id, {data1, data2}, 120 reporter.SavePlayReport(Core::Reporter::PlayReportType::System, title_id, {data1, data2},
65 user_id); 121 std::nullopt, user_id);
66 122
67 IPC::ResponseBuilder rb{ctx, 2}; 123 IPC::ResponseBuilder rb{ctx, 2};
68 rb.Push(RESULT_SUCCESS); 124 rb.Push(RESULT_SUCCESS);