/// <summary> /// Updates the tracker and returns the namespace enum that should be /// used for the entry. /// </summary> /// <param name="entry">The entry to evaluate.</param> /// <returns>The namespace to use for it.</returns> public ResourceNamespace Update(WadDirectoryEntry entry) { if (EntryToNamespace.TryGetValue(entry.Name, out ResourceNamespace resourceNamespace)) { Current = resourceNamespace; return(ResourceNamespace.Global); } return(Current); }
private static List <WadEntry> ReadEntriesOrThrow(byte[] wadData) { ByteReader reader = ByteReader.From(ByteOrder.Little, wadData); // The header must exist fully or else we can't read it. if (!reader.HasRemaining(12)) { throw new Exception("Cannot read Wad"); } WadResourceNamespaceTracker namespaceTracker = new WadResourceNamespaceTracker(); List <WadEntry> entries = new List <WadEntry>(); WadHeader header = ReadHeader(reader); reader.Offset = header.DirectoryTableOffset; for (int i = 0; i < header.EntryCount; i++) { WadDirectoryEntry dirEntry = ReadWadEntry(reader); ResourceNamespace resourceNamespace = namespaceTracker.Update(dirEntry); byte[] data = reader.Bytes(dirEntry.Size, dirEntry.Offset); // Unfortunately binary readers can silently fail and just // consume the remaining data. We want to let the caller // know the wad is in fact corrupt if it can't read enough. if (data.Length != dirEntry.Size) { throw new Exception("Malformed wad entry length"); } WadEntry entry = new WadEntry(dirEntry.Name, resourceNamespace, data); entries.Add(entry); } return(entries); }