Codechange: [Network] Use string_view for network compatability check
This commit is contained in:
		| @@ -38,7 +38,7 @@ NetworkServerGameInfo _network_game_info; ///< Information about our game. | ||||
|  * Get the network version string used by this build. | ||||
|  * The returned string is guaranteed to be at most NETWORK_REVISON_LENGTH bytes including '\0' terminator. | ||||
|  */ | ||||
| const char *GetNetworkRevisionString() | ||||
| std::string_view GetNetworkRevisionString() | ||||
| { | ||||
| 	static std::string network_revision; | ||||
|  | ||||
| @@ -65,17 +65,19 @@ const char *GetNetworkRevisionString() | ||||
| 		Debug(net, 3, "Network revision name: {}", network_revision); | ||||
| 	} | ||||
|  | ||||
| 	return network_revision.c_str(); | ||||
| 	return network_revision; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Extract the git hash from the revision string. | ||||
|  * @param revstr The revision string (formatted as DATE-BRANCH-GITHASH). | ||||
|  * @param revision_string The revision string (formatted as DATE-BRANCH-GITHASH). | ||||
|  * @return The git has part of the revision. | ||||
|  */ | ||||
| static const char *ExtractNetworkRevisionHash(const char *revstr) | ||||
| static std::string_view ExtractNetworkRevisionHash(std::string_view revision_string) | ||||
| { | ||||
| 	return strrchr(revstr, '-'); | ||||
| 	size_t index = revision_string.find_last_of('-'); | ||||
| 	if (index == std::string::npos) return {}; | ||||
| 	return revision_string.substr(index); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -83,18 +85,18 @@ static const char *ExtractNetworkRevisionHash(const char *revstr) | ||||
|  * First tries to match the full string, if that fails, attempts to compare just git hashes. | ||||
|  * @param other the version string to compare to | ||||
|  */ | ||||
| bool IsNetworkCompatibleVersion(const char *other) | ||||
| bool IsNetworkCompatibleVersion(std::string_view other) | ||||
| { | ||||
| 	if (strncmp(GetNetworkRevisionString(), other, NETWORK_REVISION_LENGTH - 1) == 0) return true; | ||||
| 	if (GetNetworkRevisionString() == other) return true; | ||||
|  | ||||
| 	/* If this version is tagged, then the revision string must be a complete match, | ||||
| 	 * since there is no git hash suffix in it. | ||||
| 	 * This is needed to avoid situations like "1.9.0-beta1" comparing equal to "2.0.0-beta1".  */ | ||||
| 	if (_openttd_revision_tagged) return false; | ||||
|  | ||||
| 	const char *hash1 = ExtractNetworkRevisionHash(GetNetworkRevisionString()); | ||||
| 	const char *hash2 = ExtractNetworkRevisionHash(other); | ||||
| 	return hash1 != nullptr && hash2 != nullptr && strncmp(hash1, hash2, GITHASH_SUFFIX_LEN) == 0; | ||||
| 	std::string_view hash1 = ExtractNetworkRevisionHash(GetNetworkRevisionString()); | ||||
| 	std::string_view hash2 = ExtractNetworkRevisionHash(other); | ||||
| 	return hash1 == hash2; | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -103,7 +105,7 @@ bool IsNetworkCompatibleVersion(const char *other) | ||||
| void CheckGameCompatibility(NetworkGameInfo &ngi) | ||||
| { | ||||
| 	/* Check if we are allowed on this server based on the revision-check. */ | ||||
| 	ngi.version_compatible = IsNetworkCompatibleVersion(ngi.server_revision.c_str()); | ||||
| 	ngi.version_compatible = IsNetworkCompatibleVersion(ngi.server_revision); | ||||
| 	ngi.compatible = ngi.version_compatible; | ||||
|  | ||||
| 	/* Check if we have all the GRFs on the client-system too. */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 rubidium42
					rubidium42