changeset 18398:78922d7138a3 draft

(svn r23234) -Fix [FS#4840]: crash when after downloading content
author rubidium <rubidium@openttd.org>
date Wed, 16 Nov 2011 16:54:37 +0000
parents 2403d22fbd81
children ee2c251aab75
files src/fileio.cpp src/fileio_func.h src/network/network_content.cpp
diffstat 3 files changed, 45 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.cpp
+++ b/src/fileio.cpp
@@ -682,6 +682,18 @@
 	return num;
 }
 
+/**
+ * Add a single file to the scanned files of a tar, circumventing the scanning code.
+ * @param sd       The sub directory the file is in.
+ * @param filename The name of the file to add.
+ * @return True if the additions went correctly.
+ */
+bool TarScanner::AddFile(Subdirectory sd, const char *filename)
+{
+	this->subdir = sd;
+	return this->AddFile(filename, 0);
+}
+
 bool TarScanner::AddFile(const char *filename, size_t basepath_length, const char *tar_filename)
 {
 	/* No tar within tar. */
--- a/src/fileio_func.h
+++ b/src/fileio_func.h
@@ -105,6 +105,8 @@
 
 	/* virtual */ bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename = NULL);
 
+	bool AddFile(Subdirectory sd, const char *filename);
+
 	/** Do the scan for Tars. */
 	static uint DoScan(TarScanner::Mode mode);
 };
--- a/src/network/network_content.cpp
+++ b/src/network/network_content.cpp
@@ -530,13 +530,41 @@
 	if (GunzipFile(this->curInfo)) {
 		unlink(GetFullFilename(this->curInfo, true));
 
-		TarScanner ts;
-		ts.AddFile(GetFullFilename(this->curInfo, false), 0);
-
 		if (this->curInfo->type == CONTENT_TYPE_BASE_MUSIC) {
 			/* Music can't be in a tar. So extract the tar! */
 			ExtractTar(GetFullFilename(this->curInfo, false), BASESET_DIR);
 			unlink(GetFullFilename(this->curInfo, false));
+		} else {
+			Subdirectory sd = NO_DIRECTORY;
+			switch (this->curInfo->type) {
+				case CONTENT_TYPE_AI:
+					sd = AI_DIR;
+					break;
+
+				case CONTENT_TYPE_AI_LIBRARY:
+					sd = AI_LIBRARY_DIR;
+					break;
+
+				case CONTENT_TYPE_BASE_GRAPHICS:
+				case CONTENT_TYPE_BASE_SOUNDS:
+				case CONTENT_TYPE_BASE_MUSIC:
+					sd = BASESET_DIR;
+					break;
+
+				case CONTENT_TYPE_NEWGRF:
+					sd = NEWGRF_DIR;
+					break;
+
+				case CONTENT_TYPE_SCENARIO:
+				case CONTENT_TYPE_HEIGHTMAP:
+					sd = SCENARIO_DIR;
+					break;
+
+				default: NOT_REACHED();
+			}
+
+			TarScanner ts;
+			ts.AddFile(sd, GetFullFilename(this->curInfo, false));
 		}
 
 		this->OnDownloadComplete(this->curInfo->id);