| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
- // SPDX-License-Identifier: GPL-2.0-or-later
- #include "core/hle/service/ipc_helpers.h"
- #include "core/hle/service/sockets/nsd.h"
- #include "common/string_util.h"
- namespace Service::Sockets {
- constexpr Result ResultOverflow{ErrorModule::NSD, 6};
- // This is nn::oe::ServerEnvironmentType
- enum class ServerEnvironmentType : u8 {
- Dd,
- Lp,
- Sd,
- Sp,
- Dp,
- };
- NSD::NSD(Core::System& system_, const char* name) : ServiceFramework{system_, name} {
- // clang-format off
- static const FunctionInfo functions[] = {
- {5, nullptr, "GetSettingUrl"},
- {10, nullptr, "GetSettingName"},
- {11, &NSD::GetEnvironmentIdentifier, "GetEnvironmentIdentifier"},
- {12, nullptr, "GetDeviceId"},
- {13, nullptr, "DeleteSettings"},
- {14, nullptr, "ImportSettings"},
- {15, nullptr, "SetChangeEnvironmentIdentifierDisabled"},
- {20, &NSD::Resolve, "Resolve"},
- {21, &NSD::ResolveEx, "ResolveEx"},
- {30, nullptr, "GetNasServiceSetting"},
- {31, nullptr, "GetNasServiceSettingEx"},
- {40, nullptr, "GetNasRequestFqdn"},
- {41, nullptr, "GetNasRequestFqdnEx"},
- {42, nullptr, "GetNasApiFqdn"},
- {43, nullptr, "GetNasApiFqdnEx"},
- {50, nullptr, "GetCurrentSetting"},
- {51, nullptr, "WriteTestParameter"},
- {52, nullptr, "ReadTestParameter"},
- {60, nullptr, "ReadSaveDataFromFsForTest"},
- {61, nullptr, "WriteSaveDataToFsForTest"},
- {62, nullptr, "DeleteSaveDataOfFsForTest"},
- {63, nullptr, "IsChangeEnvironmentIdentifierDisabled"},
- {64, nullptr, "SetWithoutDomainExchangeFqdns"},
- {100, &NSD::GetApplicationServerEnvironmentType, "GetApplicationServerEnvironmentType"},
- {101, nullptr, "SetApplicationServerEnvironmentType"},
- {102, nullptr, "DeleteApplicationServerEnvironmentType"},
- };
- // clang-format on
- RegisterHandlers(functions);
- }
- static std::string ResolveImpl(const std::string& fqdn_in) {
- // The real implementation makes various substitutions.
- // For now we just return the string as-is, which is good enough when not
- // connecting to real Nintendo servers.
- LOG_WARNING(Service, "(STUBBED) called, fqdn_in={}", fqdn_in);
- return fqdn_in;
- }
- static Result ResolveCommon(const std::string& fqdn_in, std::array<char, 0x100>& fqdn_out) {
- const auto res = ResolveImpl(fqdn_in);
- if (res.size() >= fqdn_out.size()) {
- return ResultOverflow;
- }
- std::memcpy(fqdn_out.data(), res.c_str(), res.size() + 1);
- return ResultSuccess;
- }
- void NSD::Resolve(HLERequestContext& ctx) {
- const std::string fqdn_in = Common::StringFromBuffer(ctx.ReadBuffer(0));
- std::array<char, 0x100> fqdn_out{};
- const Result res = ResolveCommon(fqdn_in, fqdn_out);
- ctx.WriteBuffer(fqdn_out);
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(res);
- }
- void NSD::ResolveEx(HLERequestContext& ctx) {
- const std::string fqdn_in = Common::StringFromBuffer(ctx.ReadBuffer(0));
- std::array<char, 0x100> fqdn_out;
- const Result res = ResolveCommon(fqdn_in, fqdn_out);
- if (res.IsError()) {
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(res);
- return;
- }
- ctx.WriteBuffer(fqdn_out);
- IPC::ResponseBuilder rb{ctx, 4};
- rb.Push(ResultSuccess);
- rb.Push(ResultSuccess);
- }
- void NSD::GetEnvironmentIdentifier(HLERequestContext& ctx) {
- const std::string environment_identifier = "lp1";
- ctx.WriteBuffer(environment_identifier);
- IPC::ResponseBuilder rb{ctx, 2};
- rb.Push(ResultSuccess);
- }
- void NSD::GetApplicationServerEnvironmentType(HLERequestContext& ctx) {
- IPC::ResponseBuilder rb{ctx, 3};
- rb.Push(ResultSuccess);
- rb.Push(static_cast<u32>(ServerEnvironmentType::Lp));
- }
- NSD::~NSD() = default;
- } // namespace Service::Sockets
|