7 "github.com/anacrolix/missinggo"
8 "github.com/anacrolix/missinggo/resource"
10 "github.com/anacrolix/torrent/metainfo"
13 type piecePerResource struct {
17 func NewResourcePieces(p resource.Provider) Client {
18 return &piecePerResource{
23 func (s *piecePerResource) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (Torrent, error) {
27 func (s *piecePerResource) Close() error {
31 func (s *piecePerResource) Piece(p metainfo.Piece) Piece {
32 completed, err := s.p.NewInstance(path.Join("completed", p.Hash().HexString()))
36 incomplete, err := s.p.NewInstance(path.Join("incomplete", p.Hash().HexString()))
40 return piecePerResourcePiece{
47 type piecePerResourcePiece struct {
53 func (s piecePerResourcePiece) GetIsComplete() bool {
55 return err == nil && fi.Size() == s.p.Length()
58 func (s piecePerResourcePiece) MarkComplete() error {
59 return resource.Move(s.i, s.c)
62 func (s piecePerResourcePiece) ReadAt(b []byte, off int64) (n int, err error) {
63 missinggo.LimitLen(&b, s.p.Length()-off)
64 n, err = s.c.ReadAt(b, off)
66 n, err = s.i.ReadAt(b, off)
69 if off >= s.p.Length() {
71 } else if err == io.EOF {
72 err = io.ErrUnexpectedEOF
77 func (s piecePerResourcePiece) WriteAt(b []byte, off int64) (n int, err error) {
78 missinggo.LimitLen(&b, s.p.Length()-off)
79 return s.i.WriteAt(b, off)