6 "github.com/anacrolix/missinggo/resource"
7 "github.com/anacrolix/torrent/metainfo"
10 type piecePerResource struct {
14 func NewResourcePieces(p resource.Provider) ClientImpl {
15 return &piecePerResource{
20 func (s *piecePerResource) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (TorrentImpl, error) {
24 func (s *piecePerResource) Close() error {
28 func (s *piecePerResource) Piece(p metainfo.Piece) PieceImpl {
29 completed, err := s.p.NewInstance(path.Join("completed", p.Hash().HexString()))
33 incomplete, err := s.p.NewInstance(path.Join("incomplete", p.Hash().HexString()))
37 return piecePerResourcePiece{
44 type piecePerResourcePiece struct {
50 func (s piecePerResourcePiece) Completion() Completion {
53 Complete: 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) MarkNotComplete() error {
66 func (s piecePerResourcePiece) ReadAt(b []byte, off int64) (int, error) {
67 if s.Completion().Complete {
68 return s.c.ReadAt(b, off)
70 return s.i.ReadAt(b, off)
74 func (s piecePerResourcePiece) WriteAt(b []byte, off int64) (n int, err error) {
75 return s.i.WriteAt(b, off)