mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2025-01-10 16:50:05 +00:00
120 lines
3.8 KiB
C++
120 lines
3.8 KiB
C++
// 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
|