diff --git a/src/network/core/config.h b/src/network/core/config.h index cacc907faf..ce614188dd 100644 --- a/src/network/core/config.h +++ b/src/network/core/config.h @@ -65,6 +65,7 @@ static const uint NETWORK_CLIENT_NAME_LENGTH = 25; ///< The maxim static const uint NETWORK_RCONCOMMAND_LENGTH = 500; ///< The maximum length of a rconsole command, in bytes including '\0' static const uint NETWORK_GAMESCRIPT_JSON_LENGTH = COMPAT_MTU-3; ///< The maximum length of a gamescript json string, in bytes including '\0'. Must not be longer than COMPAT_MTU including header (3 bytes) static const uint NETWORK_CHAT_LENGTH = 900; ///< The maximum length of a chat message, in bytes including '\0' +static const uint NETWORK_CONTENT_TAG_LENGTH = 32; ///< The maximum length of a content's tag, in bytes including '\0'. static const uint NETWORK_GRF_NAME_LENGTH = 80; ///< Maximum length of the name of a GRF diff --git a/src/network/core/tcp_content.cpp b/src/network/core/tcp_content.cpp index ddea9fd5ea..041e932e4e 100644 --- a/src/network/core/tcp_content.cpp +++ b/src/network/core/tcp_content.cpp @@ -25,7 +25,7 @@ ContentInfo::ContentInfo() : /* Temporary... will be removed later in the PR. */ type((ContentType)0), id((ContentID)0), filesize(0), filename(""), name(""), version(""), url(""), description(""), unique_id(0), md5sum(""), dependency_count(0), dependencies(nullptr), - tag_count(0), tags(nullptr), state((State)0), upgrade(false) + state((State)0), upgrade(false) { } @@ -33,7 +33,6 @@ ContentInfo::ContentInfo() ContentInfo::~ContentInfo() { free(this->dependencies); - free(this->tags); } /** @@ -44,10 +43,9 @@ void ContentInfo::TransferFrom(ContentInfo *other) { if (other != this) { free(this->dependencies); - free(this->tags); *this = *other; other->dependencies = nullptr; - other->tags = nullptr; + other->tags.clear(); } } diff --git a/src/network/core/tcp_content_type.h b/src/network/core/tcp_content_type.h index 739cf1379f..93367746db 100644 --- a/src/network/core/tcp_content_type.h +++ b/src/network/core/tcp_content_type.h @@ -69,8 +69,7 @@ struct ContentInfo { byte md5sum[16]; ///< The MD5 checksum uint8 dependency_count; ///< Number of dependencies ContentID *dependencies; ///< Malloced array of dependencies (unique server side ids) - uint8 tag_count; ///< Number of tags - char (*tags)[32]; ///< Malloced array of tags (strings) + StringList tags; ///< Tags associated with the content State state; ///< Whether the content info is selected (for download) bool upgrade; ///< This item is an upgrade diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index f78a839b81..27ffee9706 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -70,9 +70,9 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p) ci->dependencies = MallocT(ci->dependency_count); for (uint i = 0; i < ci->dependency_count; i++) ci->dependencies[i] = (ContentID)p->Recv_uint32(); - ci->tag_count = p->Recv_uint8(); - ci->tags = MallocT(ci->tag_count); - for (uint i = 0; i < ci->tag_count; i++) p->Recv_string(ci->tags[i], lengthof(*ci->tags)); + uint tag_count = p->Recv_uint8(); + ci->tags.reserve(tag_count); + for (uint i = 0; i < tag_count; i++) ci->tags.push_back(p->Recv_string(NETWORK_CONTENT_TAG_LENGTH)); if (!ci->IsValid()) { delete ci; diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp index a74d902a3c..a617f4e499 100644 --- a/src/network/network_content_gui.cpp +++ b/src/network/network_content_gui.cpp @@ -443,9 +443,8 @@ class NetworkContentListWindow : public Window, ContentCallback { static bool CDECL TagNameFilter(const ContentInfo * const *a, ContentListFilterData &filter) { filter.string_filter.ResetState(); - for (int i = 0; i < (*a)->tag_count; i++) { - filter.string_filter.AddLine((*a)->tags[i]); - } + for (auto &tag : (*a)->tags) filter.string_filter.AddLine(tag.c_str()); + filter.string_filter.AddLine((*a)->name); return filter.string_filter.GetState(); } @@ -747,12 +746,12 @@ public: y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_DEPENDENCIES); } - if (this->selected->tag_count != 0) { + if (!this->selected->tags.empty()) { /* List all tags */ char buf[DRAW_STRING_BUFFER] = ""; char *p = buf; - for (uint i = 0; i < this->selected->tag_count; i++) { - p += seprintf(p, lastof(buf), i == 0 ? "%s" : ", %s", this->selected->tags[i]); + for (auto &tag : this->selected->tags) { + p += seprintf(p, lastof(buf), p == buf ? "%s" : ", %s", tag.c_str()); } SetDParamStr(0, buf); y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_TAGS);