6 "github.com/anacrolix/missinggo/resource"
8 "github.com/anacrolix/torrent/metainfo"
11 type piecePerResource struct {
15 func NewResourcePieces(p resource.Provider) ClientImpl {
16 return &piecePerResource{
21 func (s *piecePerResource) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (TorrentImpl, error) {
25 func (s *piecePerResource) Close() error {
29 func (s *piecePerResource) Piece(p metainfo.Piece) PieceImpl {
30 completed, err := s.p.NewInstance(path.Join("completed", p.Hash().HexString()))
34 incomplete, err := s.p.NewInstance(path.Join("incomplete", p.Hash().HexString()))
38 return piecePerResourcePiece{
45 type piecePerResourcePiece struct {
51 func (s piecePerResourcePiece) Completion() Completion {
54 Complete: err == nil && fi.Size() == s.p.Length(),
59 func (s piecePerResourcePiece) MarkComplete() error {
60 return resource.Move(s.i, s.c)
63 func (s piecePerResourcePiece) MarkNotComplete() error {
67 func (s piecePerResourcePiece) ReadAt(b []byte, off int64) (int, error) {
68 if s.Completion().Complete {
69 return s.c.ReadAt(b, off)
71 return s.i.ReadAt(b, off)
75 func (s piecePerResourcePiece) WriteAt(b []byte, off int64) (n int, err error) {
76 return s.i.WriteAt(b, off)