diff --git a/AUTHORS b/AUTHORS index d47612ad7a..3c55b55c6d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -12,6 +12,7 @@ The OpenRA developers are: Also thanks to: * Akseli Virtanen (RAGEQUIT) * Andrew Riedi + * Andreas Beck (baxtor) * Barnaby Smith (mvi) * Bellator * Bugra Cuhadaroglu (BugraC) diff --git a/OpenRA.FileFormats/Filesystem/InstallShieldPackage.cs b/OpenRA.FileFormats/Filesystem/InstallShieldPackage.cs index f58f86f1ef..bff057b838 100644 --- a/OpenRA.FileFormats/Filesystem/InstallShieldPackage.cs +++ b/OpenRA.FileFormats/Filesystem/InstallShieldPackage.cs @@ -49,11 +49,20 @@ namespace OpenRA.FileFormats // Parse the directory list s.Seek(TOCAddress, SeekOrigin.Begin); BinaryReader TOCreader = new BinaryReader(s); + + var fileCountInDirs = new List(); + // Parse directories for (var i = 0; i < DirCount; i++) - ParseDirectory(TOCreader); + fileCountInDirs.Add(ParseDirectory(TOCreader)); + + // Parse files + foreach (var fileCount in fileCountInDirs) + for (var i = 0; i < fileCount; i++) + ParseFile(reader); + } - void ParseDirectory(BinaryReader reader) + uint ParseDirectory(BinaryReader reader) { // Parse directory header var FileCount = reader.ReadUInt16(); @@ -63,10 +72,7 @@ namespace OpenRA.FileFormats // Skip to the end of the chunk reader.ReadBytes(ChunkSize - NameLength - 6); - - // Parse files - for (var i = 0; i < FileCount; i++) - ParseFile(reader); + return FileCount; } uint AccumulatedData = 0; @@ -81,7 +87,8 @@ namespace OpenRA.FileFormats var FileName = new String(reader.ReadChars(NameLength)); var hash = PackageEntry.HashFilename(FileName, PackageHashType.Classic); - index.Add(hash, new PackageEntry(hash, AccumulatedData, CompressedSize)); + if(!index.ContainsKey(hash)) + index.Add(hash, new PackageEntry(hash,AccumulatedData, CompressedSize)); filenames.Add(FileName); AccumulatedData += CompressedSize;