da7be67daf
Resolves numerous deprecation warnings throughout the codebase due to inclusion of this header. Now building core should be significantly less noisy (and also relying on less global state). This also uncovered quite a few modules that were relying on indirect includes, which have also been fixed.
156 lines
6.4 KiB
C++
156 lines
6.4 KiB
C++
// Copyright 2018 yuzu emulator team
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#include "common/hex_util.h"
|
|
#include "common/logging/log.h"
|
|
#include "core/core.h"
|
|
#include "core/hle/ipc_helpers.h"
|
|
#include "core/hle/kernel/process.h"
|
|
#include "core/hle/service/acc/profile_manager.h"
|
|
#include "core/hle/service/prepo/prepo.h"
|
|
#include "core/hle/service/service.h"
|
|
#include "core/reporter.h"
|
|
|
|
namespace Service::PlayReport {
|
|
|
|
class PlayReport final : public ServiceFramework<PlayReport> {
|
|
public:
|
|
explicit PlayReport(const char* name, Core::System& system)
|
|
: ServiceFramework{name}, system(system) {
|
|
// clang-format off
|
|
static const FunctionInfo functions[] = {
|
|
{10100, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old>, "SaveReportOld"},
|
|
{10101, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old>, "SaveReportWithUserOld"},
|
|
{10102, &PlayReport::SaveReport<Core::Reporter::PlayReportType::Old2>, "SaveReportOld2"},
|
|
{10103, &PlayReport::SaveReportWithUser<Core::Reporter::PlayReportType::Old2>, "SaveReportWithUserOld2"},
|
|
{10104, nullptr, "SaveReport"},
|
|
{10105, nullptr, "SaveReportWithUser"},
|
|
{10200, nullptr, "RequestImmediateTransmission"},
|
|
{10300, nullptr, "GetTransmissionStatus"},
|
|
{10400, nullptr, "GetSystemSessionId"},
|
|
{20100, &PlayReport::SaveSystemReport, "SaveSystemReport"},
|
|
{20101, &PlayReport::SaveSystemReportWithUser, "SaveSystemReportWithUser"},
|
|
{20200, nullptr, "SetOperationMode"},
|
|
{30100, nullptr, "ClearStorage"},
|
|
{30200, nullptr, "ClearStatistics"},
|
|
{30300, nullptr, "GetStorageUsage"},
|
|
{30400, nullptr, "GetStatistics"},
|
|
{30401, nullptr, "GetThroughputHistory"},
|
|
{30500, nullptr, "GetLastUploadError"},
|
|
{30600, nullptr, "GetApplicationUploadSummary"},
|
|
{40100, nullptr, "IsUserAgreementCheckEnabled"},
|
|
{40101, nullptr, "SetUserAgreementCheckEnabled"},
|
|
{50100, nullptr, "ReadAllApplicationReportFiles"},
|
|
{90100, nullptr, "ReadAllReportFiles"},
|
|
{90101, nullptr, "Unknown90101"},
|
|
{90102, nullptr, "Unknown90102"},
|
|
{90200, nullptr, "GetStatistics"},
|
|
{90201, nullptr, "GetThroughputHistory"},
|
|
{90300, nullptr, "GetLastUploadError"},
|
|
};
|
|
// clang-format on
|
|
|
|
RegisterHandlers(functions);
|
|
}
|
|
|
|
private:
|
|
template <Core::Reporter::PlayReportType Type>
|
|
void SaveReport(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp{ctx};
|
|
const auto process_id = rp.PopRaw<u64>();
|
|
|
|
std::vector<std::vector<u8>> data{ctx.ReadBuffer(0)};
|
|
if constexpr (Type == Core::Reporter::PlayReportType::Old2) {
|
|
data.emplace_back(ctx.ReadBuffer(1));
|
|
}
|
|
|
|
LOG_DEBUG(Service_PREPO, "called, type={:02X}, process_id={:016X}, data1_size={:016X}",
|
|
static_cast<u8>(Type), process_id, data[0].size());
|
|
|
|
const auto& reporter{system.GetReporter()};
|
|
reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id);
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
rb.Push(RESULT_SUCCESS);
|
|
}
|
|
|
|
template <Core::Reporter::PlayReportType Type>
|
|
void SaveReportWithUser(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp{ctx};
|
|
const auto user_id = rp.PopRaw<u128>();
|
|
const auto process_id = rp.PopRaw<u64>();
|
|
std::vector<std::vector<u8>> data{ctx.ReadBuffer(0)};
|
|
|
|
if constexpr (Type == Core::Reporter::PlayReportType::Old2) {
|
|
const auto read_buffer_count =
|
|
ctx.BufferDescriptorX().size() + ctx.BufferDescriptorA().size();
|
|
if (read_buffer_count > 1) {
|
|
data.emplace_back(ctx.ReadBuffer(1));
|
|
}
|
|
}
|
|
|
|
LOG_DEBUG(
|
|
Service_PREPO,
|
|
"called, type={:02X}, user_id={:016X}{:016X}, process_id={:016X}, data1_size={:016X}",
|
|
static_cast<u8>(Type), user_id[1], user_id[0], process_id, data[0].size());
|
|
|
|
const auto& reporter{system.GetReporter()};
|
|
reporter.SavePlayReport(Type, system.CurrentProcess()->GetTitleID(), data, process_id,
|
|
user_id);
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
rb.Push(RESULT_SUCCESS);
|
|
}
|
|
|
|
void SaveSystemReport(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp{ctx};
|
|
const auto title_id = rp.PopRaw<u64>();
|
|
|
|
const auto data1 = ctx.ReadBuffer(0);
|
|
const auto data2 = ctx.ReadBuffer(1);
|
|
|
|
LOG_DEBUG(Service_PREPO, "called, title_id={:016X}, data1_size={:016X}, data2_size={:016X}",
|
|
title_id, data1.size(), data2.size());
|
|
|
|
const auto& reporter{system.GetReporter()};
|
|
reporter.SavePlayReport(Core::Reporter::PlayReportType::System, title_id, {data1, data2});
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
rb.Push(RESULT_SUCCESS);
|
|
}
|
|
|
|
void SaveSystemReportWithUser(Kernel::HLERequestContext& ctx) {
|
|
IPC::RequestParser rp{ctx};
|
|
const auto user_id = rp.PopRaw<u128>();
|
|
const auto title_id = rp.PopRaw<u64>();
|
|
|
|
const auto data1 = ctx.ReadBuffer(0);
|
|
const auto data2 = ctx.ReadBuffer(1);
|
|
|
|
LOG_DEBUG(Service_PREPO,
|
|
"called, user_id={:016X}{:016X}, title_id={:016X}, data1_size={:016X}, "
|
|
"data2_size={:016X}",
|
|
user_id[1], user_id[0], title_id, data1.size(), data2.size());
|
|
|
|
const auto& reporter{system.GetReporter()};
|
|
reporter.SavePlayReport(Core::Reporter::PlayReportType::System, title_id, {data1, data2},
|
|
std::nullopt, user_id);
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
rb.Push(RESULT_SUCCESS);
|
|
}
|
|
|
|
Core::System& system;
|
|
};
|
|
|
|
void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
|
|
std::make_shared<PlayReport>("prepo:a", system)->InstallAsService(service_manager);
|
|
std::make_shared<PlayReport>("prepo:a2", system)->InstallAsService(service_manager);
|
|
std::make_shared<PlayReport>("prepo:m", system)->InstallAsService(service_manager);
|
|
std::make_shared<PlayReport>("prepo:s", system)->InstallAsService(service_manager);
|
|
std::make_shared<PlayReport>("prepo:u", system)->InstallAsService(service_manager);
|
|
}
|
|
|
|
} // namespace Service::PlayReport
|