github.com/bodgit/sevenzip@v1.5.1/internal/lzma2/reader.go (about)

     1  package lzma2
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  
     7  	"github.com/ulikunitz/xz/lzma"
     8  )
     9  
    10  type readCloser struct {
    11  	c io.Closer
    12  	r io.Reader
    13  }
    14  
    15  func (rc *readCloser) Close() error {
    16  	var err error
    17  	if rc.c != nil {
    18  		err = rc.c.Close()
    19  		rc.c, rc.r = nil, nil
    20  	}
    21  
    22  	return err
    23  }
    24  
    25  func (rc *readCloser) Read(p []byte) (int, error) {
    26  	if rc.r == nil {
    27  		return 0, errors.New("lzma2: Read after Close")
    28  	}
    29  
    30  	return rc.r.Read(p)
    31  }
    32  
    33  // NewReader returns a new LZMA2 io.ReadCloser.
    34  func NewReader(p []byte, _ uint64, readers []io.ReadCloser) (io.ReadCloser, error) {
    35  	if len(readers) != 1 {
    36  		return nil, errors.New("lzma2: need exactly one reader")
    37  	}
    38  
    39  	if len(p) != 1 {
    40  		return nil, errors.New("lzma2: not enough properties")
    41  	}
    42  
    43  	config := lzma.Reader2Config{
    44  		DictCap: (2 | (int(p[0]) & 1)) << (p[0]/2 + 11), // This gem came from Lzma2Dec.c
    45  	}
    46  
    47  	if err := config.Verify(); err != nil {
    48  		return nil, err
    49  	}
    50  
    51  	lr, err := config.NewReader2(readers[0])
    52  	if err != nil {
    53  		return nil, err
    54  	}
    55  
    56  	return &readCloser{
    57  		c: readers[0],
    58  		r: lr,
    59  	}, nil
    60  }