12 Index, Begin, Length Integer
15 ExtendedID ExtensionNumber
16 ExtendedPayload []byte
20 func MakeCancelMessage(piece, offset, length Integer) Message {
29 func (msg Message) RequestSpec() RequestSpec {
30 return RequestSpec{msg.Index, msg.Begin, msg.Length}
33 func (msg Message) MustMarshalBinary() []byte {
34 b, err := msg.MarshalBinary()
41 func (msg Message) MarshalBinary() (data []byte, err error) {
42 buf := &bytes.Buffer{}
44 err = buf.WriteByte(byte(msg.Type))
49 case Choke, Unchoke, Interested, NotInterested, HaveAll, HaveNone:
51 err = binary.Write(buf, binary.BigEndian, msg.Index)
52 case Request, Cancel, Reject:
53 for _, i := range []Integer{msg.Index, msg.Begin, msg.Length} {
54 err = binary.Write(buf, binary.BigEndian, i)
60 _, err = buf.Write(marshalBitfield(msg.Bitfield))
62 for _, i := range []Integer{msg.Index, msg.Begin} {
63 err = binary.Write(buf, binary.BigEndian, i)
68 n, err := buf.Write(msg.Piece)
72 if n != len(msg.Piece) {
76 err = buf.WriteByte(byte(msg.ExtendedID))
80 _, err = buf.Write(msg.ExtendedPayload)
82 err = binary.Write(buf, binary.BigEndian, msg.Port)
84 err = fmt.Errorf("unknown message type: %v", msg.Type)
87 data = make([]byte, 4+buf.Len())
88 binary.BigEndian.PutUint32(data, uint32(buf.Len()))
89 if buf.Len() != copy(data[4:], buf.Bytes()) {
95 func marshalBitfield(bf []bool) (b []byte) {
96 b = make([]byte, (len(bf)+7)/8)
97 for i, have := range bf {
102 c |= 1 << uint(7-i%8)