]> Sergey Matveev's repositories - btrtrc.git/blob - webseed-peer.go
Tidy up webseed peer naming and unused types
[btrtrc.git] / webseed-peer.go
1 package torrent
2
3 import (
4         "fmt"
5
6         "github.com/anacrolix/torrent/common"
7         "github.com/anacrolix/torrent/metainfo"
8         pp "github.com/anacrolix/torrent/peer_protocol"
9         "github.com/anacrolix/torrent/segments"
10         "github.com/anacrolix/torrent/webseed"
11 )
12
13 type webseedPeer struct {
14         client   webseed.Client
15         requests map[request]webseed.Request
16         peer     peer
17 }
18
19 var _ peerImpl = (*webseedPeer)(nil)
20
21 func (ws *webseedPeer) String() string {
22         return fmt.Sprintf("webseed peer for %q", ws.client.Url)
23 }
24
25 func (ws *webseedPeer) onGotInfo(info *metainfo.Info) {
26         ws.client.FileIndex = segments.NewIndex(common.LengthIterFromUpvertedFiles(info.UpvertedFiles()))
27         ws.client.Info = info
28 }
29
30 func (ws *webseedPeer) _postCancel(r request) {
31         ws.cancel(r)
32 }
33
34 func (ws *webseedPeer) writeInterested(interested bool) bool {
35         return true
36 }
37
38 func (ws *webseedPeer) cancel(r request) bool {
39         ws.requests[r].Cancel()
40         return true
41 }
42
43 func (ws *webseedPeer) intoSpec(r request) webseed.RequestSpec {
44         return webseed.RequestSpec{ws.peer.t.requestOffset(r), int64(r.Length)}
45 }
46
47 func (ws *webseedPeer) request(r request) bool {
48         webseedRequest := ws.client.NewRequest(ws.intoSpec(r))
49         ws.requests[r] = webseedRequest
50         go ws.requestResultHandler(r, webseedRequest)
51         return true
52 }
53
54 func (ws *webseedPeer) connectionFlags() string {
55         return "WS"
56 }
57
58 // TODO: This is called when banning peers. Perhaps we want to be able to ban webseeds too.
59 func (ws *webseedPeer) drop() {}
60
61 func (ws *webseedPeer) updateRequests() {
62         ws.peer.doRequestState()
63 }
64
65 func (ws *webseedPeer) _close() {}
66
67 func (ws *webseedPeer) requestResultHandler(r request, webseedRequest webseed.Request) {
68         result := <-webseedRequest.Result
69         ws.peer.t.cl.lock()
70         defer ws.peer.t.cl.unlock()
71         if result.Err != nil {
72                 ws.peer.logger.Printf("request %v rejected: %v", r, result.Err)
73                 ws.peer.remoteRejectedRequest(r)
74         } else {
75                 err := ws.peer.receiveChunk(&pp.Message{
76                         Type:  pp.Piece,
77                         Index: r.Index,
78                         Begin: r.Begin,
79                         Piece: result.Bytes,
80                 })
81                 if err != nil {
82                         panic(err)
83                 }
84         }
85 }