OSDN Git Service

Merge pull request #1046 from Bytom/dev
[bytom/bytom.git] / p2p / pex / pex_message.go
1 package pex
2
3 import (
4         "bytes"
5         "fmt"
6
7         wire "github.com/tendermint/go-wire"
8
9         "github.com/bytom/p2p"
10 )
11
12 const (
13         msgTypeRequest = byte(0x01)
14         msgTypeAddrs   = byte(0x02)
15 )
16
17 // PexMessage is a primary type for PEX messages. Underneath, it could contain
18 // either pexRequestMessage, or pexAddrsMessage messages.
19 type PexMessage interface{}
20
21 var _ = wire.RegisterInterface(
22         struct{ PexMessage }{},
23         wire.ConcreteType{&pexRequestMessage{}, msgTypeRequest},
24         wire.ConcreteType{&pexAddrsMessage{}, msgTypeAddrs},
25 )
26
27 // DecodeMessage implements interface registered above.
28 func DecodeMessage(bz []byte) (msgType byte, msg PexMessage, err error) {
29         msgType = bz[0]
30         n := new(int)
31         r := bytes.NewReader(bz)
32         msg = wire.ReadBinary(struct{ PexMessage }{}, r, maxPexMessageSize, n, &err).(struct{ PexMessage }).PexMessage
33         return
34 }
35
36 type pexRequestMessage struct{}
37
38 func (m *pexRequestMessage) String() string { return "[pexRequest]" }
39
40 type pexAddrsMessage struct {
41         Addrs []*p2p.NetAddress
42 }
43
44 func (m *pexAddrsMessage) String() string { return fmt.Sprintf("[pexAddrs %v]", m.Addrs) }