"github.com/anacrolix/missinggo/v2/bitmap"
"github.com/anacrolix/missinggo/v2/prioritybitmap"
"github.com/anacrolix/multiless"
+ "github.com/anacrolix/torrent/metainfo"
"github.com/pkg/errors"
"github.com/anacrolix/torrent/bencode"
ConnectionFlags() string
Close()
PostCancel(request)
+ onGotInfo(*metainfo.Info)
Drop()
}
return fmt.Sprintf("%d/%d", have, cn.bestPeerNumPieces())
}
-// Correct the PeerPieces slice length. Return false if the existing slice is
-// invalid, such as by receiving badly sized BITFIELD, or invalid HAVE
-// messages.
-func (cn *PeerConn) setNumPieces(num pieceIndex) error {
+func (cn *PeerConn) onGotInfo(info *metainfo.Info) {
+ cn.setNumPieces(info.NumPieces())
+}
+
+// Correct the PeerPieces slice length. Return false if the existing slice is invalid, such as by
+// receiving badly sized BITFIELD, or invalid HAVE messages.
+func (cn *PeerConn) setNumPieces(num pieceIndex) {
cn._peerPieces.RemoveRange(bitmap.BitIndex(num), bitmap.ToEnd)
cn.peerPiecesChanged()
- return nil
}
func eventAgeString(t time.Time) string {
return nil
}
+// This seems to be all the follow-up tasks after info is set, that can't fail.
func (t *Torrent) onSetInfo() {
- for conn := range t.conns {
- if err := conn.setNumPieces(t.numPieces()); err != nil {
- t.logger.Printf("closing connection: %s", err)
- conn.close()
- }
- }
+ t.iterPeers(func(p *peer) {
+ p.onGotInfo(t.info)
+ })
for i := range t.pieces {
t.updatePieceCompletion(pieceIndex(i))
p := &t.pieces[i]
client: webseed.Client{
HttpClient: http.DefaultClient,
Url: url,
- FileIndex: t.fileIndex,
- Info: t.info,
},
requests: make(map[request]webseed.Request, maxRequests),
}
ws.peer.PeerImpl = &ws
+ if t.haveInfo() {
+ ws.onGotInfo(t.info)
+ }
t.webSeeds[url] = &ws.peer
}
import (
"net/http"
+ "github.com/anacrolix/torrent/common"
+ "github.com/anacrolix/torrent/metainfo"
pp "github.com/anacrolix/torrent/peer_protocol"
"github.com/anacrolix/torrent/segments"
"github.com/anacrolix/torrent/webseed"
var _ PeerImpl = (*webSeed)(nil)
+func (ws *webSeed) onGotInfo(info *metainfo.Info) {
+ ws.client.FileIndex = segments.NewIndex(common.LengthIterFromUpvertedFiles(info.UpvertedFiles()))
+ ws.client.Info = info
+}
+
func (ws *webSeed) PostCancel(r request) {
ws.Cancel(r)
}