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()
+2 -1
View File
@@ -4,6 +4,7 @@ import (
"encoding/binary"
"errors"
"io"
"strconv"
)
const (
@@ -72,7 +73,7 @@ func Read(r io.Reader, blockSize uint32) (i Inode, err error) {
case ESock:
i.Data, err = ReadEIPC(r)
default:
return i, errors.New("invalid inode type")
return i, errors.New("invalid inode type " + strconv.Itoa(int(i.Type)))
}
return
}
+8 -3
View File
@@ -21,9 +21,14 @@ func NewReader(r io.Reader, d decompress.Decompressor) (*Reader, error) {
}
func (r *Reader) Advance() error {
if clr, ok := r.cur.(io.Closer); ok {
clr.Close()
}
//For some reason things get closed improperly and causes issues.
//NO IDEA HOW THIS IS HAPPENING.
// if clr, ok := r.cur.(io.Closer); ok {
// clr.Close()
// r.cur = nil
// }
var size uint16
err := binary.Read(r.master, binary.LittleEndian, &size)
if err != nil {