// // Created by rov on 12/27/25. // #include "network.h" #include #include #define NET_TIMEOUT 30000 typedef enum ConnectionResult { CONN_SUCCESS = 0, CONN_ERR_BAD_HOSTNAME = 1, CONN_ERR_NO_SERVER = 2 } CONNECTION_RESULT; void Gui_UpdateStatusBar(const Gui_t* gui, const char *message); bool Network_Init(Network_t *network) { if (!NET_Init()) { SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", "Failed to initialize SDL_net.", NULL); return false; } network->socket = NULL; return true; } void Network_Shutdown(const Network_t *network) { NET_DestroyStreamSocket(network->socket); NET_Quit(); } CONNECTION_RESULT ConnectToServer(Network_t *network, const ConfigParams_t *configParams, const Gui_t *gui) { Gui_UpdateStatusBar(gui, "Searching for hostname..."); NET_Address *netAddress = NET_ResolveHostname(configParams->serverAddress); const NET_Status resolveHostnameStatus = NET_WaitUntilResolved(netAddress, NET_TIMEOUT); if (resolveHostnameStatus != NET_SUCCESS) { NET_UnrefAddress(netAddress); return CONN_ERR_BAD_HOSTNAME; } Gui_UpdateStatusBar(gui, "Trying to connect..."); network->socket = NET_CreateClient(netAddress, configParams->serverPort); const NET_Status createClientStatus = NET_WaitUntilConnected(network->socket, NET_TIMEOUT); if (createClientStatus != NET_SUCCESS) { NET_DestroyStreamSocket(network->socket); network->socket = NULL; NET_UnrefAddress(netAddress); return CONN_ERR_NO_SERVER; } // TODO: is this okay? NET_UnrefAddress(netAddress); return CONN_SUCCESS; } void Network_ConnectAndReportStatus(Network_t *network, const ConfigParams_t *configParams, const Gui_t *gui) { if (network->socket != NULL) { return; } const CONNECTION_RESULT result = ConnectToServer(network, configParams, gui); const char *message = NULL; switch (result) { case CONN_SUCCESS: message = "Connection established."; break; case CONN_ERR_BAD_HOSTNAME: message = "Error: IP address or host not found."; break; case CONN_ERR_NO_SERVER: message = "Error: No server running on host."; break; } Gui_UpdateStatusBar(gui, message); }