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
}
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
+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
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
}