diff --git a/src/config.c b/src/config.c index ea8dfefc7e..9e52f68dea 100644 --- a/src/config.c +++ b/src/config.c @@ -230,12 +230,18 @@ config_property_definition _twitchDefinitions[] = { { offsetof(twitch_configuration, enable_news), "news", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL } }; +config_property_definition _networkDefinitions[] = { + { offsetof(network_configuration, player_name), "player_name", CONFIG_VALUE_TYPE_STRING, {.value_string = "Player" }, NULL }, + { offsetof(network_configuration, default_port), "default_port", CONFIG_VALUE_TYPE_UINT32, true, NULL }, +}; + config_section_definition _sectionDefinitions[] = { { &gConfigGeneral, "general", _generalDefinitions, countof(_generalDefinitions) }, { &gConfigInterface, "interface", _interfaceDefinitions, countof(_interfaceDefinitions) }, { &gConfigSound, "sound", _soundDefinitions, countof(_soundDefinitions) }, { &gConfigCheat, "cheat", _cheatDefinitions, countof(_cheatDefinitions) }, - { &gConfigTwitch, "twitch", _twitchDefinitions, countof(_twitchDefinitions) } + { &gConfigTwitch, "twitch", _twitchDefinitions, countof(_twitchDefinitions) }, + { &gConfigNetwork, "network", _networkDefinitions, countof(_networkDefinitions) } }; #pragma endregion @@ -245,6 +251,7 @@ interface_configuration gConfigInterface; sound_configuration gConfigSound; cheat_configuration gConfigCheat; twitch_configuration gConfigTwitch; +network_configuration gConfigNetwork; themes_configuration gConfigThemes; title_sequences_configuration gConfigTitleSequences; diff --git a/src/config.h b/src/config.h index 46a23acb30..4ea4b14b03 100644 --- a/src/config.h +++ b/src/config.h @@ -204,6 +204,11 @@ typedef struct { uint8 enable_news; } twitch_configuration; +typedef struct { + utf8string player_name; + uint32 default_port; +} network_configuration; + typedef struct theme_window { uint8 colours[6]; @@ -274,6 +279,7 @@ extern interface_configuration gConfigInterface; extern sound_configuration gConfigSound; extern cheat_configuration gConfigCheat; extern twitch_configuration gConfigTwitch; +extern network_configuration gConfigNetwork; extern themes_configuration gConfigThemes; extern title_sequences_configuration gConfigTitleSequences; diff --git a/src/windows/server_list.c b/src/windows/server_list.c index c9716da512..e3215acac0 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -37,7 +37,7 @@ typedef struct { utf8 *description; } saved_server; -char _playerName[64] = "Player"; +char _playerName[64]; saved_server *_savedServers = NULL; int _numSavedServers = 0; @@ -67,6 +67,7 @@ static rct_widget window_server_list_widgets[] = { { WIDGETS_END }, }; +static void window_server_list_close(rct_window *w); static void window_server_list_mouseup(rct_window *w, int widgetIndex); static void window_server_list_resize(rct_window *w); static void window_server_list_update(rct_window *w); @@ -81,7 +82,7 @@ static void window_server_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi static void server_list_get_item_button(int buttonIndex, int x, int y, int width, int *outX, int *outY); static rct_window_event_list window_server_list_events = { - NULL, + window_server_list_close, window_server_list_mouseup, window_server_list_resize, NULL, @@ -113,6 +114,11 @@ static rct_window_event_list window_server_list_events = { static int _hoverButtonIndex = -1; +static void server_list_load_saved_servers(); +static void server_list_save_saved_servers(); +static void dispose_saved_server_list(); +static void dispose_saved_server(saved_server *serverInfo); + void window_server_list_open() { rct_window* window; @@ -148,17 +154,22 @@ void window_server_list_open() window_set_resize(window, WWIDTH_MIN, WHEIGHT_MIN, WWIDTH_MAX, WHEIGHT_MAX); - _numSavedServers = 2; - _savedServers = malloc(_numSavedServers * sizeof(saved_server)); - _savedServers[0].address = "127.0.0.1"; - _savedServers[0].name = "localhost"; - _savedServers[0].description = "Home sweet home."; - _savedServers[1].address = "81.124.111.146:12428"; - _savedServers[1].name = "Another server, #1"; - _savedServers[1].description = "Another server..."; + strncpy(_playerName, gConfigNetwork.player_name, sizeof(_playerName)); + + server_list_load_saved_servers(); window->no_list_items = _numSavedServers; } +static void window_server_list_close(rct_window *w) +{ + if (strlen(_playerName) > 0) { + SafeFree(gConfigNetwork.player_name); + gConfigNetwork.player_name = _strdup(_playerName); + config_save_default(); + } + dispose_saved_server_list(); +} + static void window_server_list_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { @@ -336,3 +347,107 @@ static void server_list_get_item_button(int buttonIndex, int x, int y, int width *outX = width - 3 - 36 - (30 * buttonIndex); *outY = y + 2; } + +static char *freadstralloc(FILE *file) +{ + int capacity = 64; + char *buffer = malloc(capacity); + + int length = 0; + int c; + for (;;) { + c = fgetc(file); + if (c == EOF) break; + if (c == 0) break; + + if (length > capacity) { + capacity *= 2; + buffer = realloc(buffer, capacity); + } + buffer[length] = c; + length++; + } + + buffer = realloc(buffer, length + 1); + buffer[length] = 0; + return buffer; +} + +static void server_list_load_saved_servers() +{ + utf8 path[MAX_PATH]; + FILE *file; + + platform_get_user_directory(path, NULL); + strcat(path, "servers.cfg"); + + file = fopen(path, "rb"); + if (file == NULL) { + return; + } + + dispose_saved_server_list(); + + // Read number of saved servers + fread(&_numSavedServers, sizeof(uint32), 1, file); + _savedServers = malloc(_numSavedServers * sizeof(saved_server)); + + // Load each saved server + for (int i = 0; i < _numSavedServers; i++) { + saved_server *serverInfo = &_savedServers[i]; + + serverInfo->address = freadstralloc(file); + serverInfo->name = freadstralloc(file); + serverInfo->description = freadstralloc(file); + } + + fclose(file); +} + +static void server_list_save_saved_servers() +{ + utf8 path[MAX_PATH]; + FILE *file; + + platform_get_user_directory(path, NULL); + strcat(path, "servers.cfg"); + + file = fopen(path, "wb"); + if (file == NULL) { + log_error("Unable to save servers."); + return; + } + + // Write number of saved servers + fwrite(&_numSavedServers, sizeof(uint32), 1, file); + + // Write each saved server + for (int i = 0; i < _numSavedServers; i++) { + saved_server *serverInfo = &_savedServers[i]; + + fwrite(serverInfo->address, strlen(serverInfo->address) + 1, 1, file); + fwrite(serverInfo->name, strlen(serverInfo->name) + 1, 1, file); + fwrite(serverInfo->description, strlen(serverInfo->description) + 1, 1, file); + } + + fclose(file); +} + +static void dispose_saved_server_list() +{ + if (_savedServers != NULL) { + for (int i = 0; i < _numSavedServers; i++) { + dispose_saved_server(&_savedServers[i]); + } + free(_savedServers); + _savedServers = NULL; + } + _numSavedServers = 0; +} + +static void dispose_saved_server(saved_server *serverInfo) +{ + SafeFree(serverInfo->address); + SafeFree(serverInfo->name); + SafeFree(serverInfo->description); +}