Changeset - r15913:089431d6de35
[Not reviewed]
master
0 2 0
rubidium - 14 years ago 2010-08-23 23:49:14
rubidium@openttd.org
(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.
2 files changed with 15 insertions and 7 deletions:
0 comments (0 inline, 0 general)
src/base_media_base.h
Show inline comments
 
@@ -144,12 +144,13 @@ struct BaseSet {
 
 * @tparam Tbase_set the real set we're going to be
 
 */
 
template <class Tbase_set>
 
class BaseMedia : FileScanner {
 
protected:
 
	static Tbase_set *available_sets; ///< All available sets
 
	static Tbase_set *duplicate_sets; ///< All sets that aren't available, but needed for not downloading base sets when a newer version than the one on BaNaNaS is loaded.
 
	static const Tbase_set *used_set; ///< The currently used set
 

	
 
	/* virtual */ bool AddFile(const char *filename, size_t basepath_length);
 

	
 
	/**
 
	 * Get the extension that is used to identify this set.
src/base_media_func.h
Show inline comments
 
@@ -14,12 +14,13 @@
 
#include "ini_type.h"
 
#include "string_func.h"
 

	
 
template <class Tbase_set> /* static */ const char *BaseMedia<Tbase_set>::ini_set;
 
template <class Tbase_set> /* static */ const Tbase_set *BaseMedia<Tbase_set>::used_set;
 
template <class Tbase_set> /* static */ Tbase_set *BaseMedia<Tbase_set>::available_sets;
 
template <class Tbase_set> /* static */ Tbase_set *BaseMedia<Tbase_set>::duplicate_sets;
 

	
 
/**
 
 * Try to read a single piece of metadata and return false if it doesn't exist.
 
 * @param name the name of the item to fetch.
 
 */
 
#define fetch_metadata(name) \
 
@@ -166,29 +167,29 @@ bool BaseMedia<Tbase_set>::AddFile(const
 
		}
 
		if (duplicate != NULL) {
 
			/* The more complete set takes precedence over the version number. */
 
			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<Tbase_set>::duplicate_sets;
 
				BaseMedia<Tbase_set>::duplicate_sets = set;
 
			} else {
 
				Tbase_set **prev = &BaseMedia<Tbase_set>::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
 
				 * version number until a new game is started which isn't a big problem */
 
				if (BaseMedia<Tbase_set>::used_set == duplicate) BaseMedia<Tbase_set>::used_set = set;
 

	
 
				DEBUG(grf, 1, "Removing %s (%i) as base " SET_TYPE " set (duplicate)", duplicate->name, duplicate->version);
 
				delete duplicate;
 
				duplicate->next = BaseMedia<Tbase_set>::duplicate_sets;
 
				BaseMedia<Tbase_set>::duplicate_sets = duplicate;
 
				ret = true;
 
			}
 
		} else {
 
			Tbase_set **last = &BaseMedia<Tbase_set>::available_sets;
 
			while (*last != NULL) last = &(*last)->next;
 

	
 
@@ -251,16 +252,15 @@ template <class Tbase_set>
 
	return p;
 
}
 

	
 
#if defined(ENABLE_NETWORK)
 
#include "network/network_content.h"
 

	
 
template <class Tbase_set>
 
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
 
template <class Tbase_set> bool HasBaseSet(const ContentInfo *ci, bool md5sum, const Tbase_set *s)
 
{
 
	for (const Tbase_set *s = BaseMedia<Tbase_set>::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;
 
		if (!md5sum) return true;
 

	
 
		byte md5[16];
 
@@ -273,12 +273,19 @@ template <class Tbase_set>
 
		if (memcmp(md5, ci->md5sum, sizeof(md5)) == 0) return true;
 
	}
 

	
 
	return false;
 
}
 

	
 
template <class Tbase_set>
 
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
 
{
 
	return HasBaseSet(ci, md5sum, BaseMedia<Tbase_set>::available_sets) ||
 
			HasBaseSet(ci, md5sum, BaseMedia<Tbase_set>::duplicate_sets);
 
}
 

	
 
#else
 

	
 
template <class Tbase_set>
 
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
 
{
 
	return false;
0 comments (0 inline, 0 general)