Fixing issues

This commit is contained in:
Caleb Gardner
2022-06-18 06:30:04 -05:00
parent cde6a265a1
commit 9ac8fef3b2
13 changed files with 189 additions and 425 deletions
+21 -5
View File
@@ -10,7 +10,7 @@ import (
type FullReader struct {
r io.ReaderAt
d decompress.Decompressor
fragRdr io.Reader
fragRdr func() (io.Reader, error)
sizes []uint32
blockSize uint32
start uint64
@@ -26,7 +26,7 @@ func NewFullReader(r io.ReaderAt, start uint64, d decompress.Decompressor, block
}
}
func (r *FullReader) AddFragment(rdr io.Reader) {
func (r *FullReader) AddFragment(rdr func() (io.Reader, error)) {
r.fragRdr = rdr
}
@@ -40,6 +40,14 @@ func (r FullReader) process(index int, offset int64, out chan outDat) {
var err error
var dat []byte
size := realSize(r.sizes[index])
if size == 0 {
out <- outDat{
i: index,
err: nil,
data: make([]byte, r.blockSize),
}
return
}
rdr := io.LimitReader(toreader.NewReader(r.r, offset), int64(size))
if size == r.sizes[index] {
rdr, err = r.d.Reader(rdr)
@@ -64,13 +72,21 @@ func (r FullReader) WriteTo(w io.Writer) (n int64, err error) {
for i := 0; i < num; i++ {
if i == num-1 && r.fragRdr != nil {
go func() {
dat, e := io.ReadAll(r.fragRdr)
rdr, e := r.fragRdr()
if err != nil {
out <- outDat{
i: num - 1,
err: e,
}
return
}
dat, e := io.ReadAll(rdr)
out <- outDat{
i: num,
i: num - 1,
err: e,
data: dat,
}
if clr, ok := r.fragRdr.(io.Closer); ok {
if clr, ok := rdr.(io.Closer); ok {
clr.Close()
}
}()
+8 -3
View File
@@ -16,14 +16,13 @@ type Reader struct {
blockSize uint32
}
func NewReader(r io.Reader, d decompress.Decompressor, blockSizes []uint32, blockSize uint32) (*Reader, error) {
func NewReader(r io.Reader, d decompress.Decompressor, blockSizes []uint32, blockSize uint32) *Reader {
var out Reader
out.d = d
out.master = r
out.blockSizes = blockSizes
out.blockSize = blockSize
err := out.advance()
return &out, err
return &out
}
func (r *Reader) AddFragment(rdr io.Reader) {
@@ -59,6 +58,12 @@ func (r *Reader) advance() (err error) {
}
func (r *Reader) Read(p []byte) (n int, err error) {
if r.cur == nil {
err = r.advance()
if err != nil {
return
}
}
n, err = r.cur.Read(p)
if err == io.EOF {
err = r.advance()