diff --git a/src/common/config.cpp b/src/common/config.cpp index 12f95777e..9226a5bdf 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -47,6 +47,7 @@ static bool isShowSplash = false; static std::string isSideTrophy = "right"; static bool compatibilityData = false; static bool checkCompatibilityOnStartup = false; +static bool isConnectedToNetwork = false; // Input static int cursorState = HideCursorState::Idle; @@ -358,6 +359,10 @@ bool getCheckCompatibilityOnStartup() { return checkCompatibilityOnStartup; } +bool getIsConnectedToNetwork() { + return isConnectedToNetwork; +} + void setGpuId(s32 selectedGpuId) { gpuId = selectedGpuId; } @@ -643,6 +648,9 @@ void load(const std::filesystem::path& path) { compatibilityData = toml::find_or(general, "compatibilityEnabled", compatibilityData); checkCompatibilityOnStartup = toml::find_or(general, "checkCompatibilityOnStartup", checkCompatibilityOnStartup); + + isConnectedToNetwork = + toml::find_or(general, "isConnectedToNetwork", isConnectedToNetwork); chooseHomeTab = toml::find_or(general, "chooseHomeTab", chooseHomeTab); } @@ -824,6 +832,7 @@ void save(const std::filesystem::path& path) { data["General"]["sideTrophy"] = isSideTrophy; data["General"]["compatibilityEnabled"] = compatibilityData; data["General"]["checkCompatibilityOnStartup"] = checkCompatibilityOnStartup; + data["General"]["isConnectedToNetwork"] = isConnectedToNetwork; data["Input"]["cursorState"] = cursorState; data["Input"]["cursorHideTimeout"] = cursorHideTimeout; data["Input"]["useSpecialPad"] = useSpecialPad; @@ -922,6 +931,7 @@ void setDefaultValues() { isSideTrophy = "right"; compatibilityData = false; checkCompatibilityOnStartup = false; + isConnectedToNetwork = false; // Input cursorState = HideCursorState::Idle; diff --git a/src/common/config.h b/src/common/config.h index 937ea93fa..81e54da3f 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -113,6 +113,7 @@ std::filesystem::path GetSaveDataPath(); void setLoadGameSizeEnabled(bool enable); bool getCompatibilityEnabled(); bool getCheckCompatibilityOnStartup(); +bool getIsConnectedToNetwork(); std::string getUserName(); std::string getChooseHomeTab(); bool GetUseUnifiedInputConfig(); diff --git a/src/core/libraries/network/net_ctl_obj.cpp b/src/core/libraries/network/net_ctl_obj.cpp index ad944cd9c..a295477b6 100644 --- a/src/core/libraries/network/net_ctl_obj.cpp +++ b/src/core/libraries/network/net_ctl_obj.cpp @@ -2,6 +2,8 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include "common/config.h" +#include "common/logging/log.h" #include "core/libraries/network/net_ctl_codes.h" #include "core/libraries/network/net_ctl_obj.h" #include "core/tls.h" @@ -44,18 +46,22 @@ s32 NetCtlInternal::RegisterNpToolkitCallback(OrbisNetCtlCallbackForNpToolkit fu void NetCtlInternal::CheckCallback() { std::scoped_lock lock{m_mutex}; + const auto event = Config::getIsConnectedToNetwork() ? ORBIS_NET_CTL_EVENT_TYPE_IPOBTAINED + : ORBIS_NET_CTL_EVENT_TYPE_DISCONNECTED; for (const auto [func, arg] : callbacks) { if (func != nullptr) { - Core::ExecuteGuest(func, ORBIS_NET_CTL_EVENT_TYPE_DISCONNECTED, arg); + Core::ExecuteGuest(func, event, arg); } } } void NetCtlInternal::CheckNpToolkitCallback() { std::scoped_lock lock{m_mutex}; + const auto event = Config::getIsConnectedToNetwork() ? ORBIS_NET_CTL_EVENT_TYPE_IPOBTAINED + : ORBIS_NET_CTL_EVENT_TYPE_DISCONNECTED; for (const auto [func, arg] : nptool_callbacks) { if (func != nullptr) { - Core::ExecuteGuest(func, ORBIS_NET_CTL_EVENT_TYPE_DISCONNECTED, arg); + Core::ExecuteGuest(func, event, arg); } } } diff --git a/src/core/libraries/network/netctl.cpp b/src/core/libraries/network/netctl.cpp index 54a273dc3..14623cd85 100644 --- a/src/core/libraries/network/netctl.cpp +++ b/src/core/libraries/network/netctl.cpp @@ -13,6 +13,7 @@ #endif #include +#include "common/config.h" #include "common/logging/log.h" #include "core/libraries/error_codes.h" #include "core/libraries/libs.h" @@ -160,6 +161,8 @@ int PS4_SYSV_ABI sceNetCtlGetIfStat() { } int PS4_SYSV_ABI sceNetCtlGetInfo(int code, OrbisNetCtlInfo* info) { + LOG_DEBUG(Lib_NetCtl, "code = {}", code); + switch (code) { case ORBIS_NET_CTL_INFO_DEVICE: info->device = ORBIS_NET_CTL_DEVICE_WIRED; @@ -173,7 +176,8 @@ int PS4_SYSV_ABI sceNetCtlGetInfo(int code, OrbisNetCtlInfo* info) { info->mtu = 1500; // default value break; case ORBIS_NET_CTL_INFO_LINK: - info->link = ORBIS_NET_CTL_LINK_DISCONNECTED; + info->link = Config::getIsConnectedToNetwork() ? ORBIS_NET_CTL_LINK_CONNECTED + : ORBIS_NET_CTL_LINK_DISCONNECTED; break; case ORBIS_NET_CTL_INFO_IP_ADDRESS: { strcpy(info->ip_address, @@ -271,7 +275,11 @@ int PS4_SYSV_ABI sceNetCtlGetScanInfoForSsidScanIpcInt() { } int PS4_SYSV_ABI sceNetCtlGetState(int* state) { - *state = ORBIS_NET_CTL_STATE_DISCONNECTED; + const auto connected = Config::getIsConnectedToNetwork(); + LOG_DEBUG(Lib_NetCtl, "connected = {}", connected); + const auto current_state = + connected ? ORBIS_NET_CTL_STATE_IPOBTAINED : ORBIS_NET_CTL_STATE_DISCONNECTED; + *state = current_state; return ORBIS_OK; } diff --git a/src/emulator.cpp b/src/emulator.cpp index 9485b0e23..7e6b36cf1 100644 --- a/src/emulator.cpp +++ b/src/emulator.cpp @@ -134,6 +134,8 @@ void Emulator::Run(std::filesystem::path file, const std::vector ar LOG_INFO(Config, "General LogType: {}", Config::getLogType()); LOG_INFO(Config, "General isNeo: {}", Config::isNeoModeConsole()); + LOG_INFO(Config, "General isConnectedToNetwork: {}", Config::getIsConnectedToNetwork()); + LOG_INFO(Config, "General isPsnSignedIn: {}", Config::getPSNSignedIn()); LOG_INFO(Config, "GPU isNullGpu: {}", Config::nullGpu()); LOG_INFO(Config, "GPU readbacks: {}", Config::readbacks()); LOG_INFO(Config, "GPU readbackLinearImages: {}", Config::readbackLinearImages());