From a3a2fdcfc2f8737ed1c52672c473b4fe32ac2bc9 Mon Sep 17 00:00:00 2001 From: rubidium Date: Wed, 16 Nov 2011 16:54:37 +0000 Subject: (svn r23234) -Fix [FS#4840]: crash when after downloading content --- src/fileio.cpp | 12 ++++++++++++ src/fileio_func.h | 2 ++ src/network/network_content.cpp | 34 +++++++++++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/fileio.cpp b/src/fileio.cpp index 8f57eb8a5..82b2f7c7e 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -682,6 +682,18 @@ uint TarScanner::DoScan(Subdirectory sd) 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. */ diff --git a/src/fileio_func.h b/src/fileio_func.h index ddc86f692..76bd54302 100644 --- a/src/fileio_func.h +++ b/src/fileio_func.h @@ -105,6 +105,8 @@ public: /* 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); }; diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index 40bf03f97..d1a04c04e 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -530,13 +530,41 @@ void ClientNetworkContentSocketHandler::AfterDownload() 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); -- cgit v1.2.3-54-g00ecf