示例#1
0
        internal Group(IReader headerReader, IReader dataReader)
        {
            this.Type      = Signature.Read(0, headerReader);
            this.Size      = headerReader.ReadUInt32(4);
            this.Label     = headerReader.ReadUInt32(8);
            this.GroupType = headerReader.ReadInt32(12);
            this.Stamp     = headerReader.ReadUInt16(16);
            this.Unknown1  = headerReader.ReadUInt16(18);
            this.Version   = headerReader.ReadUInt16(20);
            this.Unknown2  = headerReader.ReadUInt16(22);

            this.Children = new List <IRecordOrGroup>();

            var children = dataReader;

            while (true)
            {
                if (children.Length < 4)
                {
                    break;
                }
                var            type        = Signature.Read(0, children);
                var            size        = children.ReadUInt32(4);
                IRecordOrGroup item        = null;
                var            actualSize  = size;
                var            childHeader = children.Slice(0, 24);

                var keep = false;
                if (type == GRUP)
                {
                    /*var childData = children.Slice(24, (int) size - 24);
                     * item = new Group(childHeader, childData);
                     * keep = true;*/
                }
                else
                {
                    actualSize += 24;
                    if (Registry.ParsedRecords.ContainsKey(type))
                    {
                        var childData = children.Slice(24, (int)size);
                        item
                            = Registry.ParsedRecords.TryGetValue(type, out var constructor)
                                ? constructor(childHeader, childData)
                                : new Record(childHeader, childData);
                        keep = true;
                    }
                }

                if (keep)
                {
                    this.Children.Add(item);
                }
                children = children.Slice((int)actualSize);
            }
        }
示例#2
0
        public ModFile(string filename)
        {
            this.Children = new List <IRecordOrGroup>();

            using (var fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 8192,
                                           FileOptions.SequentialScan))
            {
                using (var br = new BinaryReader(fs))
                {
                    while (true)
                    {
                        if (fs.Position + 4 >= fs.Length)
                        {
                            break;
                        }
                        var header = br.NextChunk(24);

                        var type = Signature.Read(0, header);
                        var size = header.ReadUInt32(4);

                        if (type == Group.GRUP)
                        {
                            size -= 24;
                        }

                        var data = br.NextChunk((int)size);

                        IRecordOrGroup item = null;
                        var            keep = false;
                        if (type == Group.GRUP)
                        {
                            /*item = new Group(header, data);
                             * keep = true;*/
                        }
                        else
                        {
                            if (Registry.ParsedRecords.ContainsKey(type))
                            {
                                item = Registry.ParsedRecords.TryGetValue(type, out var constructor)
                                    ? constructor(header, data)
                                    : new Record(header, data);
                                keep = true;
                            }
                        }
                        if (keep)
                        {
                            this.Children.Add(item);
                        }
                    }
                }
            }
        }