1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "common/string_util.h"
#include "core/core.h"
#include "core/hle/service/ipc_helpers.h"
#include "core/hle/service/ngc/ngc.h"
#include "core/hle/service/server_manager.h"
#include "core/hle/service/service.h"
namespace Service::NGC {
class NgctServiceImpl final : public ServiceFramework<NgctServiceImpl> {
public:
explicit NgctServiceImpl(Core::System& system_) : ServiceFramework{system_, "ngct:u"} {
// clang-format off
static const FunctionInfo functions[] = {
{0, &NgctServiceImpl::Match, "Match"},
{1, &NgctServiceImpl::Filter, "Filter"},
};
// clang-format on
RegisterHandlers(functions);
}
private:
void Match(HLERequestContext& ctx) {
const auto buffer = ctx.ReadBuffer();
const auto text = Common::StringFromFixedZeroTerminatedBuffer(
reinterpret_cast<const char*>(buffer.data()), buffer.size());
LOG_WARNING(Service_NGC, "(STUBBED) called, text={}", text);
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
// Return false since we don't censor anything
rb.Push(false);
}
void Filter(HLERequestContext& ctx) {
const auto buffer = ctx.ReadBuffer();
const auto text = Common::StringFromFixedZeroTerminatedBuffer(
reinterpret_cast<const char*>(buffer.data()), buffer.size());
LOG_WARNING(Service_NGC, "(STUBBED) called, text={}", text);
// Return the same string since we don't censor anything
ctx.WriteBuffer(buffer);
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
};
class NgcServiceImpl final : public ServiceFramework<NgcServiceImpl> {
public:
explicit NgcServiceImpl(Core::System& system_) : ServiceFramework(system_, "ngc:u") {
// clang-format off
static const FunctionInfo functions[] = {
{0, &NgcServiceImpl::GetContentVersion, "GetContentVersion"},
{1, &NgcServiceImpl::Check, "Check"},
{2, &NgcServiceImpl::Mask, "Mask"},
{3, &NgcServiceImpl::Reload, "Reload"},
};
// clang-format on
RegisterHandlers(functions);
}
private:
static constexpr u32 NgcContentVersion = 1;
// This is nn::ngc::detail::ProfanityFilterOption
struct ProfanityFilterOption {
INSERT_PADDING_BYTES_NOINIT(0x20);
};
static_assert(sizeof(ProfanityFilterOption) == 0x20,
"ProfanityFilterOption has incorrect size");
void GetContentVersion(HLERequestContext& ctx) {
LOG_INFO(Service_NGC, "(STUBBED) called");
// This calls nn::ngc::ProfanityFilter::GetContentVersion
const u32 version = NgcContentVersion;
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push(version);
}
void Check(HLERequestContext& ctx) {
LOG_INFO(Service_NGC, "(STUBBED) called");
struct InputParameters {
u32 flags;
ProfanityFilterOption option;
};
IPC::RequestParser rp{ctx};
[[maybe_unused]] const auto params = rp.PopRaw<InputParameters>();
[[maybe_unused]] const auto input = ctx.ReadBuffer(0);
// This calls nn::ngc::ProfanityFilter::CheckProfanityWords
const u32 out_flags = 0;
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push(out_flags);
}
void Mask(HLERequestContext& ctx) {
LOG_INFO(Service_NGC, "(STUBBED) called");
struct InputParameters {
u32 flags;
ProfanityFilterOption option;
};
IPC::RequestParser rp{ctx};
[[maybe_unused]] const auto params = rp.PopRaw<InputParameters>();
const auto input = ctx.ReadBuffer(0);
// This calls nn::ngc::ProfanityFilter::MaskProfanityWordsInText
const u32 out_flags = 0;
ctx.WriteBuffer(input);
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push(out_flags);
}
void Reload(HLERequestContext& ctx) {
LOG_INFO(Service_NGC, "(STUBBED) called");
// This reloads the database.
IPC::ResponseBuilder rb{ctx, 2};
rb.Push(ResultSuccess);
}
};
void LoopProcess(Core::System& system) {
auto server_manager = std::make_unique<ServerManager>(system);
server_manager->RegisterNamedService("ngct:u", std::make_shared<NgctServiceImpl>(system));
server_manager->RegisterNamedService("ngc:u", std::make_shared<NgcServiceImpl>(system));
ServerManager::RunServer(std::move(server_manager));
}
} // namespace Service::NGC
|