torrent/peer_protocol/metadata.go

43 lines
1.1 KiB
Go

package peer_protocol
import (
"github.com/anacrolix/torrent/bencode"
)
const (
// http://bittorrent.org/beps/bep_0009.html. Note that there's an
// LT_metadata, but I've never implemented it.
ExtensionNameMetadata = "ut_metadata"
)
type (
ExtendedMetadataRequestMsg struct {
Piece int `bencode:"piece"`
TotalSize int `bencode:"total_size"`
Type ExtendedMetadataRequestMsgType `bencode:"msg_type"`
}
ExtendedMetadataRequestMsgType int
)
func MetadataExtensionRequestMsg(peerMetadataExtensionId ExtensionNumber, piece int) Message {
return Message{
Type: Extended,
ExtendedID: peerMetadataExtensionId,
ExtendedPayload: bencode.MustMarshal(ExtendedMetadataRequestMsg{
Piece: piece,
Type: RequestMetadataExtensionMsgType,
}),
}
}
// Returns the expected piece size for this request message. This is needed to determine the offset
// into an extension message payload that the request metadata piece data starts.
func (me ExtendedMetadataRequestMsg) PieceSize() int {
ret := me.TotalSize - me.Piece*(1<<14)
if ret > 1<<14 {
ret = 1 << 14
}
return ret
}