78 lines
2.0 KiB
Go
78 lines
2.0 KiB
Go
package torrent
|
|
|
|
import (
|
|
"io"
|
|
|
|
pp "bitbucket.org/anacrolix/go.torrent/peer_protocol"
|
|
)
|
|
|
|
type DownloadStrategy interface {
|
|
// Tops up the outgoing pending requests.
|
|
FillRequests(*torrent, *connection)
|
|
TorrentStarted(*torrent)
|
|
TorrentStopped(*torrent)
|
|
DeleteRequest(*torrent, request)
|
|
TorrentPrioritize(t *torrent, off, _len int64)
|
|
TorrentGotChunk(*torrent, request)
|
|
TorrentGotPiece(t *torrent, piece int)
|
|
WriteStatus(w io.Writer)
|
|
AssertNotRequested(*torrent, request)
|
|
PendingData(*torrent) bool
|
|
}
|
|
|
|
type DefaultDownloadStrategy struct{}
|
|
|
|
func (me *DefaultDownloadStrategy) PendingData(t *torrent) bool {
|
|
return !t.haveAllPieces()
|
|
}
|
|
|
|
func (me *DefaultDownloadStrategy) AssertNotRequested(t *torrent, r request) {}
|
|
|
|
func (me *DefaultDownloadStrategy) WriteStatus(w io.Writer) {}
|
|
|
|
func (s *DefaultDownloadStrategy) FillRequests(t *torrent, c *connection) {
|
|
if c.Interested {
|
|
if c.PeerChoked {
|
|
return
|
|
}
|
|
if len(c.Requests) > c.requestsLowWater {
|
|
return
|
|
}
|
|
}
|
|
addRequest := func(req request) (again bool) {
|
|
if len(c.Requests) >= 32 {
|
|
return false
|
|
}
|
|
return c.Request(req)
|
|
}
|
|
for e := c.pieceRequestOrder.First(); e != nil; e = e.Next() {
|
|
pieceIndex := e.Piece()
|
|
if !c.PeerHasPiece(pp.Integer(pieceIndex)) {
|
|
panic("piece in request order but peer doesn't have it")
|
|
}
|
|
if !t.wantPiece(pieceIndex) {
|
|
panic("unwanted piece in connection request order")
|
|
}
|
|
piece := t.Pieces[pieceIndex]
|
|
for _, cs := range piece.shuffledPendingChunkSpecs() {
|
|
r := request{pp.Integer(pieceIndex), cs}
|
|
if !addRequest(r) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func (s *DefaultDownloadStrategy) TorrentStarted(t *torrent) {}
|
|
|
|
func (s *DefaultDownloadStrategy) TorrentStopped(t *torrent) {
|
|
}
|
|
|
|
func (s *DefaultDownloadStrategy) DeleteRequest(t *torrent, r request) {
|
|
}
|
|
|
|
func (me *DefaultDownloadStrategy) TorrentGotChunk(t *torrent, c request) {}
|
|
func (me *DefaultDownloadStrategy) TorrentGotPiece(t *torrent, piece int) {}
|
|
func (*DefaultDownloadStrategy) TorrentPrioritize(t *torrent, off, _len int64) {}
|