From b57d845e55f733514d235e24f64b09a8744f3abc Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Mon, 26 Apr 2021 20:02:58 +0200 Subject: [PATCH] Codechange: refactor CheckGameCompatibility() from existing function Later commits use this function in other places too. --- src/network/core/game_info.cpp | 15 +++++++++++++++ src/network/core/game_info.h | 1 + src/network/network_udp.cpp | 14 ++++++-------- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/network/core/game_info.cpp b/src/network/core/game_info.cpp index b664bb580a..55b5d1749a 100644 --- a/src/network/core/game_info.cpp +++ b/src/network/core/game_info.cpp @@ -106,6 +106,21 @@ bool IsNetworkCompatibleVersion(const char *other) return hash1 != nullptr && hash2 != nullptr && strncmp(hash1, hash2, GITHASH_SUFFIX_LEN) == 0; } +/** + * Check if an game entry is compatible with our client. + */ +void CheckGameCompatibility(NetworkGameInfo &ngi) +{ + /* Check if we are allowed on this server based on the revision-check. */ + ngi.version_compatible = IsNetworkCompatibleVersion(ngi.server_revision); + ngi.compatible = ngi.version_compatible; + + /* Check if we have all the GRFs on the client-system too. */ + for (const GRFConfig *c = ngi.grfconfig; c != nullptr; c = c->next) { + if (c->status == GCS_NOT_FOUND) ngi.compatible = false; + } +} + /** * Fill a NetworkGameInfo structure with the latest information of the server. * @param ngi the NetworkGameInfo struct to fill with data. diff --git a/src/network/core/game_info.h b/src/network/core/game_info.h index 7767005117..28aea75073 100644 --- a/src/network/core/game_info.h +++ b/src/network/core/game_info.h @@ -93,6 +93,7 @@ extern NetworkServerGameInfo _network_game_info; const char *GetNetworkRevisionString(); bool IsNetworkCompatibleVersion(const char *other); +void CheckGameCompatibility(NetworkGameInfo &ngi); void FillNetworkGameInfo(NetworkGameInfo &ngi); diff --git a/src/network/network_udp.cpp b/src/network/network_udp.cpp index 8e661e9393..d62998794e 100644 --- a/src/network/network_udp.cpp +++ b/src/network/network_udp.cpp @@ -324,10 +324,15 @@ void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet *p, NetworkAd /* Find next item */ item = NetworkGameListAddItem(*client_addr); + /* Clear any existing GRFConfig chain. */ ClearGRFConfigList(&item->info.grfconfig); + /* Retrieve the NetworkGameInfo from the packet. */ DeserializeNetworkGameInfo(p, &item->info); + /* Check for compatability with the client. */ + CheckGameCompatibility(item->info); + /* Ensure we consider the server online. */ + item->online = true; - item->info.compatible = true; { /* Checks whether there needs to be a request for names of GRFs and makes * the request if necessary. GRFs that need to be requested are the GRFs @@ -341,7 +346,6 @@ void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet *p, NetworkAd uint in_request_count = 0; for (c = item->info.grfconfig; c != nullptr; c = c->next) { - if (c->status == GCS_NOT_FOUND) item->info.compatible = false; if (c->status != GCS_NOT_FOUND || strcmp(c->GetName(), UNKNOWN_GRF_NAME_PLACEHOLDER) != 0) continue; in_request[in_request_count] = c; in_request_count++; @@ -369,12 +373,6 @@ void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(Packet *p, NetworkAd strecat(item->info.server_name, " (IPv6)", lastof(item->info.server_name)); } - /* Check if we are allowed on this server based on the revision-match */ - item->info.version_compatible = IsNetworkCompatibleVersion(item->info.server_revision); - item->info.compatible &= item->info.version_compatible; // Already contains match for GRFs - - item->online = true; - UpdateNetworkGameWindow(); }