Ensure every config-backed subsystem can serialize/deserialize config in a single consistent manner.feature/data-structs
@@ -140,8 +140,8 @@ void IZ_NetClientConnect(IZ_NetClientState* state, IZ_WSClientInitializeParams p | |||||
state->retries = 0; | state->retries = 0; | ||||
state->params = params; | state->params = params; | ||||
state->client_thread = SDL_CreateThread(state->callback, "networking", state->binding.user_data); | |||||
SDL_DetachThread(state->client_thread); | |||||
state->thread = SDL_CreateThread(state->callback, "networking", state->binding.user_data); | |||||
SDL_DetachThread(state->thread); | |||||
} | } | ||||
void IZ_NetClientDisconnect(IZ_NetClientState* state) { | void IZ_NetClientDisconnect(IZ_NetClientState* state) { | ||||
@@ -23,7 +23,7 @@ typedef struct { | |||||
} IZ_NetClientConfig; | } IZ_NetClientConfig; | ||||
typedef struct { | typedef struct { | ||||
SDL_Thread* client_thread; | |||||
void* thread; | |||||
IZ_NetClientConfig config; | IZ_NetClientConfig config; | ||||
IZ_NetBinding binding; | IZ_NetBinding binding; | ||||
IZ_NetInitializeParams params; | IZ_NetInitializeParams params; | ||||
@@ -35,7 +35,7 @@ typedef struct { | |||||
} IZ_NetClientState; | } IZ_NetClientState; | ||||
static IZ_NetClientState IZ_NET_CLIENT_DEFAULT_STATE = { | static IZ_NetClientState IZ_NET_CLIENT_DEFAULT_STATE = { | ||||
.client_thread = NULL, | |||||
.thread = NULL, | |||||
.config = { | .config = { | ||||
.packet_interval_ms = 200, | .packet_interval_ms = 200, | ||||
.max_reconnect_retries = 3, | .max_reconnect_retries = 3, | ||||
@@ -46,7 +46,8 @@ static IZ_ConfigItem net_server_config_items[] = { | |||||
.deserialize = NULL, | .deserialize = NULL, | ||||
}, | }, | ||||
NULL, | NULL, | ||||
} | |||||
}, | |||||
IZ_CONFIG_ITEM_NULL, | |||||
}; | }; | ||||
void IZ_NetServerBindStateToConfig(IZ_NetServerState* state, IZ_ConfigItem config_items[]) { | void IZ_NetServerBindStateToConfig(IZ_NetServerState* state, IZ_ConfigItem config_items[]) { | ||||
@@ -34,7 +34,7 @@ static IZ_NetServerState IZ_NET_SERVER_DEFAULT_STATE = { | |||||
}, | }, | ||||
}; | }; | ||||
IZ_ProcedureResult IZ_NetServerInitialize(IZ_NetServerState *state, void *user_data, const char *config_path, u8 argc, const char **argv); | |||||
IZ_ProcedureResult IZ_NetServerInitialize(IZ_NetServerState*, void*, const char*, u8, const char*[]); | |||||
IZ_ProcedureResult IZ_NetSaveConfig(IZ_NetServerState*, const char*); | IZ_ProcedureResult IZ_NetSaveConfig(IZ_NetServerState*, const char*); | ||||
@@ -1,34 +1,45 @@ | |||||
#include "IZ_repo.h" | #include "IZ_repo.h" | ||||
void IZ_RepoLoadConfig(IZ_RepoState* state, const char* config_path) { | |||||
char buffer[64]; | |||||
static IZ_ConfigItem repo_config_items[] = { | |||||
{ | |||||
IZ_CONFIG_TYPE_STRING, | |||||
sizeof(char) * 64, | |||||
"Database", | |||||
"Path", | |||||
"-d", | |||||
&IZ_REPO_DEFAULT_STATE.config.path, | |||||
NULL, | |||||
{ | |||||
.serialize = NULL, | |||||
.deserialize = NULL, | |||||
}, | |||||
NULL, | |||||
}, | |||||
IZ_CONFIG_ITEM_NULL, | |||||
}; | |||||
ini_gets("Database", "Path", IZ_REPO_DEFAULT_STATE.config.path, buffer, 64, config_path); | |||||
memcpy_s(state->config.path, 64, buffer, 64); | |||||
void IZ_RepoBindStateToConfig(IZ_RepoState* state, IZ_ConfigItem config_items[]) { | |||||
config_items[0].dest = &state->config.path; | |||||
} | } | ||||
IZ_ProcedureResult IZ_RepoSaveConfig(IZ_RepoState* state, const char* config_path) { | IZ_ProcedureResult IZ_RepoSaveConfig(IZ_RepoState* state, const char* config_path) { | ||||
if (!ini_puts("Database", "Path", state->config.path, config_path)) { | |||||
return -1; | |||||
} | |||||
return 0; | |||||
IZ_RepoBindStateToConfig(state, repo_config_items); | |||||
return IZ_ConfigSave(repo_config_items, config_path); | |||||
} | } | ||||
void IZ_RepoOverrideConfig(IZ_RepoState* state, u8 argc, const char* argv[]) { | |||||
const char* cmdline_buffer; | |||||
if ((cmdline_buffer = IZ_ConfigGetCommandlineOption(argc, argv, "-d"))) { | |||||
memcpy_s(state->config.path, 64, cmdline_buffer, 64); | |||||
IZ_ProcedureResult IZ_RepoInitializeConfig(IZ_RepoState* state, const char* config_path, u8 argc, const char* argv[]) { | |||||
IZ_RepoBindStateToConfig(state, repo_config_items); | |||||
if (IZ_ConfigInitialize(repo_config_items, config_path, argc, argv) < 0) { | |||||
return -1; | |||||
} | } | ||||
return 0; | |||||
} | } | ||||
IZ_ProcedureResult IZ_RepoInitialize(IZ_RepoState* state, const char* config_path, u8 argc, const char* argv[]) { | IZ_ProcedureResult IZ_RepoInitialize(IZ_RepoState* state, const char* config_path, u8 argc, const char* argv[]) { | ||||
memcpy_s(state, sizeof(IZ_RepoState), &IZ_REPO_DEFAULT_STATE, sizeof(IZ_RepoState)); | memcpy_s(state, sizeof(IZ_RepoState), &IZ_REPO_DEFAULT_STATE, sizeof(IZ_RepoState)); | ||||
IZ_RepoLoadConfig(state, config_path); | |||||
if (IZ_RepoSaveConfig(state, config_path)) { | |||||
return -1; | |||||
if (IZ_RepoInitializeConfig(state, config_path, argc, argv) < 0) { | |||||
return -2; | |||||
} | } | ||||
IZ_RepoOverrideConfig(state, argc, argv); | |||||
sqlite3_open_v2(state->config.path, &state->db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); | sqlite3_open_v2(state->config.path, &state->db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); | ||||
return 0; | return 0; | ||||
} | } | ||||
@@ -23,6 +23,8 @@ static IZ_RepoState IZ_REPO_DEFAULT_STATE = { | |||||
.db = NULL, | .db = NULL, | ||||
}; | }; | ||||
IZ_ProcedureResult IZ_RepoSaveConfig(IZ_RepoState*, const char*); | |||||
IZ_ProcedureResult IZ_RepoInitialize(IZ_RepoState*, const char*, u8, const char*[]); | IZ_ProcedureResult IZ_RepoInitialize(IZ_RepoState*, const char*, u8, const char*[]); | ||||
void IZ_RepoTeardown(IZ_RepoState*); | void IZ_RepoTeardown(IZ_RepoState*); | ||||