]> Sergey Matveev's repositories - btrtrc.git/blob - request-strategy-impls.go
Misc tidying
[btrtrc.git] / request-strategy-impls.go
1 package torrent
2
3 import (
4         g "github.com/anacrolix/generics"
5         "github.com/anacrolix/torrent/metainfo"
6         request_strategy "github.com/anacrolix/torrent/request-strategy"
7         "github.com/anacrolix/torrent/storage"
8 )
9
10 type requestStrategyInput struct {
11         cl      *Client
12         capFunc storage.TorrentCapacity
13 }
14
15 func (r requestStrategyInput) Torrent(ih metainfo.Hash) request_strategy.Torrent {
16         return requestStrategyTorrent{g.MapMustGet(r.cl.torrents, ih)}
17 }
18
19 func (r requestStrategyInput) Capacity() (int64, bool) {
20         if r.capFunc == nil {
21                 return 0, false
22         }
23         return (*r.capFunc)()
24 }
25
26 func (r requestStrategyInput) MaxUnverifiedBytes() int64 {
27         return r.cl.config.MaxUnverifiedBytes
28 }
29
30 var _ request_strategy.Input = requestStrategyInput{}
31
32 // Returns what is necessary to run request_strategy.GetRequestablePieces for primaryTorrent.
33 func (cl *Client) getRequestStrategyInput(primaryTorrent *Torrent) (input request_strategy.Input) {
34         return requestStrategyInput{
35                 cl:      cl,
36                 capFunc: primaryTorrent.storage.Capacity,
37         }
38 }
39
40 func (t *Torrent) getRequestStrategyInput() request_strategy.Input {
41         return t.cl.getRequestStrategyInput(t)
42 }
43
44 type requestStrategyTorrent struct {
45         t *Torrent
46 }
47
48 func (r requestStrategyTorrent) Piece(i int) request_strategy.Piece {
49         return (*requestStrategyPiece)(r.t.piece(i))
50 }
51
52 func (r requestStrategyTorrent) PieceLength() int64 {
53         return r.t.info.PieceLength
54 }
55
56 var _ request_strategy.Torrent = requestStrategyTorrent{}
57
58 type requestStrategyPiece Piece
59
60 func (r *requestStrategyPiece) Request() bool {
61         return !r.t.ignorePieceForRequests(r.index)
62 }
63
64 func (r *requestStrategyPiece) NumPendingChunks() int {
65         return int(r.t.pieceNumPendingChunks(r.index))
66 }
67
68 var _ request_strategy.Piece = (*requestStrategyPiece)(nil)