Exemple #1
0
        private FolderRecord[] LoadFolderRecords()
        {
            using var rdr           = GetStream();
            rdr.BaseStream.Position = _folderRecordOffset;
            var folderHeaderLength = FolderRecord.HeaderLength(HeaderType);
            ReadOnlyMemorySlice <byte> folderHeaderData = rdr.ReadBytes(checked ((int)(folderHeaderLength * _folderCount)));

            var ret = new FolderRecord[_folderCount];

            for (var idx = 0; idx < _folderCount; idx += 1)
            {
                ret[idx] = new FolderRecord(this, folderHeaderData.Slice(idx * folderHeaderLength, folderHeaderLength), idx);
            }

            // Slice off appropriate file header data per folder
            int fileCountTally = 0;

            foreach (var folder in ret)
            {
                folder.ProcessFileRecordHeadersBlock(rdr, fileCountTally);
                fileCountTally = checked ((int)(fileCountTally + folder.FileCount));
            }

            if (HasFileNames)
            {
                var filenameBlock = new FileNameBlock(this, rdr.BaseStream.Position);
                foreach (var folder in ret)
                {
                    folder.FileNameBlock = filenameBlock;
                }
            }

            return(ret);
        }
Exemple #2
0
        public FileRecord(BSAReader bsa, FolderRecord folderRecord, BinaryReader src, int index)
        {
            _index = index;
            _bsa   = bsa;
            Hash   = src.ReadUInt64();
            var size = src.ReadUInt32();

            FlipCompression = (size & (0x1 << 30)) > 0;

            if (FlipCompression)
            {
                _size = size ^ (0x1 << 30);
            }
            else
            {
                _size = size;
            }

            if (Compressed)
            {
                _size -= 4;
            }

            _offset = src.ReadUInt32();
            Folder  = folderRecord;

            var old_pos = src.BaseStream.Position;

            src.BaseStream.Position = _offset;

            if (bsa.HasNameBlobs)
            {
                _nameBlob = src.ReadStringLenNoTerm(bsa.HeaderType);
            }


            if (Compressed)
            {
                _originalSize = src.ReadUInt32();
            }

            _onDiskSize = (uint)(_size - (_nameBlob == null ? 0 : _nameBlob.Length + 1));

            if (Compressed)
            {
                _dataSize    = _originalSize;
                _onDiskSize -= 4;
            }
            else
            {
                _dataSize = _onDiskSize;
            }

            _dataOffset = src.BaseStream.Position;

            src.BaseStream.Position = old_pos;
        }
Exemple #3
0
        public FileRecord(BSAReader bsa, FolderRecord folderRecord, BinaryReader src)
        {
            _bsa  = bsa;
            _hash = src.ReadUInt64();
            var size = src.ReadInt32();

            _compressedFlag = (size & (0x1 << 30)) > 0;

            if (_compressedFlag)
            {
                _size = size ^ (0x1 << 30);
            }
            else
            {
                _size = size;
            }

            _offset = src.ReadInt32();

            _folder = folderRecord;
        }
Exemple #4
0
 internal void LoadFileRecord(BSAReader bsaReader, FolderRecord folder, FileRecord file, BinaryReader rdr)
 {
     _name = rdr.ReadStringTerm(_bsa.HeaderType);
 }