diff --git a/.github/workflows/apt-deps.txt b/.github/workflows/apt-deps.txt index 51e9574f8..12fafafe8 100644 --- a/.github/workflows/apt-deps.txt +++ b/.github/workflows/apt-deps.txt @@ -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 diff --git a/.github/workflows/macports-deps.txt b/.github/workflows/macports-deps.txt index d15039078..75bc54ac4 100644 --- a/.github/workflows/macports-deps.txt +++ b/.github/workflows/macports-deps.txt @@ -1 +1 @@ -libsdl2 +universal libsdl2_net +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal \ No newline at end of file +libsdl2 +universal libwebsockets +universal libpng +universal glew +universal libzip +universal nlohmann-json +universal tinyxml2 +universal \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index ec9f14f5b..cf3ef355d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/soh/CMakeLists.txt b/soh/CMakeLists.txt index 7277b2dfb..33db2b776 100644 --- a/soh/CMakeLists.txt +++ b/soh/CMakeLists.txt @@ -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;" - "$<$:SDL2_net::SDL2_net-static>" + "$<$:websockets>" "glfw;" "winmm;" "imm32;" @@ -697,7 +699,7 @@ else() "libultraship;" "ZAPDLib;" SDL2::SDL2 - "$<$:SDL2_net::SDL2_net>" + "$<$:websockets>" ${CMAKE_DL_LIBS} Threads::Threads ) diff --git a/soh/soh/Network/Network.cpp b/soh/soh/Network/Network.cpp index c0bd87e6e..90775b9eb 100644 --- a/soh/soh/Network/Network.cpp +++ b/soh/soh/Network/Network.cpp @@ -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..."); + // } } } diff --git a/soh/soh/Network/Network.h b/soh/soh/Network/Network.h index 6bd4f8164..a5490f93a 100644 --- a/soh/soh/Network/Network.h +++ b/soh/soh/Network/Network.h @@ -4,13 +4,20 @@ #ifdef __cplusplus #include -#include + +#ifdef _WIN32 +#include "libwebsockets_windows.h" +#else +#include +#endif + #include class Network { private: - IPaddress networkAddress; - TCPsocket networkSocket; + // commented out because of SDL_net removal + // IPaddress networkAddress; + // TCPsocket networkSocket; std::thread receiveThread; std::string receivedData; diff --git a/soh/soh/Network/libwebsockets_windows.h b/soh/soh/Network/libwebsockets_windows.h new file mode 100644 index 000000000..ec81df321 --- /dev/null +++ b/soh/soh/Network/libwebsockets_windows.h @@ -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 + +// 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 diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp index 72030657e..8fb0615f4 100644 --- a/soh/soh/OTRGlobals.cpp +++ b/soh/soh/OTRGlobals.cpp @@ -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