// 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, nullptr, "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 ResultVal 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& fqdn_out) { const auto res = ResolveImpl(fqdn_in); if (res.Failed()) { return res.Code(); } 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 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 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::GetApplicationServerEnvironmentType(HLERequestContext& ctx) { IPC::ResponseBuilder rb{ctx, 3}; rb.Push(ResultSuccess); rb.Push(static_cast(ServerEnvironmentType::Lp)); } NSD::~NSD() = default; } // namespace Service::Sockets