This commit is contained in:
briaguya 2025-04-28 06:07:30 +00:00 committed by GitHub
commit 3132e529cf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 194 additions and 68 deletions

View file

@ -1 +1 @@
libusb-dev libusb-1.0-0-dev libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev nlohmann-json3-dev libtinyxml2-dev libspdlog-dev ninja-build
libusb-dev libusb-1.0-0-dev libsdl2-dev libwebsockets-dev libpng-dev libglew-dev nlohmann-json3-dev libtinyxml2-dev libspdlog-dev ninja-build

View file

@ -1 +1 @@
libsdl2 +universal libsdl2_net +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal
libsdl2 +universal libwebsockets +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal

View file

@ -82,7 +82,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(VCPKG_TARGET_TRIPLET x64-windows-static)
vcpkg_bootstrap()
vcpkg_install_packages(zlib bzip2 libzip libpng sdl2 sdl2-net glew glfw3 nlohmann-json tinyxml2 spdlog)
vcpkg_install_packages(zlib bzip2 libzip libpng sdl2 libwebsockets glew glfw3 nlohmann-json tinyxml2 spdlog)
if (CMAKE_C_COMPILER_LAUNCHER MATCHES "ccache|sccache")
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)

View file

@ -306,14 +306,16 @@ endif()
find_package(SDL2)
set(SDL2-INCLUDE ${SDL2_INCLUDE_DIRS})
set(BUILD_REMOTE_CONTROL 1)
if (BUILD_REMOTE_CONTROL)
find_package(SDL2_net)
if(NOT SDL2_net_FOUND)
message(STATUS "SDL2_net not found (it's possible the version installed is too old). Disabling BUILD_REMOTE_CONTROL.")
set(BUILD_REMOTE_CONTROL 0)
find_package(libwebsockets)
if(NOT libwebsockets_FOUND)
message(STATUS "libwebsockets not found. Disabling BUILD_REMOTE_CONTROL.")
# set(BUILD_REMOTE_CONTROL 0)
else()
set(SDL2-NET-INCLUDE ${SDL_NET_INCLUDE_DIRS})
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
target_compile_definitions(${PROJECT_NAME} PRIVATE _WINSOCKAPI_)
endif()
endif()
endif()
@ -647,7 +649,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
"glu32;"
"SDL2::SDL2;"
"SDL2::SDL2main;"
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:SDL2_net::SDL2_net-static>"
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:websockets>"
"glfw;"
"winmm;"
"imm32;"
@ -697,7 +699,7 @@ else()
"libultraship;"
"ZAPDLib;"
SDL2::SDL2
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:SDL2_net::SDL2_net>"
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:websockets>"
${CMAKE_DL_LIBS}
Threads::Threads
)

View file

