mirror of https://github.com/OpenTTD/OpenTTD.git
Codechange: [ContentInfo] Use StringList for tags instead of custom allocations
This commit is contained in:
parent
dfb89f3891
commit
9c424ab741
|
@ -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_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_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_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
|
static const uint NETWORK_GRF_NAME_LENGTH = 80; ///< Maximum length of the name of a GRF
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ ContentInfo::ContentInfo()
|
||||||
: /* Temporary... will be removed later in the PR. */
|
: /* Temporary... will be removed later in the PR. */
|
||||||
type((ContentType)0), id((ContentID)0), filesize(0), filename(""), name(""), version(""),
|
type((ContentType)0), id((ContentID)0), filesize(0), filename(""), name(""), version(""),
|
||||||
url(""), description(""), unique_id(0), md5sum(""), dependency_count(0), dependencies(nullptr),
|
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()
|
ContentInfo::~ContentInfo()
|
||||||
{
|
{
|
||||||
free(this->dependencies);
|
free(this->dependencies);
|
||||||
free(this->tags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -44,10 +43,9 @@ void ContentInfo::TransferFrom(ContentInfo *other)
|
||||||
{
|
{
|
||||||
if (other != this) {
|
if (other != this) {
|
||||||
free(this->dependencies);
|
free(this->dependencies);
|
||||||
free(this->tags);
|
|
||||||
*this = *other;
|
*this = *other;
|
||||||
other->dependencies = nullptr;
|
other->dependencies = nullptr;
|
||||||
other->tags = nullptr;
|
other->tags.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -69,8 +69,7 @@ struct ContentInfo {
|
||||||
byte md5sum[16]; ///< The MD5 checksum
|
byte md5sum[16]; ///< The MD5 checksum
|
||||||
uint8 dependency_count; ///< Number of dependencies
|
uint8 dependency_count; ///< Number of dependencies
|
||||||
ContentID *dependencies; ///< Malloced array of dependencies (unique server side ids)
|
ContentID *dependencies; ///< Malloced array of dependencies (unique server side ids)
|
||||||
uint8 tag_count; ///< Number of tags
|
StringList tags; ///< Tags associated with the content
|
||||||
char (*tags)[32]; ///< Malloced array of tags (strings)
|
|
||||||
State state; ///< Whether the content info is selected (for download)
|
State state; ///< Whether the content info is selected (for download)
|
||||||
bool upgrade; ///< This item is an upgrade
|
bool upgrade; ///< This item is an upgrade
|
||||||
|
|
||||||
|
|
|
@ -70,9 +70,9 @@ bool ClientNetworkContentSocketHandler::Receive_SERVER_INFO(Packet *p)
|
||||||
ci->dependencies = MallocT<ContentID>(ci->dependency_count);
|
ci->dependencies = MallocT<ContentID>(ci->dependency_count);
|
||||||
for (uint i = 0; i < ci->dependency_count; i++) ci->dependencies[i] = (ContentID)p->Recv_uint32();
|
for (uint i = 0; i < ci->dependency_count; i++) ci->dependencies[i] = (ContentID)p->Recv_uint32();
|
||||||
|
|
||||||
ci->tag_count = p->Recv_uint8();
|
uint tag_count = p->Recv_uint8();
|
||||||
ci->tags = MallocT<char[32]>(ci->tag_count);
|
ci->tags.reserve(tag_count);
|
||||||
for (uint i = 0; i < ci->tag_count; i++) p->Recv_string(ci->tags[i], lengthof(*ci->tags));
|
for (uint i = 0; i < tag_count; i++) ci->tags.push_back(p->Recv_string(NETWORK_CONTENT_TAG_LENGTH));
|
||||||
|
|
||||||
if (!ci->IsValid()) {
|
if (!ci->IsValid()) {
|
||||||
delete ci;
|
delete ci;
|
||||||
|
|
|
@ -443,9 +443,8 @@ class NetworkContentListWindow : public Window, ContentCallback {
|
||||||
static bool CDECL TagNameFilter(const ContentInfo * const *a, ContentListFilterData &filter)
|
static bool CDECL TagNameFilter(const ContentInfo * const *a, ContentListFilterData &filter)
|
||||||
{
|
{
|
||||||
filter.string_filter.ResetState();
|
filter.string_filter.ResetState();
|
||||||
for (int i = 0; i < (*a)->tag_count; i++) {
|
for (auto &tag : (*a)->tags) filter.string_filter.AddLine(tag.c_str());
|
||||||
filter.string_filter.AddLine((*a)->tags[i]);
|
|
||||||
}
|
|
||||||
filter.string_filter.AddLine((*a)->name);
|
filter.string_filter.AddLine((*a)->name);
|
||||||
return filter.string_filter.GetState();
|
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);
|
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 */
|
/* List all tags */
|
||||||
char buf[DRAW_STRING_BUFFER] = "";
|
char buf[DRAW_STRING_BUFFER] = "";
|
||||||
char *p = buf;
|
char *p = buf;
|
||||||
for (uint i = 0; i < this->selected->tag_count; i++) {
|
for (auto &tag : this->selected->tags) {
|
||||||
p += seprintf(p, lastof(buf), i == 0 ? "%s" : ", %s", this->selected->tags[i]);
|
p += seprintf(p, lastof(buf), p == buf ? "%s" : ", %s", tag.c_str());
|
||||||
}
|
}
|
||||||
SetDParamStr(0, buf);
|
SetDParamStr(0, buf);
|
||||||
y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_TAGS);
|
y = DrawStringMultiLine(r.left + DETAIL_LEFT, r.right - DETAIL_RIGHT, y, max_y, STR_CONTENT_DETAIL_TAGS);
|
||||||
|
|
Loading…
Reference in New Issue