Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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);
        }