github.com/zignig/go-ipfs@v0.0.0-20141111235910-c9e5fdf55a52/routing/dht/pb/message.go (about) 1 package dht_pb 2 3 import ( 4 "errors" 5 6 "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto" 7 ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr" 8 peer "github.com/jbenet/go-ipfs/peer" 9 ) 10 11 func NewMessage(typ Message_MessageType, key string, level int) *Message { 12 m := &Message{ 13 Type: &typ, 14 Key: &key, 15 } 16 m.SetClusterLevel(level) 17 return m 18 } 19 20 func peerToPBPeer(p peer.Peer) *Message_Peer { 21 pbp := new(Message_Peer) 22 addrs := p.Addresses() 23 if len(addrs) == 0 || addrs[0] == nil { 24 pbp.Addr = proto.String("") 25 } else { 26 addr := addrs[0].String() 27 pbp.Addr = &addr 28 } 29 pid := string(p.ID()) 30 pbp.Id = &pid 31 return pbp 32 } 33 34 func PeersToPBPeers(peers []peer.Peer) []*Message_Peer { 35 pbpeers := make([]*Message_Peer, len(peers)) 36 for i, p := range peers { 37 pbpeers[i] = peerToPBPeer(p) 38 } 39 return pbpeers 40 } 41 42 // Address returns a multiaddr associated with the Message_Peer entry 43 func (m *Message_Peer) Address() (ma.Multiaddr, error) { 44 if m == nil { 45 return nil, errors.New("MessagePeer is nil") 46 } 47 return ma.NewMultiaddr(*m.Addr) 48 } 49 50 // GetClusterLevel gets and adjusts the cluster level on the message. 51 // a +/- 1 adjustment is needed to distinguish a valid first level (1) and 52 // default "no value" protobuf behavior (0) 53 func (m *Message) GetClusterLevel() int { 54 level := m.GetClusterLevelRaw() - 1 55 if level < 0 { 56 return 0 57 } 58 return int(level) 59 } 60 61 // SetClusterLevel adjusts and sets the cluster level on the message. 62 // a +/- 1 adjustment is needed to distinguish a valid first level (1) and 63 // default "no value" protobuf behavior (0) 64 func (m *Message) SetClusterLevel(level int) { 65 lvl := int32(level) 66 m.ClusterLevelRaw = &lvl 67 }