Tested and working

This commit is contained in:
Caleb Gardner
2025-06-06 11:20:42 -05:00
parent 97214ca6ca
commit 81b663b48a
2 changed files with 24 additions and 14 deletions
+17 -11
View File
@@ -19,18 +19,19 @@ type FullReader struct {
fragDat []byte fragDat []byte
} }
func NewFullReader(rdr io.ReaderAt, decomp decompress.Decompressor, size uint64, start uint64, blockSizes []uint32) FullReader { func NewFullReader(rdr io.ReaderAt, decomp decompress.Decompressor, blockSize uint32, size uint64, start uint64, sizes []uint32) FullReader {
out := FullReader{ out := FullReader{
fileSize: size, fileSize: size,
rdr: rdr, blockSize: blockSize,
decomp: decomp, rdr: rdr,
sizes: blockSizes, decomp: decomp,
sizes: sizes,
} }
out.blockOffsets = make([]uint64, len(blockSizes)) out.blockOffsets = make([]uint64, len(sizes))
curOffset := start curOffset := start
for i := range blockSizes { for i := range sizes {
out.blockOffsets[i] = curOffset out.blockOffsets[i] = curOffset
curOffset += uint64(blockSizes[i]) &^ (1 << 24) curOffset += uint64(sizes[i]) &^ (1 << 24)
} }
return out return out
} }
@@ -42,12 +43,15 @@ func (f *FullReader) Close() error {
return nil return nil
} }
func (f *FullReader) AddFragData(blockStart uint64, offset uint32, blockSize uint32) error { func (f *FullReader) AddFragData(blockStart uint64, blockSize uint32, offset uint32) error {
realSize := blockSize &^ (1 << 24) realSize := blockSize &^ (1 << 24)
dat := make([]byte, realSize) dat := make([]byte, realSize)
_, err := f.rdr.ReadAt(dat, int64(blockStart)) _, err := f.rdr.ReadAt(dat, int64(blockStart))
if err != nil { if err != nil {
return err return err
}
if realSize == 0 {
} }
if blockSize == realSize { if blockSize == realSize {
dat, err = f.decomp.Decompress(dat) dat, err = f.decomp.Decompress(dat)
@@ -120,8 +124,8 @@ func (f FullReader) WriteTo(w io.Writer) (wrote int64, err error) {
} }
for i := range f.BlockNum() { for i := range f.BlockNum() {
go func(idx uint32) { go func(idx uint32) {
_, closed := <-dispatchChan _, open := <-dispatchChan
if closed { if !open {
resChan <- blockResults{} resChan <- blockResults{}
return return
} }
@@ -143,6 +147,7 @@ func (f FullReader) WriteTo(w io.Writer) (wrote int64, err error) {
errOut = append(errOut, res.err) errOut = append(errOut, res.err)
} }
if len(errOut) > 0 { if len(errOut) > 0 {
i++
continue continue
} }
if wa, is := w.(io.WriterAt); is { if wa, is := w.(io.WriterAt); is {
@@ -152,6 +157,7 @@ func (f FullReader) WriteTo(w io.Writer) (wrote int64, err error) {
} else { } else {
out = max(out, int64(res.idx)*int64(f.blockSize)+int64(len(res.block))) out = max(out, int64(res.idx)*int64(f.blockSize)+int64(len(res.block)))
} }
i++
continue continue
} }
var err error var err error
+7 -3
View File
@@ -107,7 +107,7 @@ func (b FileBase) GetRegFileReaders(r Reader) (data.Reader, data.FullReader, err
sizes = b.Inode.Data.(inode.EFile).BlockSizes sizes = b.Inode.Data.(inode.EFile).BlockSizes
fileSize = b.Inode.Data.(inode.EFile).Size fileSize = b.Inode.Data.(inode.EFile).Size
} }
outFull := data.NewFullReader(r.r, r.d, fileSize, blockStart, sizes) outFull := data.NewFullReader(r.r, r.d, r.Superblock.BlockSize, fileSize, blockStart, sizes)
if fragIndex != 0xffffffff { if fragIndex != 0xffffffff {
outFull.AddFragData(r.fragTable[fragIndex].Start, fragOffset, r.fragTable[fragIndex].Size) outFull.AddFragData(r.fragTable[fragIndex].Start, fragOffset, r.fragTable[fragIndex].Size)
} }
@@ -140,9 +140,13 @@ func (b FileBase) GetFullReader(r *Reader) (data.FullReader, error) {
sizes = b.Inode.Data.(inode.EFile).BlockSizes sizes = b.Inode.Data.(inode.EFile).BlockSizes
fileSize = b.Inode.Data.(inode.EFile).Size fileSize = b.Inode.Data.(inode.EFile).Size
} }
outFull := data.NewFullReader(r.r, r.d, fileSize, blockStart, sizes) outFull := data.NewFullReader(r.r, r.d, r.Superblock.BlockSize, fileSize, blockStart, sizes)
if fragIndex != 0xffffffff { if fragIndex != 0xffffffff {
outFull.AddFragData(r.fragTable[fragIndex].Start, fragOffset, r.fragTable[fragIndex].Size) ent, err := r.fragEntry(fragIndex)
if err != nil {
return data.FullReader{}, err
}
outFull.AddFragData(ent.Start, ent.Size, fragOffset)
} }
return outFull, nil return outFull, nil
} }