| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- // 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
|