File diff r25654:e264fd698eb2 → r25655:1030dcb7eb52
src/base_media_func.h
Show inline comments
 
@@ -19,14 +19,14 @@
 
 * 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) \
 
	item = metadata->GetItem(name, false); \
 
	if (item == nullptr || !item->value.has_value() || item->value->empty()) { \
 
		DEBUG(grf, 0, "Base " SET_TYPE "set detail loading: %s field missing.", name); \
 
		DEBUG(grf, 0, "  Is %s readable for the user running OpenTTD?", full_filename); \
 
		Debug(grf, 0, "Base " SET_TYPE "set detail loading: {} field missing.", name); \
 
		Debug(grf, 0, "  Is {} readable for the user running OpenTTD?", full_filename); \
 
		return false; \
 
	}
 

	
 
/**
 
 * Read the set information from a loaded ini.
 
 * @param ini      the ini to read from
 
@@ -71,13 +71,13 @@ bool BaseSet<T, Tnum_files, Tsearch_in_t
 
	IniGroup *origin = ini->GetGroup("origin");
 
	for (uint i = 0; i < Tnum_files; i++) {
 
		MD5File *file = &this->files[i];
 
		/* Find the filename first. */
 
		item = files->GetItem(BaseSet<T, Tnum_files, Tsearch_in_tars>::file_names[i], false);
 
		if (item == nullptr || (!item->value.has_value() && !allow_empty_filename)) {
 
			DEBUG(grf, 0, "No " SET_TYPE " file for: %s (in %s)", BaseSet<T, Tnum_files, Tsearch_in_tars>::file_names[i], full_filename);
 
			Debug(grf, 0, "No " SET_TYPE " file for: {} (in {})", BaseSet<T, Tnum_files, Tsearch_in_tars>::file_names[i], full_filename);
 
			return false;
 
		}
 

	
 
		if (!item->value.has_value()) {
 
			file->filename = nullptr;
 
			/* If we list no file, that file must be valid */
 
@@ -89,26 +89,26 @@ bool BaseSet<T, Tnum_files, Tsearch_in_t
 
		const char *filename = item->value->c_str();
 
		file->filename = str_fmt("%s%s", path, filename);
 

	
 
		/* Then find the MD5 checksum */
 
		item = md5s->GetItem(filename, false);
 
		if (item == nullptr || !item->value.has_value()) {
 
			DEBUG(grf, 0, "No MD5 checksum specified for: %s (in %s)", filename, full_filename);
 
			Debug(grf, 0, "No MD5 checksum specified for: {} (in {})", filename, full_filename);
 
			return false;
 
		}
 
		const char *c = item->value->c_str();
 
		for (uint i = 0; i < sizeof(file->hash) * 2; i++, c++) {
 
			uint j;
 
			if ('0' <= *c && *c <= '9') {
 
				j = *c - '0';
 
			} else if ('a' <= *c && *c <= 'f') {
 
				j = *c - 'a' + 10;
 
			} else if ('A' <= *c && *c <= 'F') {
 
				j = *c - 'A' + 10;
 
			} else {
 
				DEBUG(grf, 0, "Malformed MD5 checksum specified for: %s (in %s)", filename, full_filename);
 
				Debug(grf, 0, "Malformed MD5 checksum specified for: {} (in {})", filename, full_filename);
 
				return false;
 
			}
 
			if (i % 2 == 0) {
 
				file->hash[i / 2] = j << 4;
 
			} else {
 
				file->hash[i / 2] |= j;
 
@@ -116,13 +116,13 @@ bool BaseSet<T, Tnum_files, Tsearch_in_t
 
		}
 

	
 
		/* Then find the warning message when the file's missing */
 
		item = origin->GetItem(filename, false);
 
		if (item == nullptr) item = origin->GetItem("default", false);
 
		if (item == nullptr || !item->value.has_value()) {
 
			DEBUG(grf, 1, "No origin warning message specified for: %s", filename);
 
			Debug(grf, 1, "No origin warning message specified for: {}", filename);
 
			file->missing_warning = stredup("");
 
		} else {
 
			file->missing_warning = stredup(item->value->c_str());
 
		}
 

	
 
		file->check_result = T::CheckMD5(file, BASESET_DIR);
 
@@ -133,30 +133,30 @@ bool BaseSet<T, Tnum_files, Tsearch_in_t
 
			case MD5File::CR_MATCH:
 
				this->valid_files++;
 
				this->found_files++;
 
				break;
 

	
 
			case MD5File::CR_MISMATCH:
 
				DEBUG(grf, 1, "MD5 checksum mismatch for: %s (in %s)", filename, full_filename);
 
				Debug(grf, 1, "MD5 checksum mismatch for: {} (in {})", filename, full_filename);
 
				this->found_files++;
 
				break;
 

	
 
			case MD5File::CR_NO_FILE:
 
				DEBUG(grf, 1, "The file %s specified in %s is missing", filename, full_filename);
 
				Debug(grf, 1, "The file {} specified in {} is missing", filename, full_filename);
 
				break;
 
		}
 
	}
 

	
 
	return true;
 
}
 

	
 
template <class Tbase_set>
 
bool BaseMedia<Tbase_set>::AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename)
 
{
 
	bool ret = false;
 
	DEBUG(grf, 1, "Checking %s for base " SET_TYPE " set", filename.c_str());
 
	Debug(grf, 1, "Checking {} for base " SET_TYPE " set", filename);
 

	
 
	Tbase_set *set = new Tbase_set();
 
	IniFile *ini = new IniFile();
 
	std::string path{ filename, basepath_length };
 
	ini->LoadFromDisk(path, BASESET_DIR);
 

	
 
@@ -176,13 +176,13 @@ bool BaseMedia<Tbase_set>::AddFile(const
 
			}
 
		}
 
		if (duplicate != nullptr) {
 
			/* 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, %s)", set->name.c_str(), set->version,
 
				Debug(grf, 1, "Not adding {} ({}) as base " SET_TYPE " set (duplicate, {})", set->name, set->version,
 
						duplicate->valid_files > set->valid_files ? "less valid files" : "lower version");
 
				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;
 
@@ -192,13 +192,13 @@ bool BaseMedia<Tbase_set>::AddFile(const
 

	
 
				/* 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, %s)", duplicate->name.c_str(), duplicate->version,
 
				Debug(grf, 1, "Removing {} ({}) as base " SET_TYPE " set (duplicate, {})", duplicate->name, duplicate->version,
 
						duplicate->valid_files < set->valid_files ? "less valid files" : "lower version");
 
				duplicate->next = BaseMedia<Tbase_set>::duplicate_sets;
 
				BaseMedia<Tbase_set>::duplicate_sets = duplicate;
 
				ret = true;
 
			}
 
		} else {
 
@@ -206,13 +206,13 @@ bool BaseMedia<Tbase_set>::AddFile(const
 
			while (*last != nullptr) last = &(*last)->next;
 

	
 
			*last = set;
 
			ret = true;
 
		}
 
		if (ret) {
 
			DEBUG(grf, 1, "Adding %s (%i) as base " SET_TYPE " set", set->name.c_str(), set->version);
 
			Debug(grf, 1, "Adding {} ({}) as base " SET_TYPE " set", set->name, set->version);
 
		}
 
	} else {
 
		delete set;
 
	}
 

	
 
	delete ini;