mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-04-28 13:17:58 +03:00
Merge 1b5be1d1ac
into fbbfc07ff1
This commit is contained in:
commit
3132e529cf
8 changed files with 194 additions and 68 deletions
2
.github/workflows/apt-deps.txt
vendored
2
.github/workflows/apt-deps.txt
vendored
|
@ -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
|
||||||
|
|
2
.github/workflows/macports-deps.txt
vendored
2
.github/workflows/macports-deps.txt
vendored
|
@ -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
|
|
@ -82,7 +82,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||||
set(VCPKG_TARGET_TRIPLET x64-windows-static)
|
set(VCPKG_TARGET_TRIPLET x64-windows-static)
|
||||||
|
|
||||||
vcpkg_bootstrap()
|
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")
|
if (CMAKE_C_COMPILER_LAUNCHER MATCHES "ccache|sccache")
|
||||||
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)
|
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)
|
||||||
|
|
|
@ -306,14 +306,16 @@ endif()
|
||||||
find_package(SDL2)
|
find_package(SDL2)
|
||||||
set(SDL2-INCLUDE ${SDL2_INCLUDE_DIRS})
|
set(SDL2-INCLUDE ${SDL2_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
set(BUILD_REMOTE_CONTROL 1)
|
||||||
if (BUILD_REMOTE_CONTROL)
|
if (BUILD_REMOTE_CONTROL)
|
||||||
find_package(SDL2_net)
|
find_package(libwebsockets)
|
||||||
|
if(NOT libwebsockets_FOUND)
|
||||||
if(NOT SDL2_net_FOUND)
|
message(STATUS "libwebsockets not found. Disabling BUILD_REMOTE_CONTROL.")
|
||||||
message(STATUS "SDL2_net not found (it's possible the version installed is too old). Disabling BUILD_REMOTE_CONTROL.")
|
# set(BUILD_REMOTE_CONTROL 0)
|
||||||
set(BUILD_REMOTE_CONTROL 0)
|
|
||||||
else()
|
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()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -647,7 +649,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||||
"glu32;"
|
"glu32;"
|
||||||
"SDL2::SDL2;"
|
"SDL2::SDL2;"
|
||||||
"SDL2::SDL2main;"
|
"SDL2::SDL2main;"
|
||||||
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:SDL2_net::SDL2_net-static>"
|
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:websockets>"
|
||||||
"glfw;"
|
"glfw;"
|
||||||
"winmm;"
|
"winmm;"
|
||||||
"imm32;"
|
"imm32;"
|
||||||
|
@ -697,7 +699,7 @@ else()
|
||||||
"libultraship;"
|
"libultraship;"
|
||||||
"ZAPDLib;"
|
"ZAPDLib;"
|
||||||
SDL2::SDL2
|
SDL2::SDL2
|
||||||
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:SDL2_net::SDL2_net>"
|
"$<$<BOOL:${BUILD_REMOTE_CONTROL}>:websockets>"
|
||||||
${CMAKE_DL_LIBS}
|
${CMAKE_DL_LIBS}
|
||||||
Threads::Threads
|
Threads::Threads
|
||||||
)
|
)
|
||||||
|
|
|
@ -11,9 +11,14 @@ void Network::Enable(const char* host, uint16_t port) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SDLNet_ResolveHost(&networkAddress, host, port) == -1) {
|
lws_context_creation_info info;
|
||||||
SPDLOG_ERROR("[Network] SDLNet_ResolveHost: {}", SDLNet_GetError());
|
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;
|
isEnabled = true;
|
||||||
|
|
||||||
|
@ -48,7 +53,8 @@ void Network::OnDisconnected() {
|
||||||
|
|
||||||
void Network::SendDataToRemote(const char* payload) {
|
void Network::SendDataToRemote(const char* payload) {
|
||||||
SPDLOG_DEBUG("[Network] Sending data: {}", 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) {
|
void Network::SendJsonToRemote(nlohmann::json payload) {
|
||||||
|
@ -61,67 +67,71 @@ void Network::ReceiveFromServer() {
|
||||||
while (isEnabled) {
|
while (isEnabled) {
|
||||||
while (!isConnected && isEnabled) {
|
while (!isConnected && isEnabled) {
|
||||||
SPDLOG_TRACE("[Network] Attempting to make connection to server...");
|
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) {
|
// if (networkSocket) {
|
||||||
isConnected = true;
|
// isConnected = true;
|
||||||
SPDLOG_INFO("[Network] Connection to server established!");
|
// SPDLOG_INFO("[Network] Connection to server established!");
|
||||||
|
|
||||||
OnConnected();
|
// OnConnected();
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(1);
|
// commented out because of SDL_net removal
|
||||||
if (networkSocket) {
|
// SDLNet_SocketSet socketSet = SDLNet_AllocSocketSet(1);
|
||||||
SDLNet_TCP_AddSocket(socketSet, networkSocket);
|
// if (networkSocket) {
|
||||||
}
|
// SDLNet_TCP_AddSocket(socketSet, networkSocket);
|
||||||
|
// }
|
||||||
|
|
||||||
// Listen to socket messages
|
// Listen to socket messages
|
||||||
while (isConnected && networkSocket && isEnabled) {
|
// commented out because of SDL_net removal
|
||||||
// we check first if socket has data, to not block in the TCP_Recv
|
// while (isConnected && networkSocket && isEnabled) {
|
||||||
int socketsReady = SDLNet_CheckSockets(socketSet, 0);
|
// // we check first if socket has data, to not block in the TCP_Recv
|
||||||
|
// int socketsReady = SDLNet_CheckSockets(socketSet, 0);
|
||||||
|
|
||||||
if (socketsReady == -1) {
|
// if (socketsReady == -1) {
|
||||||
SPDLOG_ERROR("[Network] SDLNet_CheckSockets: {}", SDLNet_GetError());
|
// SPDLOG_ERROR("[Network] SDLNet_CheckSockets: {}", SDLNet_GetError());
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (socketsReady == 0) {
|
// if (socketsReady == 0) {
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
|
|
||||||
char remoteDataReceived[512];
|
// char remoteDataReceived[512];
|
||||||
memset(remoteDataReceived, 0, sizeof(remoteDataReceived));
|
// memset(remoteDataReceived, 0, sizeof(remoteDataReceived));
|
||||||
int len = SDLNet_TCP_Recv(networkSocket, &remoteDataReceived, sizeof(remoteDataReceived));
|
// int len = SDLNet_TCP_Recv(networkSocket, &remoteDataReceived, sizeof(remoteDataReceived));
|
||||||
if (!len || !networkSocket || len == -1) {
|
// if (!len || !networkSocket || len == -1) {
|
||||||
SPDLOG_ERROR("[Network] SDLNet_TCP_Recv: {}", SDLNet_GetError());
|
// SPDLOG_ERROR("[Network] SDLNet_TCP_Recv: {}", SDLNet_GetError());
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
|
||||||
HandleRemoteData(remoteDataReceived);
|
// HandleRemoteData(remoteDataReceived);
|
||||||
|
|
||||||
receivedData.append(remoteDataReceived, len);
|
// receivedData.append(remoteDataReceived, len);
|
||||||
|
|
||||||
// Proess all complete packets
|
// // Proess all complete packets
|
||||||
size_t delimiterPos = receivedData.find('\0');
|
// size_t delimiterPos = receivedData.find('\0');
|
||||||
while (delimiterPos != std::string::npos) {
|
// while (delimiterPos != std::string::npos) {
|
||||||
// Extract the complete packet until the delimiter
|
// // Extract the complete packet until the delimiter
|
||||||
std::string packet = receivedData.substr(0, delimiterPos);
|
// std::string packet = receivedData.substr(0, delimiterPos);
|
||||||
// Remove the packet (including the delimiter) from the received data
|
// // Remove the packet (including the delimiter) from the received data
|
||||||
receivedData.erase(0, delimiterPos + 1);
|
// receivedData.erase(0, delimiterPos + 1);
|
||||||
HandleRemoteJson(packet);
|
// HandleRemoteJson(packet);
|
||||||
// Find the next delimiter
|
// // Find the next delimiter
|
||||||
delimiterPos = receivedData.find('\0');
|
// delimiterPos = receivedData.find('\0');
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (isConnected) {
|
// commented out because of SDL_net removal
|
||||||
SDLNet_TCP_Close(networkSocket);
|
// if (isConnected) {
|
||||||
isConnected = false;
|
// SDLNet_TCP_Close(networkSocket);
|
||||||
OnDisconnected();
|
// isConnected = false;
|
||||||
SPDLOG_INFO("[Network] Ending receiving thread...");
|
// OnDisconnected();
|
||||||
}
|
// SPDLOG_INFO("[Network] Ending receiving thread...");
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,13 +4,20 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <SDL2/SDL_net.h>
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include "libwebsockets_windows.h"
|
||||||
|
#else
|
||||||
|
#include <libwebsockets.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
class Network {
|
class Network {
|
||||||
private:
|
private:
|
||||||
IPaddress networkAddress;
|
// commented out because of SDL_net removal
|
||||||
TCPsocket networkSocket;
|
// IPaddress networkAddress;
|
||||||
|
// TCPsocket networkSocket;
|
||||||
std::thread receiveThread;
|
std::thread receiveThread;
|
||||||
std::string receivedData;
|
std::string receivedData;
|
||||||
|
|
||||||
|
|
105
soh/soh/Network/libwebsockets_windows.h
Normal file
105
soh/soh/Network/libwebsockets_windows.h
Normal 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
|
|
@ -1264,7 +1264,8 @@ extern "C" void InitOTR() {
|
||||||
|
|
||||||
srand(now);
|
srand(now);
|
||||||
#ifdef ENABLE_REMOTE_CONTROL
|
#ifdef ENABLE_REMOTE_CONTROL
|
||||||
SDLNet_Init();
|
// commented out because of SDL_net removal
|
||||||
|
// SDLNet_Init();
|
||||||
if (CVarGetInteger(CVAR_REMOTE_CROWD_CONTROL("Enabled"), 0)) {
|
if (CVarGetInteger(CVAR_REMOTE_CROWD_CONTROL("Enabled"), 0)) {
|
||||||
CrowdControl::Instance->Enable();
|
CrowdControl::Instance->Enable();
|
||||||
}
|
}
|
||||||
|
@ -1288,7 +1289,8 @@ extern "C" void DeinitOTR() {
|
||||||
if (CVarGetInteger(CVAR_REMOTE_SAIL("Enabled"), 0)) {
|
if (CVarGetInteger(CVAR_REMOTE_SAIL("Enabled"), 0)) {
|
||||||
Sail::Instance->Disable();
|
Sail::Instance->Disable();
|
||||||
}
|
}
|
||||||
SDLNet_Quit();
|
// commented out because of SDL_net removal
|
||||||
|
// SDLNet_Quit();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Destroying gui here because we have shared ptrs to LUS objects which output to SPDLOG which is destroyed before
|
// Destroying gui here because we have shared ptrs to LUS objects which output to SPDLOG which is destroyed before
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue