forked from anacrolix/torrent
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrequest-strategy-impls.go
77 lines (60 loc) · 1.74 KB
/
request-strategy-impls.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package torrent
import (
"github.com/anacrolix/torrent/metainfo"
request_strategy "github.com/anacrolix/torrent/request-strategy"
"github.com/anacrolix/torrent/storage"
)
type requestStrategyInput struct {
cl *Client
capFunc storage.TorrentCapacity
}
func (r requestStrategyInput) Torrent(ih metainfo.Hash) request_strategy.Torrent {
return requestStrategyTorrent{r.cl.torrents[ih]}
}
func (r requestStrategyInput) Capacity() (int64, bool) {
if r.capFunc == nil {
return 0, false
}
return (*r.capFunc)()
}
func (r requestStrategyInput) MaxUnverifiedBytes() int64 {
return r.cl.config.MaxUnverifiedBytes
}
var _ request_strategy.Input = requestStrategyInput{}
// Returns what is necessary to run request_strategy.GetRequestablePieces for primaryTorrent.
func (cl *Client) getRequestStrategyInput(primaryTorrent *Torrent) (input request_strategy.Input) {
return requestStrategyInput{
cl: cl,
capFunc: primaryTorrent.storage.Capacity,
}
}
func (t *Torrent) getRequestStrategyInput() request_strategy.Input {
return t.cl.getRequestStrategyInput(t)
}
type requestStrategyTorrent struct {
t *Torrent
}
func (r requestStrategyTorrent) IgnorePiece(i int) bool {
if r.t.ignorePieceForRequests(i) {
return true
}
if r.t.pieceNumPendingChunks(i) == 0 {
return true
}
return false
}
func (r requestStrategyTorrent) PieceLength() int64 {
return r.t.info.PieceLength
}
var _ request_strategy.Torrent = requestStrategyTorrent{}
type requestStrategyPiece struct {
t *Torrent
i pieceIndex
}
func (r requestStrategyPiece) Request() bool {
return !r.t.ignorePieceForRequests(r.i)
}
func (r requestStrategyPiece) NumPendingChunks() int {
return int(r.t.pieceNumPendingChunks(r.i))
}
var _ request_strategy.Piece = requestStrategyPiece{}