From 81b663b48a56691f0902735dc3a169f77020e7ef Mon Sep 17 00:00:00 2001 From: Caleb Gardner Date: Fri, 6 Jun 2025 11:20:42 -0500 Subject: [PATCH] Tested and working --- low/data/fullreader.go | 28 +++++++++++++++++----------- low/file_base.go | 10 +++++++--- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/low/data/fullreader.go b/low/data/fullreader.go index 73c6544..74b0469 100644 --- a/low/data/fullreader.go +++ b/low/data/fullreader.go @@ -19,18 +19,19 @@ type FullReader struct { 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{ - fileSize: size, - rdr: rdr, - decomp: decomp, - sizes: blockSizes, + fileSize: size, + blockSize: blockSize, + rdr: rdr, + decomp: decomp, + sizes: sizes, } - out.blockOffsets = make([]uint64, len(blockSizes)) + out.blockOffsets = make([]uint64, len(sizes)) curOffset := start - for i := range blockSizes { + for i := range sizes { out.blockOffsets[i] = curOffset - curOffset += uint64(blockSizes[i]) &^ (1 << 24) + curOffset += uint64(sizes[i]) &^ (1 << 24) } return out } @@ -42,12 +43,15 @@ func (f *FullReader) Close() error { 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) dat := make([]byte, realSize) _, err := f.rdr.ReadAt(dat, int64(blockStart)) if err != nil { return err + } + if realSize == 0 { + } if blockSize == realSize { 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() { go func(idx uint32) { - _, closed := <-dispatchChan - if closed { + _, open := <-dispatchChan + if !open { resChan <- blockResults{} return } @@ -143,6 +147,7 @@ func (f FullReader) WriteTo(w io.Writer) (wrote int64, err error) { errOut = append(errOut, res.err) } if len(errOut) > 0 { + i++ continue } if wa, is := w.(io.WriterAt); is { @@ -152,6 +157,7 @@ func (f FullReader) WriteTo(w io.Writer) (wrote int64, err error) { } else { out = max(out, int64(res.idx)*int64(f.blockSize)+int64(len(res.block))) } + i++ continue } var err error diff --git a/low/file_base.go b/low/file_base.go index 635fac1..7e75146 100644 --- a/low/file_base.go +++ b/low/file_base.go @@ -107,7 +107,7 @@ func (b FileBase) GetRegFileReaders(r Reader) (data.Reader, data.FullReader, err sizes = b.Inode.Data.(inode.EFile).BlockSizes 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 { 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 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 { - 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 }