@ -11,9 +11,14 @@ void Network::Enable(const char* host, uint16_t port) {
return;
}
if (SDLNet_ResolveHost(&networkAddress, host, port) == -1) {
SPDLOG_ERROR("[Network] SDLNet_ResolveHost: {}", SDLNet_GetError());
}
lws_context_creation_info info;
lws_context* context;
context = lws_create_context(&info);
// commented out because of SDL_net removal
// if (SDLNet_ResolveHost(&networkAddress, host, port) == -1) {
// SPDLOG_ERROR("[Network] SDLNet_ResolveHost: {}", SDLNet_GetError());
// }
isEnabled = true;
@ -48,7 +53,8 @@ void Network::OnDisconnected() {
void Network::SendDataToRemote(const char* payload) {
SPDLOG_DEBUG("[Network] Sending data: {}", payload);
SDLNet_TCP_Send(networkSocket, payload, strlen(payload) + 1);
// commented out because of SDL_net removal
// SDLNet_TCP_Send(networkSocket, payload, strlen(payload) + 1);
}
void Network::SendJsonToRemote(nlohmann::json payload) {
@ -61,67 +67,71 @@ void Network::ReceiveFromServer() {
while (isEnabled) {
while (!isConnected && isEnabled) {
SPDLOG_TRACE("[Network] Attempting to make connection to server...");
networkSocket = SDLNet_TCP_Open(&networkAddress);
// commented out because of SDL_net removal
// networkSocket = SDLNet_TCP_Open(&networkAddress);
if (networkSocket) {
isConnected = true;
SPDLOG_INFO("[Network] Connection to server established!");
// if (networkSocket) {
// isConnected = true;
// SPDLOG_INFO("[Network] Connection to server established!");
OnConnected();
break;
}
// OnConnected();
// break;
// }
}
SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(1);
if (networkSocket) {
SDLNet_TCP_AddSocket(socketSet, networkSocket);
}
// commented out because of SDL_net removal
// SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(1);
// if (networkSocket) {
// SDLNet_TCP_AddSocket(socketSet, networkSocket);
// }
// Listen to socket messages
while (isConnected && networkSocket && isEnabled) {
// we check first if socket has data, to not block in the TCP_Recv
int socketsReady = SDLNet_CheckSockets(socketSet, 0);
// commented out because of SDL_net removal
// while (isConnected && networkSocket && isEnabled) {
// // we check first if socket has data, to not block in the TCP_Recv
// int socketsReady = SDLNet_CheckSockets(socketSet, 0);
if (socketsReady == -1) {
SPDLOG_ERROR("[Network] SDLNet_CheckSockets: {}", SDLNet_GetError());
break;
}
// if (socketsReady == -1) {
// SPDLOG_ERROR("[Network] SDLNet_CheckSockets: {}", SDLNet_GetError());
// break;
// }
if (socketsReady == 0) {
continue;
}
// if (socketsReady == 0) {
// continue;
// }
char remoteDataReceived[512];
memset(remoteDataReceived, 0, sizeof(remoteDataReceived));
int len = SDLNet_TCP_Recv(networkSocket, &remoteDataReceived, sizeof(remoteDataReceived));
if (!len || !networkSocket || len == -1) {
SPDLOG_ERROR("[Network] SDLNet_TCP_Recv: {}", SDLNet_GetError());
break;
}
// char remoteDataReceived[512];
// memset(remoteDataReceived, 0, sizeof(remoteDataReceived));
// int len = SDLNet_TCP_Recv(networkSocket, &remoteDataReceived, sizeof(remoteDataReceived));
// if (!len || !networkSocket || len == -1) {
// SPDLOG_ERROR("[Network] SDLNet_TCP_Recv: {}", SDLNet_GetError());
// break;
// }
HandleRemoteData(remoteDataReceived);
// HandleRemoteData(remoteDataReceived);
receivedData.append(remoteDataReceived, len);
// receivedData.append(remoteDataReceived, len);
// Proess all complete packets
size_t delimiterPos = receivedData.find('\0');
while (delimiterPos != std::string::npos) {
// Extract the complete packet until the delimiter
std::string packet = receivedData.substr(0, delimiterPos);
// Remove the packet (including the delimiter) from the received data
receivedData.erase(0, delimiterPos + 1);
HandleRemoteJson(packet);
// Find the next delimiter
delimiterPos = receivedData.find('\0');
}
}
// // Proess all complete packets
// size_t delimiterPos = receivedData.find('\0');
// while (delimiterPos != std::string::npos) {
// // Extract the complete packet until the delimiter
// std::string packet = receivedData.substr(0, delimiterPos);
// // Remove the packet (including the delimiter) from the received data
// receivedData.erase(0, delimiterPos + 1);
// HandleRemoteJson(packet);
// // Find the next delimiter
// delimiterPos = receivedData.find('\0');
// }
// }
if (isConnected) {
SDLNet_TCP_Close(networkSocket);
isConnected = false;
OnDisconnected();
SPDLOG_INFO("[Network] Ending receiving thread...");
}
// commented out because of SDL_net removal
// if (isConnected) {
// SDLNet_TCP_Close(networkSocket);
// isConnected = false;
// OnDisconnected();
// SPDLOG_INFO("[Network] Ending receiving thread...");
// }
}
}

View file

@ -4,13 +4,20 @@
#ifdef __cplusplus
#include <thread>
#include <SDL2/SDL_net.h>
#ifdef _WIN32
#include "libwebsockets_windows.h"
#else
#include <libwebsockets.h>
#endif
#include <nlohmann/json.hpp>
class Network {
private:
IPaddress networkAddress;
TCPsocket networkSocket;
// commented out because of SDL_net removal
// IPaddress networkAddress;
// TCPsocket networkSocket;
std::thread receiveThread;
std::string receivedData;

View file

@ -0,0 +1,105 @@
// undef a couple int types
#undef u32
#undef u64
// undef all the HTTP response codes from wininet.h
#undef HTTP_STATUS_CONTINUE
#undef HTTP_STATUS_SWITCH_PROTOCOLS
#undef HTTP_STATUS_OK
#undef HTTP_STATUS_CREATED
#undef HTTP_STATUS_ACCEPTED
#undef HTTP_STATUS_PARTIAL
#undef HTTP_STATUS_NO_CONTENT
#undef HTTP_STATUS_RESET_CONTENT
#undef HTTP_STATUS_PARTIAL_CONTENT
#undef HTTP_STATUS_AMBIGUOUS
#undef HTTP_STATUS_MOVED
#undef HTTP_STATUS_REDIRECT
#undef HTTP_STATUS_REDIRECT_METHOD
#undef HTTP_STATUS_NOT_MODIFIED
#undef HTTP_STATUS_USE_PROXY
#undef HTTP_STATUS_REDIRECT_KEEP_VERB
#undef HTTP_STATUS_PERMANENT_REDIRECT
#undef HTTP_STATUS_BAD_REQUEST
#undef HTTP_STATUS_DENIED
#undef HTTP_STATUS_PAYMENT_REQ
#undef HTTP_STATUS_FORBIDDEN
#undef HTTP_STATUS_NOT_FOUND
#undef HTTP_STATUS_BAD_METHOD
#undef HTTP_STATUS_NONE_ACCEPTABLE
#undef HTTP_STATUS_PROXY_AUTH_REQ
#undef HTTP_STATUS_REQUEST_TIMEOUT
#undef HTTP_STATUS_CONFLICT
#undef HTTP_STATUS_GONE
#undef HTTP_STATUS_LENGTH_REQUIRED
#undef HTTP_STATUS_PRECOND_FAILED
#undef HTTP_STATUS_REQUEST_TOO_LARGE
#undef HTTP_STATUS_URI_TOO_LONG
#undef HTTP_STATUS_UNSUPPORTED_MEDIA
#undef HTTP_STATUS_MISDIRECTED_REQUEST
#undef HTTP_STATUS_RETRY_WITH
#undef HTTP_STATUS_SERVER_ERROR
#undef HTTP_STATUS_NOT_SUPPORTED
#undef HTTP_STATUS_BAD_GATEWAY
#undef HTTP_STATUS_SERVICE_UNAVAIL
#undef HTTP_STATUS_GATEWAY_TIMEOUT
#undef HTTP_STATUS_VERSION_NOT_SUP
#undef HTTP_STATUS_FIRST
#undef HTTP_STATUS_LAST
// actually include libwebsockets
#include <libwebsockets.h>
// redefine the int types
#define u32 uint32_t
#define u64 uint64_t
// redefine the responses from wininet.h
#define HTTP_STATUS_CONTINUE 100 // OK to continue with request
#define HTTP_STATUS_SWITCH_PROTOCOLS 101 // server has switched protocols in upgrade header
#define HTTP_STATUS_OK 200 // request completed
#define HTTP_STATUS_CREATED 201 // object created, reason = new URI
#define HTTP_STATUS_ACCEPTED 202 // async completion (TBS)
#define HTTP_STATUS_PARTIAL 203 // partial completion
#define HTTP_STATUS_NO_CONTENT 204 // no info to return
#define HTTP_STATUS_RESET_CONTENT 205 // request completed, but clear form
#define HTTP_STATUS_PARTIAL_CONTENT 206 // partial GET furfilled
#define HTTP_STATUS_AMBIGUOUS 300 // server couldn't decide what to return
#define HTTP_STATUS_MOVED 301 // object permanently moved
#define HTTP_STATUS_REDIRECT 302 // object temporarily moved
#define HTTP_STATUS_REDIRECT_METHOD 303 // redirection w/ new access method
#define HTTP_STATUS_NOT_MODIFIED 304 // if-modified-since was not modified
#define HTTP_STATUS_USE_PROXY 305 // redirection to proxy, location header specifies proxy to use
#define HTTP_STATUS_REDIRECT_KEEP_VERB 307 // HTTP/1.1: keep same verb
#define HTTP_STATUS_PERMANENT_REDIRECT 308 // Object permanently moved keep verb
#define HTTP_STATUS_BAD_REQUEST 400 // invalid syntax
#define HTTP_STATUS_DENIED 401 // access denied
#define HTTP_STATUS_PAYMENT_REQ 402 // payment required
#define HTTP_STATUS_FORBIDDEN 403 // request forbidden
#define HTTP_STATUS_NOT_FOUND 404 // object not found
#define HTTP_STATUS_BAD_METHOD 405 // method is not allowed
#define HTTP_STATUS_NONE_ACCEPTABLE 406 // no response acceptable to client found
#define HTTP_STATUS_PROXY_AUTH_REQ 407 // proxy authentication required
#define HTTP_STATUS_REQUEST_TIMEOUT 408 // server timed out waiting for request
#define HTTP_STATUS_CONFLICT 409 // user should resubmit with more info
#define HTTP_STATUS_GONE 410 // the resource is no longer available
#define HTTP_STATUS_LENGTH_REQUIRED 411 // the server refused to accept request w/o a length
#define HTTP_STATUS_PRECOND_FAILED 412 // precondition given in request failed
#define HTTP_STATUS_REQUEST_TOO_LARGE 413 // request entity was too large
#define HTTP_STATUS_URI_TOO_LONG 414 // request URI too long
#define HTTP_STATUS_UNSUPPORTED_MEDIA 415 // unsupported media type
#define HTTP_STATUS_MISDIRECTED_REQUEST 421 // misdirected request
#define HTTP_STATUS_RETRY_WITH 449 // retry after doing the appropriate action.
#define HTTP_STATUS_SERVER_ERROR 500 // internal server error
#define HTTP_STATUS_NOT_SUPPORTED 501 // required not supported
#define HTTP_STATUS_BAD_GATEWAY 502 // error response received from gateway
#define HTTP_STATUS_SERVICE_UNAVAIL 503 // temporarily overloaded
#define HTTP_STATUS_GATEWAY_TIMEOUT 504 // timed out waiting for gateway
#define HTTP_STATUS_VERSION_NOT_SUP 505 // HTTP version not supported
#define HTTP_STATUS_FIRST HTTP_STATUS_CONTINUE
#define HTTP_STATUS_LAST HTTP_STATUS_VERSION_NOT_SUP

View file

@ -1264,7 +1264,8 @@ extern "C" void InitOTR() {
srand(now);
#ifdef ENABLE_REMOTE_CONTROL
SDLNet_Init();
// commented out because of SDL_net removal
// SDLNet_Init();
if (CVarGetInteger(CVAR_REMOTE_CROWD_CONTROL("Enabled"), 0)) {
CrowdControl::Instance->Enable();
}
@ -1288,7 +1289,8 @@ extern "C" void DeinitOTR() {
if (CVarGetInteger(CVAR_REMOTE_SAIL("Enabled"), 0)) {
Sail::Instance->Disable();
}
SDLNet_Quit();
// commented out because of SDL_net removal
// SDLNet_Quit();
#endif
// Destroying gui here because we have shared ptrs to LUS objects which output to SPDLOG which is destroyed before