4 "github.com/anacrolix/torrent/segments"
9 "github.com/anacrolix/torrent/metainfo"
12 type filePieceImpl struct {
19 var _ PieceImpl = (*filePieceImpl)(nil)
21 func (me *filePieceImpl) pieceKey() metainfo.PieceKey {
22 return metainfo.PieceKey{me.infoHash, me.p.Index()}
25 func (fs *filePieceImpl) Completion() Completion {
26 c, err := fs.completion.Get(fs.pieceKey())
28 log.Printf("error getting piece completion: %s", err)
35 // If it's allegedly complete, check that its constituent files have the necessary length.
36 if !fs.segmentLocater.Locate(segments.Extent{
38 Length: fs.p.Length(),
39 }, func(i int, extent segments.Extent) bool {
41 s, err := os.Stat(file.path)
42 if err != nil || s.Size() < extent.Start+extent.Length {
48 panic("files do not cover piece extent")
53 // The completion was wrong, fix it.
55 fs.completion.Set(fs.pieceKey(), false)
61 func (fs *filePieceImpl) MarkComplete() error {
62 return fs.completion.Set(fs.pieceKey(), true)
65 func (fs *filePieceImpl) MarkNotComplete() error {
66 return fs.completion.Set(fs.pieceKey(), false)