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)
|
||||
|
||||
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)
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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...");
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
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);
|
||||
#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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue