8 "github.com/anacrolix/missinggo"
10 "github.com/anacrolix/torrent/metainfo"
17 func NewClient(cl ClientImpl) *Client {
21 func (cl Client) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (*Torrent, error) {
22 t, err := cl.ClientImpl.OpenTorrent(info, infoHash)
23 return &Torrent{t}, err
30 func (t Torrent) Piece(p metainfo.Piece) Piece {
31 return Piece{t.TorrentImpl.Piece(p), p}
39 func (p Piece) WriteAt(b []byte, off int64) (n int, err error) {
40 if p.GetIsComplete() {
41 err = errors.New("piece completed")
44 if off+int64(len(b)) > p.mip.Length() {
45 panic("write overflows piece")
47 missinggo.LimitLen(&b, p.mip.Length()-off)
48 return p.PieceImpl.WriteAt(b, off)
51 func (p Piece) ReadAt(b []byte, off int64) (n int, err error) {
56 if off >= p.mip.Length() {
60 missinggo.LimitLen(&b, p.mip.Length()-off)
64 n, err = p.PieceImpl.ReadAt(b, off)
69 if err == io.EOF && off < p.mip.Length() {
70 err = io.ErrUnexpectedEOF
72 if err == nil && off >= p.mip.Length() {
75 if n == 0 && err == nil {
76 err = io.ErrUnexpectedEOF
78 if off < p.mip.Length() && err != nil {