diff --git a/src/base_media_func.h b/src/base_media_func.h --- a/src/base_media_func.h +++ b/src/base_media_func.h @@ -17,6 +17,7 @@ template /* static */ const char *BaseMedia::ini_set; template /* static */ const Tbase_set *BaseMedia::used_set; template /* static */ Tbase_set *BaseMedia::available_sets; +template /* static */ Tbase_set *BaseMedia::duplicate_sets; /** * Try to read a single piece of metadata and return false if it doesn't exist. @@ -169,15 +170,14 @@ bool BaseMedia::AddFile(const if ((duplicate->valid_files == set->valid_files && duplicate->version >= set->version) || duplicate->valid_files > set->valid_files) { DEBUG(grf, 1, "Not adding %s (%i) as base " SET_TYPE " set (duplicate)", set->name, set->version); - delete set; + set->next = BaseMedia::duplicate_sets; + BaseMedia::duplicate_sets = set; } else { Tbase_set **prev = &BaseMedia::available_sets; while (*prev != duplicate) prev = &(*prev)->next; *prev = set; set->next = duplicate->next; - /* don't allow recursive delete of all remaining items */ - duplicate->next = NULL; /* If the duplicate set is currently used (due to rescanning this can happen) * update the currently used set to the new one. This will 'lie' about the @@ -185,7 +185,8 @@ bool BaseMedia::AddFile(const if (BaseMedia::used_set == duplicate) BaseMedia::used_set = set; DEBUG(grf, 1, "Removing %s (%i) as base " SET_TYPE " set (duplicate)", duplicate->name, duplicate->version); - delete duplicate; + duplicate->next = BaseMedia::duplicate_sets; + BaseMedia::duplicate_sets = duplicate; ret = true; } } else { @@ -254,10 +255,9 @@ template #if defined(ENABLE_NETWORK) #include "network/network_content.h" -template -/* static */ bool BaseMedia::HasSet(const ContentInfo *ci, bool md5sum) +template bool HasBaseSet(const ContentInfo *ci, bool md5sum, const Tbase_set *s) { - for (const Tbase_set *s = BaseMedia::available_sets; s != NULL; s = s->next) { + for (; s != NULL; s = s->next) { if (s->GetNumMissing() != 0) continue; if (s->shortname != ci->unique_id) continue; @@ -276,6 +276,13 @@ template return false; } +template +/* static */ bool BaseMedia::HasSet(const ContentInfo *ci, bool md5sum) +{ + return HasBaseSet(ci, md5sum, BaseMedia::available_sets) || + HasBaseSet(ci, md5sum, BaseMedia::duplicate_sets); +} + #else template