]> Sergey Matveev's repositories - btrtrc.git/blob - peer_protocol/metadata.go
Drop support for go 1.20
[btrtrc.git] / peer_protocol / metadata.go
1 package peer_protocol
2
3 import (
4         "github.com/anacrolix/torrent/bencode"
5 )
6
7 const (
8         // http://bittorrent.org/beps/bep_0009.html. Note that there's an
9         // LT_metadata, but I've never implemented it.
10         ExtensionNameMetadata = "ut_metadata"
11 )
12
13 type (
14         ExtendedMetadataRequestMsg struct {
15                 Piece     int                            `bencode:"piece"`
16                 TotalSize int                            `bencode:"total_size"`
17                 Type      ExtendedMetadataRequestMsgType `bencode:"msg_type"`
18         }
19
20         ExtendedMetadataRequestMsgType int
21 )
22
23 func MetadataExtensionRequestMsg(peerMetadataExtensionId ExtensionNumber, piece int) Message {
24         return Message{
25                 Type:       Extended,
26                 ExtendedID: peerMetadataExtensionId,
27                 ExtendedPayload: bencode.MustMarshal(ExtendedMetadataRequestMsg{
28                         Piece: piece,
29                         Type:  RequestMetadataExtensionMsgType,
30                 }),
31         }
32 }
33
34 // Returns the expected piece size for this request message. This is needed to determine the offset
35 // into an extension message payload that the request metadata piece data starts.
36 func (me ExtendedMetadataRequestMsg) PieceSize() int {
37         ret := me.TotalSize - me.Piece*(1<<14)
38         if ret > 1<<14 {
39                 ret = 1 << 14
40         }
41         return ret
42 }