]> Sergey Matveev's repositories - btrtrc.git/blob - util/types.go
cbf2872b7c48deaf14b4dc263f28ddd2ef650458
[btrtrc.git] / util / types.go
1 package util
2
3 import (
4         "bytes"
5         "encoding"
6         "encoding/binary"
7         "fmt"
8         "io"
9
10         "github.com/anacrolix/libtorgo/bencode"
11 )
12
13 type CompactPeers []CompactPeer
14
15 func (me *CompactPeers) UnmarshalBencode(bb []byte) (err error) {
16         var b []byte
17         err = bencode.Unmarshal(bb, &b)
18         if err != nil {
19                 return
20         }
21         err = me.UnmarshalBinary(b)
22         return
23 }
24
25 func (me *CompactPeers) UnmarshalBinary(b []byte) (err error) {
26         for i := 0; i < len(b); i += 6 {
27                 var p CompactPeer
28                 err = p.UnmarshalBinary([]byte(b[i : i+6]))
29                 if err != nil {
30                         return
31                 }
32                 *me = append(*me, p)
33         }
34         return
35 }
36
37 func (me CompactPeers) WriteBinary(w io.Writer) error {
38         return binary.Write(w, binary.BigEndian, me)
39 }
40
41 type CompactPeer struct {
42         IP   [4]byte
43         Port uint16
44 }
45
46 var _ encoding.BinaryUnmarshaler = &CompactPeer{}
47
48 func (cp *CompactPeer) UnmarshalBinary(b []byte) (err error) {
49         r := bytes.NewReader(b)
50         err = binary.Read(r, binary.BigEndian, cp)
51         if err != nil {
52                 return
53         }
54         if r.Len() != 0 {
55                 err = fmt.Errorf("%d bytes unused", r.Len())
56         }
57         return
58 }