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 torrents: cl.torrents,
63 capFunc: primaryTorrent.storage.Capacity,
68 func (t *Torrent) getRequestStrategyInput() request_strategy.Input {
69 return t.cl.getRequestStrategyInput(t)
72 type requestStrategyTorrent struct {
76 func (r requestStrategyTorrent) Piece(i int) request_strategy.Piece {
77 return (*requestStrategyPiece)(r.t.piece(i))
80 func (r requestStrategyTorrent) PieceLength() int64 {
81 return r.t.info.PieceLength
84 var _ request_strategy.Torrent = requestStrategyTorrent{}
86 type requestStrategyPiece Piece
88 func (r *requestStrategyPiece) Request() bool {
89 return !r.t.ignorePieceForRequests(r.index)
92 func (r *requestStrategyPiece) NumPendingChunks() int {
93 return int(r.t.pieceNumPendingChunks(r.index))
96 var _ request_strategy.Piece = (*requestStrategyPiece)(nil)