| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- package torrent
- import (
- g "github.com/anacrolix/generics"
- "github.com/anacrolix/torrent/metainfo"
- request_strategy "github.com/anacrolix/torrent/request-strategy"
- "github.com/anacrolix/torrent/storage"
- )
- type requestStrategyInputCommon struct {
- maxUnverifiedBytes int64
- }
- func (r requestStrategyInputCommon) MaxUnverifiedBytes() int64 {
- return r.maxUnverifiedBytes
- }
- type requestStrategyInputMultiTorrent struct {
- requestStrategyInputCommon
- torrents map[metainfo.Hash]*Torrent
- capFunc storage.TorrentCapacity
- }
- func (r requestStrategyInputMultiTorrent) Torrent(ih metainfo.Hash) request_strategy.Torrent {
- return requestStrategyTorrent{g.MapMustGet(r.torrents, ih)}
- }
- func (r requestStrategyInputMultiTorrent) Capacity() (int64, bool) {
- return (*r.capFunc)()
- }
- type requestStrategyInputSingleTorrent struct {
- requestStrategyInputCommon
- t *Torrent
- }
- func (r requestStrategyInputSingleTorrent) Torrent(_ metainfo.Hash) request_strategy.Torrent {
- return requestStrategyTorrent{r.t}
- }
- func (r requestStrategyInputSingleTorrent) Capacity() (cap int64, capped bool) {
- return 0, false
- }
- var _ request_strategy.Input = requestStrategyInputSingleTorrent{}
- func (cl *Client) getRequestStrategyInputCommon() requestStrategyInputCommon {
- return requestStrategyInputCommon{cl.config.MaxUnverifiedBytes}
- }
- // Returns what is necessary to run request_strategy.GetRequestablePieces for primaryTorrent.
- func (cl *Client) getRequestStrategyInput(primaryTorrent *Torrent) (input request_strategy.Input) {
- if !primaryTorrent.hasStorageCap() {
- return requestStrategyInputSingleTorrent{
- requestStrategyInputCommon: cl.getRequestStrategyInputCommon(),
- t: primaryTorrent,
- }
- } else {
- return requestStrategyInputMultiTorrent{
- requestStrategyInputCommon: cl.getRequestStrategyInputCommon(),
- // TODO: Check this is an appropriate key
- torrents: cl.torrentsByShortHash,
- capFunc: primaryTorrent.storage.Capacity,
- }
- }
- }
- func (t *Torrent) getRequestStrategyInput() request_strategy.Input {
- return t.cl.getRequestStrategyInput(t)
- }
- type requestStrategyTorrent struct {
- t *Torrent
- }
- func (r requestStrategyTorrent) Piece(i int) request_strategy.Piece {
- return requestStrategyPiece{r.t.piece(i)}
- }
- func (r requestStrategyTorrent) PieceLength() int64 {
- return r.t.info.PieceLength
- }
- var _ request_strategy.Torrent = requestStrategyTorrent{}
- type requestStrategyPiece struct {
- p *Piece
- }
- func (r requestStrategyPiece) CountUnverified() bool {
- return r.p.hashing || r.p.marking || r.p.queuedForHash()
- }
- func (r requestStrategyPiece) Request() bool {
- return !r.p.ignoreForRequests() && r.p.purePriority() != PiecePriorityNone
- }
- var _ request_strategy.Piece = requestStrategyPiece{}
|