diff options
| -rw-r--r-- | src/core/hle/service/prepo/prepo.cpp | 86 |
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 | ||
| 18 | namespace Service::PlayReport { | 14 | namespace 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 | ||
| 49 | private: | 45 | private: |
| 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); |