diff --git a/CMakeLists.txt b/CMakeLists.txt index e21789d..86a9f7d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ include_directories( "${PROJECT_SOURCE_DIR}/dependencies/getopt-for-windows" "${PROJECT_SOURCE_DIR}/dependencies/libwebsockets/build/include" "${PROJECT_SOURCE_DIR}/dependencies/openssl/${PROJECT_ARCH}/include" + "${PROJECT_SOURCE_DIR}/dependencies/sqlite" ) link_directories( @@ -183,6 +184,8 @@ add_executable( add_executable( server +# dependencies/sqlite/sqlite3.h +# dependencies/sqlite/sqlite3.c dependencies/minIni/dev/minIni.h dependencies/minIni/dev/minIni.c src/packages/server/IZ_common.h @@ -197,7 +200,7 @@ add_executable( src/packages/server/net/svc/IZ_wsserver.h src/packages/server/net/core/IZ_websocket.h src/packages/server/net/core/IZ_websocket.c -) + src/packages/server/net/IZ_net.c src/packages/server/net/IZ_net.h) target_link_libraries( server diff --git a/dependencies.txt b/dependencies.txt index 6c94729..e3f31ef 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -4,3 +4,4 @@ https://github.com/PortMidi/portmidi https://github.com/EsotericSoftware/spine-runtimes https://github.com/Chunde/getopt-for-windows https://libwebsockets.org/repo/libwebsockets +https://www.sqlite.org/download.html (use SQLite amalgamated source code) diff --git a/src/packages/game/input/IZ_joystick.c b/src/packages/game/input/IZ_joystick.c index 91810b4..91d6982 100644 --- a/src/packages/game/input/IZ_joystick.c +++ b/src/packages/game/input/IZ_joystick.c @@ -106,7 +106,7 @@ void IZ_JoystickLoadConfig(IZ_JoystickState(* state)[IZ_PLAYERS], const char* co (*state)[player_index].config.control_mapping[control_index] = ini_getl( control_mapping_section_name, ACTION_NAMES[control_index], - IZ_DEFAULT_JOYSTICK_STATE[player_index].config.control_mapping[control_index], + IZ_JOYSTICK_DEFAULT_STATE[player_index].config.control_mapping[control_index], config_path ); } @@ -162,7 +162,7 @@ IZ_ProcedureResult IZ_JoystickSaveConfig(IZ_JoystickState(* state)[IZ_PLAYERS], } IZ_ProcedureResult IZ_JoystickInitialize(IZ_JoystickState(* state)[IZ_PLAYERS], const char* config_path, u8 argc, const char* argv[]) { - SDL_memcpy(state, &IZ_DEFAULT_JOYSTICK_STATE, sizeof(IZ_JoystickState)); + SDL_memcpy(state, &IZ_JOYSTICK_DEFAULT_STATE, sizeof(IZ_JoystickState)); IZ_JoystickLoadConfig(state, config_path); if (IZ_JoystickSaveConfig(state, config_path) < 0) { diff --git a/src/packages/game/input/IZ_joystick.h b/src/packages/game/input/IZ_joystick.h index 2133186..eb4d16d 100644 --- a/src/packages/game/input/IZ_joystick.h +++ b/src/packages/game/input/IZ_joystick.h @@ -29,7 +29,7 @@ typedef struct { IZ_JoystickConfig config; } IZ_JoystickState; -static const IZ_JoystickState IZ_DEFAULT_JOYSTICK_STATE[IZ_PLAYERS] = { +static const IZ_JoystickState IZ_JOYSTICK_DEFAULT_STATE[IZ_PLAYERS] = { { .config = { .control_mapping = { diff --git a/src/packages/game/input/IZ_keyboard.c b/src/packages/game/input/IZ_keyboard.c index 85f18cc..90336ed 100644 --- a/src/packages/game/input/IZ_keyboard.c +++ b/src/packages/game/input/IZ_keyboard.c @@ -58,7 +58,7 @@ void IZ_KeyboardLoadConfig(IZ_KeyboardState(* state)[IZ_PLAYERS], const char* co ini_gets( keyboard_section_name, ACTION_NAMES[control_index], - SDL_GetKeyName(IZ_DEFAULT_KEYBOARD_STATE[player_index].config.control_mapping[control_index]), + SDL_GetKeyName(IZ_KEYBOARD_DEFAULT_STATE[player_index].config.control_mapping[control_index]), buffer, 128, config_path @@ -70,7 +70,7 @@ void IZ_KeyboardLoadConfig(IZ_KeyboardState(* state)[IZ_PLAYERS], const char* co } IZ_ProcedureResult IZ_KeyboardInitialize(IZ_KeyboardState(* state)[IZ_PLAYERS], const char* config_path, u8 argc, const char* argv[]) { - SDL_memcpy(state, &IZ_DEFAULT_KEYBOARD_STATE, sizeof(IZ_KeyboardState)); + SDL_memcpy(state, &IZ_KEYBOARD_DEFAULT_STATE, sizeof(IZ_KeyboardState)); IZ_KeyboardLoadConfig(state, config_path); return IZ_KeyboardSaveConfig(state, config_path); } diff --git a/src/packages/game/input/IZ_keyboard.h b/src/packages/game/input/IZ_keyboard.h index 41932ab..c8d77f6 100644 --- a/src/packages/game/input/IZ_keyboard.h +++ b/src/packages/game/input/IZ_keyboard.h @@ -15,7 +15,7 @@ typedef struct { IZ_KeyboardConfig config; } IZ_KeyboardState; -static const IZ_KeyboardState IZ_DEFAULT_KEYBOARD_STATE[IZ_PLAYERS] = { +static const IZ_KeyboardState IZ_KEYBOARD_DEFAULT_STATE[IZ_PLAYERS] = { { .config = { .control_mapping = { diff --git a/src/packages/game/input/IZ_midi.c b/src/packages/game/input/IZ_midi.c index 7d2dfad..f4a3fb1 100644 --- a/src/packages/game/input/IZ_midi.c +++ b/src/packages/game/input/IZ_midi.c @@ -93,7 +93,7 @@ void IZ_MIDIInputLoadConfig(IZ_MIDIInputState(* state)[IZ_PLAYERS], const char* ini_gets( control_mapping_section_name, ACTION_NAMES[control_index], - IZ_MIDIGetNoteName(IZ_DEFAULT_MIDI_INPUT_STATE[player_index].config.control_mapping[control_index]), + IZ_MIDIGetNoteName(IZ_MIDI_INPUT_DEFAULT_STATE[player_index].config.control_mapping[control_index]), buffer, 128, config_path @@ -113,7 +113,7 @@ IZ_ProcedureResult IZ_MIDIInputInitialize(IZ_MIDIInputState(* state)[IZ_PLAYERS] return 1; } - SDL_memcpy(state, &IZ_DEFAULT_MIDI_INPUT_STATE, sizeof(IZ_MIDIInputState)); + SDL_memcpy(state, &IZ_MIDI_INPUT_DEFAULT_STATE, sizeof(IZ_MIDIInputState)); IZ_MIDIInputLoadConfig(state, config_path); if (IZ_MIDIInputSaveConfig(state, config_path)) { return 2; diff --git a/src/packages/game/input/IZ_midi.h b/src/packages/game/input/IZ_midi.h index afaeca9..751b8fc 100644 --- a/src/packages/game/input/IZ_midi.h +++ b/src/packages/game/input/IZ_midi.h @@ -35,7 +35,7 @@ typedef struct { i32 midi_events_count; } IZ_MIDIInputState; -static const IZ_MIDIInputState IZ_DEFAULT_MIDI_INPUT_STATE[IZ_PLAYERS] = { +static const IZ_MIDIInputState IZ_MIDI_INPUT_DEFAULT_STATE[IZ_PLAYERS] = { { .config = { .control_mapping = { diff --git a/src/packages/game/input/input.test.c b/src/packages/game/input/input.test.c index 80e1773..6ef1220 100644 --- a/src/packages/game/input/input.test.c +++ b/src/packages/game/input/input.test.c @@ -304,8 +304,8 @@ spec("input") { for (u8 i = 4; i < CONTROLS; i += 1) { it("handles %s action activation", ACTION_NAMES[i]) { e.type = SDL_JOYBUTTONDOWN; - e.jbutton.button = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; - state[p].config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; + e.jbutton.button = IZ_JOYSTICK_DEFAULT_STATE[p].config.control_mapping[i]; + state[p].config.control_mapping[i] = IZ_JOYSTICK_DEFAULT_STATE[p].config.control_mapping[i]; action[p] = 0; IZ_JoystickHandleEvents(&state, &action, e); @@ -317,8 +317,8 @@ spec("input") { it("handles %s action deactivation", ACTION_NAMES[i]) { e.type = SDL_JOYBUTTONUP; - e.jbutton.button = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; - state[p].config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; + e.jbutton.button = IZ_JOYSTICK_DEFAULT_STATE[p].config.control_mapping[i]; + state[p].config.control_mapping[i] = IZ_JOYSTICK_DEFAULT_STATE[p].config.control_mapping[i]; action[p] = ~0; IZ_JoystickHandleEvents(&state, &action, e); @@ -343,7 +343,7 @@ spec("input") { before_each() { for (u8 p = 0; p < IZ_PLAYERS; p += 1) { for (u8 i = 0; i < CONTROLS; i += 1) { - state[p].config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; + state[p].config.control_mapping[i] = IZ_JOYSTICK_DEFAULT_STATE[p].config.control_mapping[i]; } } } @@ -410,7 +410,7 @@ spec("input") { before_each() { for (u8 p = 0; p < IZ_PLAYERS; p += 1) { for (u8 i = 0; i < CONTROLS; i += 1) { - state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; + state[p].config.control_mapping[i] = IZ_KEYBOARD_DEFAULT_STATE[p].config.control_mapping[i]; } } } @@ -458,8 +458,8 @@ spec("input") { for (u8 i = 0; i < CONTROLS; i += 1) { it("handles %s action activation", ACTION_NAMES[i]) { e.type = SDL_KEYDOWN; - e.key.keysym.sym = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; - state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; + e.key.keysym.sym = IZ_KEYBOARD_DEFAULT_STATE[p].config.control_mapping[i]; + state[p].config.control_mapping[i] = IZ_KEYBOARD_DEFAULT_STATE[p].config.control_mapping[i]; action[p] = 0; IZ_KeyboardHandleEvents(&state, &action, e); @@ -471,8 +471,8 @@ spec("input") { it("handles %s action deactivation", ACTION_NAMES[i]) { e.type = SDL_KEYUP; - e.key.keysym.sym = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; - state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; + e.key.keysym.sym = IZ_KEYBOARD_DEFAULT_STATE[p].config.control_mapping[i]; + state[p].config.control_mapping[i] = IZ_KEYBOARD_DEFAULT_STATE[p].config.control_mapping[i]; action[p] = ~0; IZ_KeyboardHandleEvents(&state, &action, e); @@ -496,7 +496,7 @@ spec("input") { before_each() { for (u8 p = 0; p < IZ_PLAYERS; p += 1) { for (u8 i = 0; i < CONTROLS; i += 1) { - state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; + state[p].config.control_mapping[i] = IZ_KEYBOARD_DEFAULT_STATE[p].config.control_mapping[i]; } } } @@ -653,8 +653,8 @@ spec("input") { describe("on player %u", p) { for (u8 i = 0; i < CONTROLS; i += 1) { it("handles %s action activation", ACTION_NAMES[i]) { - e.message = IZ_MIDI_NOTE_ON | (IZ_DEFAULT_MIDI_INPUT_STATE[p].config.control_mapping[i] << 8); - state[p].config.control_mapping[i] = IZ_DEFAULT_MIDI_INPUT_STATE[p].config.control_mapping[i]; + e.message = IZ_MIDI_NOTE_ON | (IZ_MIDI_INPUT_DEFAULT_STATE[p].config.control_mapping[i] << 8); + state[p].config.control_mapping[i] = IZ_MIDI_INPUT_DEFAULT_STATE[p].config.control_mapping[i]; action[p] = 0; IZ_MIDIInputHandleEvents(&state, &action, e); @@ -665,8 +665,8 @@ spec("input") { } it("handles %s action deactivation", ACTION_NAMES[i]) { - e.message = IZ_MIDI_NOTE_OFF | (IZ_DEFAULT_MIDI_INPUT_STATE[p].config.control_mapping[i] << 8); - state[p].config.control_mapping[i] = IZ_DEFAULT_MIDI_INPUT_STATE[p].config.control_mapping[i]; + e.message = IZ_MIDI_NOTE_OFF | (IZ_MIDI_INPUT_DEFAULT_STATE[p].config.control_mapping[i] << 8); + state[p].config.control_mapping[i] = IZ_MIDI_INPUT_DEFAULT_STATE[p].config.control_mapping[i]; action[p] = ~0; IZ_MIDIInputHandleEvents(&state, &action, e); diff --git a/src/packages/game/net/core/IZ_websocket.c b/src/packages/game/net/core/IZ_websocket.c index 5e308a2..1a863ba 100644 --- a/src/packages/game/net/core/IZ_websocket.c +++ b/src/packages/game/net/core/IZ_websocket.c @@ -19,9 +19,38 @@ void IZ_WebsocketTeardown(IZ_Websocket* ws) { ws->context = NULL; } -void IZ_WebsocketDestroyMessage(void* msg_raw) { - IZ_WebsocketMessage* msg = msg_raw; +void IZ_WebsocketDestroyMessage(IZ_WebsocketMessage* msg) { free(msg->payload); msg->payload = NULL; msg->len = 0; } + +IZ_ProcedureResult IZ_WebsocketCreateBinaryMessage(struct lws* wsi, IZ_WebsocketMessage* amsg, void* in, size_t len) { + /* notice we over-allocate by LWS_PRE */ + amsg->payload = malloc(LWS_PRE + len); + if (!amsg->payload) { + return -1; + } + + amsg->first = (u8) lws_is_first_fragment(wsi); + amsg->final = (u8) lws_is_final_fragment(wsi); + amsg->binary = true; + amsg->len = len; + memcpy((char*) amsg->payload + LWS_PRE, in, len); + return 0; +} + +IZ_ProcedureResult IZ_WebsocketCreateTextMessage(struct lws* wsi, IZ_WebsocketMessage* amsg, void* in, size_t len) { + /* notice we over-allocate by LWS_PRE */ + amsg->payload = malloc(LWS_PRE + len); + if (!amsg->payload) { + return -1; + } + + amsg->first = (u8) lws_is_first_fragment(wsi); + amsg->final = (u8) lws_is_final_fragment(wsi); + amsg->binary = false; + amsg->len = len; + memcpy((char*) amsg->payload + LWS_PRE, in, len); + return 0; +} diff --git a/src/packages/game/net/core/IZ_websocket.h b/src/packages/game/net/core/IZ_websocket.h index d3093b6..a535a75 100644 --- a/src/packages/game/net/core/IZ_websocket.h +++ b/src/packages/game/net/core/IZ_websocket.h @@ -9,16 +9,17 @@ /* one of these created for each message */ typedef struct { - u8 binary: 1; - void* payload; /* is malloc'd */ size_t len; + u8 binary: 1; u8 first: 1; u8 final: 1; + void* payload; /* is malloc'd */ } IZ_WebsocketMessage; typedef struct { struct lws_context* context; struct lws* connection; + void* user_data; u8 interrupted: 1; } IZ_Websocket; @@ -28,7 +29,11 @@ IZ_ProcedureResult IZ_WebsocketHandle(IZ_Websocket*); void IZ_WebsocketTeardown(IZ_Websocket*); -void IZ_WebsocketDestroyMessage(void*); +IZ_ProcedureResult IZ_WebsocketCreateBinaryMessage(struct lws*, IZ_WebsocketMessage*, void*, size_t); + +IZ_ProcedureResult IZ_WebsocketCreateTextMessage(struct lws*, IZ_WebsocketMessage*, void*, size_t); + +void IZ_WebsocketDestroyMessage(IZ_WebsocketMessage*); void IZ_WebsocketCancelService(IZ_Websocket*); diff --git a/src/packages/server/IZ_app.c b/src/packages/server/IZ_app.c index c014937..276da47 100644 --- a/src/packages/server/IZ_app.c +++ b/src/packages/server/IZ_app.c @@ -3,8 +3,8 @@ static IZ_App* global_app; void IZ_AppHandleSignal(i32 _signal) { - global_app->server.ws.interrupted = true; - IZ_WSServerCancelService(&global_app->server); + global_app->net_state.ws.interrupted = true; + IZ_WSServerCancelService(&global_app->net_state.ws); } IZ_ProcedureResult IZ_AppInitialize(IZ_App *app, u8 argc, const char **argv) { @@ -24,7 +24,7 @@ IZ_ProcedureResult IZ_AppInitialize(IZ_App *app, u8 argc, const char **argv) { IZ_ConfigGetDefaultPath(config_path, 128); } - if (IZ_WSServerInitialize(&app->server, app, config_path, argc, argv)) { + if (IZ_NetInitialize(&app->net_state, app, config_path, argc, argv)) { return -1; } @@ -36,19 +36,25 @@ IZ_ProcedureResult IZ_AppRun(IZ_App *app, u8 argc, const char **argv) { return -1; } + if (IZ_WSServerInitialize(&app->net_state.ws, (IZ_WSServerInitializeParams) { + .port = app->net_state.config.port, + })) { + return -1; + } + i32 result = 0; while (true) { - if (IZ_WSServerHandle(&app->server)) { + if (IZ_WSServerHandle(&app->net_state.ws)) { result = -1; break; } - if (app->server.ws.interrupted) { + if (app->net_state.ws.interrupted) { break; } } - IZ_WSServerTeardown(&app->server); + IZ_WSServerTeardown(&app->net_state.ws); lwsl_user("Server closed. Bye!\n"); return result; } @@ -276,17 +282,17 @@ IZ_ProcedureResult IZ_WSServerOnReceive(struct lws* wsi, void* in, size_t len) { lwsl_user("LWS_CALLBACK_RECEIVE: free space %d\n", n); IZ_WebsocketMessage amsg; - amsg.len = len; - /* notice we over-allocate by LWS_PRE... */ - amsg.payload = malloc(LWS_PRE + len); - amsg.binary = (u8) lws_frame_is_binary(wsi); - if (!amsg.payload) { + const u8 result = ( + lws_frame_is_binary(wsi) + ? IZ_WebsocketCreateBinaryMessage(wsi, &amsg, in, len) + : IZ_WebsocketCreateTextMessage(wsi, &amsg, in, len) + ); + + if (result) { lwsl_user("OOM: dropping\n"); return 1; } - /* ...and we copy the payload in at +LWS_PRE */ - memcpy((char *) amsg.payload + LWS_PRE, in, len); if (!lws_ring_insert(vhd->ring, &amsg, 1)) { IZ_WebsocketDestroyMessage(&amsg); lwsl_user("dropping!\n"); diff --git a/src/packages/server/IZ_app.h b/src/packages/server/IZ_app.h index bcd6aa6..371928a 100644 --- a/src/packages/server/IZ_app.h +++ b/src/packages/server/IZ_app.h @@ -7,9 +7,10 @@ #include "log/IZ_log.h" #include "IZ_common.h" #include "IZ_config.h" +#include "net/IZ_net.h" typedef struct { - IZ_WSServerState server; + IZ_NetState net_state; } IZ_App; IZ_ProcedureResult IZ_AppRun(IZ_App*, u8, const char**); diff --git a/src/packages/server/net/IZ_net.c b/src/packages/server/net/IZ_net.c new file mode 100644 index 0000000..5909f90 --- /dev/null +++ b/src/packages/server/net/IZ_net.c @@ -0,0 +1,64 @@ +#include "IZ_net.h" + +void IZ_NetLoadConfig(IZ_NetState* state, const char* config_path) { + char buffer[128]; + + ini_gets("Network", "Name", IZ_APP_NAME, buffer, 128, config_path); + memcpy_s(state->config.name, 64, buffer, 64); + + ini_gets("Network", "Motd", "", buffer, 128, config_path); + memcpy_s(state->config.motd, 128, buffer, 128); + + state->config.port = ini_getl("Network", "Port", IZ_NET_DEFAULT_STATE.config.port, config_path); +} + +IZ_ProcedureResult IZ_NetSaveConfig(IZ_NetState* state, const char* config_path) { + if (!ini_puts("Network", "Name", state->config.name, config_path)) { + return -1; + } + + if (!ini_puts("Network", "Motd", state->config.motd, config_path)) { + return -1; + } + + if (!ini_putl("Network", "Port", state->config.port, config_path)) { + return -1; + } + + return 0; +} + +void IZ_NetOverrideConfig(IZ_NetState* state, u8 argc, const char* argv[]) { + const char* cmdline_buffer; + if ((cmdline_buffer = IZ_ConfigGetCommandlineOption(argc, argv, "-p"))) { + state->config.port = atoi(cmdline_buffer); + } + + if ((cmdline_buffer = IZ_ConfigGetCommandlineOption(argc, argv, "-n"))) { + memcpy_s(state->config.name, 64, cmdline_buffer, 128); + } + + if ((cmdline_buffer = IZ_ConfigGetCommandlineOption(argc, argv, "-m"))) { + memcpy_s(state->config.motd, 128, cmdline_buffer, 128); + } +} + +IZ_ProcedureResult IZ_NetInitialize( + IZ_NetState* state, + void* user_data, + const char* config_path, + u8 argc, + const char* argv[] +) { + memcpy_s(state, sizeof(IZ_NetState), &IZ_NET_DEFAULT_STATE, sizeof(IZ_NetState)); + IZ_NetLoadConfig(state, config_path); + if (IZ_NetSaveConfig(state, config_path) < 0) { + return -1; + } + IZ_NetOverrideConfig(state, argc, argv); + if (!user_data) { + return -2; + } + state->ws.user_data = user_data; + return 0; +} diff --git a/src/packages/server/net/IZ_net.h b/src/packages/server/net/IZ_net.h new file mode 100644 index 0000000..0de3e48 --- /dev/null +++ b/src/packages/server/net/IZ_net.h @@ -0,0 +1,38 @@ +#ifndef IZ_NET_H +#define IZ_NET_H + +#include +#include "../IZ_common.h" +#include "../IZ_config.h" +#include "core/IZ_websocket.h" + +typedef struct { + u16 port; + char name[64]; + char motd[128]; +} IZ_NetConfig; + +typedef struct { + IZ_NetConfig config; + IZ_Websocket ws; +} IZ_NetState; + +static IZ_NetState IZ_NET_DEFAULT_STATE = { + .config = { + .port = 42069, + .name = IZ_APP_NAME, + .motd = "", + }, + .ws = { + .interrupted = false, + .context = NULL, + .connection = NULL, + .user_data = NULL, + }, +}; + +IZ_ProcedureResult IZ_NetInitialize(IZ_NetState*, void*, const char*, u8, const char**); + +IZ_ProcedureResult IZ_NetSaveConfig(IZ_NetState*, const char*); + +#endif diff --git a/src/packages/server/net/svc/IZ_wsserver.c b/src/packages/server/net/svc/IZ_wsserver.c index 542a1d9..75dc891 100644 --- a/src/packages/server/net/svc/IZ_wsserver.c +++ b/src/packages/server/net/svc/IZ_wsserver.c @@ -30,24 +30,6 @@ IZ_ProcedureResult IZ_WSServerCallback( return 0; } -void IZ_WSServerLoadConfig(IZ_WSServerState* state, const char* config_path, u8 argc, const char* argv[]) { - // TODO unify loading of config from cmdline and config file - memcpy_s(state, sizeof(IZ_WSServerState), &IZ_DEFAULT_STATE, sizeof(IZ_WSServerState)); - - const char *cmdline_buffer; -// if ((cmdline_buffer = lws_cmdline_option(argc, argv, "-d"))) { -// state->config.log_level = atoi(cmdline_buffer); -// } - - if ((cmdline_buffer = IZ_ConfigGetCommandlineOption(argc, argv, "-p"))) { - state->config.port = atoi(cmdline_buffer); - } - - if ((cmdline_buffer = IZ_ConfigGetCommandlineOption(argc, argv, "-n"))) { - memcpy_s(state->config.server_name, 64, cmdline_buffer, 64); - } -} - const char* IZ_WSServerTestPath(const char* base_dir, const char* file) { static char test_path[32]; sprintf_s(test_path, 32, "%s/%s", base_dir, file); @@ -59,20 +41,10 @@ const char* IZ_WSServerTestPath(const char* base_dir, const char* file) { return NULL; } -IZ_ProcedureResult IZ_WSServerInitialize(IZ_WSServerState* state, void* userdata, const char* config_path, u8 argc, const char* argv[]) { - IZ_WSServerLoadConfig(state, config_path, argc, argv); - state->userdata = userdata; - +IZ_ProcedureResult IZ_WSServerInitialize(IZ_Websocket* state, IZ_WSServerInitializeParams params) { struct lws_context_creation_info info; memset(&info, 0, sizeof info); - info.port = state->config.port; -// char server_string[64]; -// if (*state->config.server_name) { -// sprintf_s(server_string, 64, "%s Dedicated Server [%s]", IZ_APP_NAME, state->config.server_name); -// } else { -// sprintf_s(server_string, 64, "%s Dedicated Server", IZ_APP_NAME, state->config.server_name); -// } -// info.server_string = server_string; + info.port = params.port; const char* origin = "./public"; struct stat stats; @@ -143,7 +115,7 @@ IZ_ProcedureResult IZ_WSServerInitialize(IZ_WSServerState* state, void* userdata "port", /* pvo name */ NULL /* pvo value */ }; - pvo_port.value = (void*) &state->config.port; + pvo_port.value = (void*) ¶ms.port; static struct lws_protocol_vhost_options pvo_app = { &pvo_port, @@ -151,7 +123,7 @@ IZ_ProcedureResult IZ_WSServerInitialize(IZ_WSServerState* state, void* userdata "app", NULL, }; - pvo_app.value = state->userdata; + pvo_app.value = state->user_data; static const struct lws_protocol_vhost_options pvo = { NULL, /* "next" pvo linked-list */ @@ -165,23 +137,23 @@ IZ_ProcedureResult IZ_WSServerInitialize(IZ_WSServerState* state, void* userdata | LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE ); - IZ_WebsocketInitialize(&state->ws); - state->ws.context = lws_create_context(&info); - if (!state->ws.context) { + IZ_WebsocketInitialize(state); + state->context = lws_create_context(&info); + if (!state->context) { return -1; } return 0; } -IZ_ProcedureResult IZ_WSServerHandle(IZ_WSServerState* state) { - return IZ_WebsocketHandle(&state->ws); +IZ_ProcedureResult IZ_WSServerHandle(IZ_Websocket* state) { + return IZ_WebsocketHandle(state); } -void IZ_WSServerTeardown(IZ_WSServerState* state) { - IZ_WebsocketTeardown(&state->ws); +void IZ_WSServerTeardown(IZ_Websocket* state) { + IZ_WebsocketTeardown(state); } -void IZ_WSServerCancelService(IZ_WSServerState* state) { - IZ_WebsocketCancelService(&state->ws); +void IZ_WSServerCancelService(IZ_Websocket* state) { + IZ_WebsocketCancelService(state); } diff --git a/src/packages/server/net/svc/IZ_wsserver.h b/src/packages/server/net/svc/IZ_wsserver.h index 26bbc17..4da8fd5 100644 --- a/src/packages/server/net/svc/IZ_wsserver.h +++ b/src/packages/server/net/svc/IZ_wsserver.h @@ -22,45 +22,26 @@ typedef struct IZ_WSServerSessionData { /* one of these is created for each vhost our protocol is used with */ typedef struct { - struct lws_context *context; - struct lws_vhost *vhost; - const struct lws_protocols *protocol; - IZ_WSServerSessionData *pss_list; /* linked-list of live pss*/ - struct lws_ring *ring; /* ringbuffer holding unsent messages */ + struct lws_context* context; + struct lws_vhost* vhost; + const struct lws_protocols* protocol; + IZ_WSServerSessionData* pss_list; /* linked-list of live pss*/ + struct lws_ring* ring; /* ringbuffer holding unsent messages */ u16* port; const void* app; } IZ_WSServerVHostData; typedef struct { u16 port; - char server_name[64]; } IZ_WSServerInitializeParams; -typedef struct { - IZ_WSServerInitializeParams config; - void* userdata; - IZ_Websocket ws; -} IZ_WSServerState; - -static IZ_WSServerState IZ_DEFAULT_STATE = { - .config = { - .port = 42069, - .server_name = NULL, - }, - .userdata = NULL, - .ws = { - .interrupted = false, - .context = NULL, - }, -}; - -IZ_ProcedureResult IZ_WSServerInitialize(IZ_WSServerState*, void*, const char*, u8, const char**); - -IZ_ProcedureResult IZ_WSServerHandle(IZ_WSServerState*); - -void IZ_WSServerTeardown(IZ_WSServerState*); - -void IZ_WSServerCancelService(IZ_WSServerState*); +IZ_ProcedureResult IZ_WSServerInitialize(IZ_Websocket*, IZ_WSServerInitializeParams); + +IZ_ProcedureResult IZ_WSServerHandle(IZ_Websocket*); + +void IZ_WSServerTeardown(IZ_Websocket*); + +void IZ_WSServerCancelService(IZ_Websocket*); IZ_ProcedureResult IZ_WSServerProtocolInitialize(struct lws*, void*);