Tested and working
This commit is contained in:
+17
-11
@@ -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
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user