4 g "github.com/anacrolix/generics"
6 "github.com/anacrolix/torrent/metainfo"
7 request_strategy "github.com/anacrolix/torrent/request-strategy"
8 "github.com/anacrolix/torrent/storage"
11 type requestStrategyInputCommon struct {
12 maxUnverifiedBytes int64
15 func (r requestStrategyInputCommon) MaxUnverifiedBytes() int64 {
16 return r.maxUnverifiedBytes
19 type requestStrategyInputMultiTorrent struct {
20 requestStrategyInputCommon
21 torrents map[metainfo.Hash]*Torrent
22 capFunc storage.TorrentCapacity
25 func (r requestStrategyInputMultiTorrent) Torrent(ih metainfo.Hash) request_strategy.Torrent {
26 return requestStrategyTorrent{g.MapMustGet(r.torrents, ih)}
29 func (r requestStrategyInputMultiTorrent) Capacity() (int64, bool) {
33 type requestStrategyInputSingleTorrent struct {
34 requestStrategyInputCommon
38 func (r requestStrategyInputSingleTorrent) Torrent(_ metainfo.Hash) request_strategy.Torrent {
39 return requestStrategyTorrent{r.t}
42 func (r requestStrategyInputSingleTorrent) Capacity() (cap int64, capped bool) {
46 var _ request_strategy.Input = requestStrategyInputSingleTorrent{}
48 func (cl *Client) getRequestStrategyInputCommon() requestStrategyInputCommon {
49 return requestStrategyInputCommon{cl.config.MaxUnverifiedBytes}
52 // Returns what is necessary to run request_strategy.GetRequestablePieces for primaryTorrent.
53 func (cl *Client) getRequestStrategyInput(primaryTorrent *Torrent) (input request_strategy.Input) {
54 if !primaryTorrent.hasStorageCap() {
55 return requestStrategyInputSingleTorrent{
56 requestStrategyInputCommon: cl.getRequestStrategyInputCommon(),
60 return requestStrategyInputMultiTorrent{
61 requestStrategyInputCommon: cl.getRequestStrategyInputCommon(),
62 // TODO: Check this is an appropriate key
63 torrents: cl.torrentsByShortHash,
64 capFunc: primaryTorrent.storage.Capacity,
69 func (t *Torrent) getRequestStrategyInput() request_strategy.Input {
70 return t.cl.getRequestStrategyInput(t)
73 type requestStrategyTorrent struct {
77 func (r requestStrategyTorrent) Piece(i int) request_strategy.Piece {
78 return (*requestStrategyPiece)(r.t.piece(i))
81 func (r requestStrategyTorrent) PieceLength() int64 {
82 return r.t.info.PieceLength
85 var _ request_strategy.Torrent = requestStrategyTorrent{}
87 type requestStrategyPiece Piece
89 func (r *requestStrategyPiece) Request() bool {
90 return !r.t.ignorePieceForRequests(r.index)
93 func (r *requestStrategyPiece) NumPendingChunks() int {
94 return int(r.t.pieceNumPendingChunks(r.index))
97 var _ request_strategy.Piece = (*requestStrategyPiece)(nil)