From 5e08df7689e871f40a5d62162269200d847cf230 Mon Sep 17 00:00:00 2001 From: rubidium Date: Mon, 23 Aug 2010 23:49:14 +0000 Subject: (svn r20607) -Fix: retain information about all base sets that are found and not only the latest version. This to stop confusing people that use newer versions of the base sets than those available via BaNaNaS. --- src/base_media_func.h | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'src/base_media_func.h') diff --git a/src/base_media_func.h b/src/base_media_func.h index a6071f4f0..c7b3a471f 100644 --- 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 char *filename, size_t basepath_length) 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 char *filename, size_t basepath_length) 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 -- cgit v1.2.3-54-g00ecf