go-libp2p-kad-dht/pb/message.go

68 lines
1.7 KiB
Go
Raw Normal View History

package dht_pb
2014-08-09 22:28:46 -07:00
import (
"errors"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/goprotobuf/proto"
ma "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
2014-08-09 22:28:46 -07:00
peer "github.com/jbenet/go-ipfs/peer"
)
func NewMessage(typ Message_MessageType, key string, level int) *Message {
2014-09-16 07:17:55 -07:00
m := &Message{
Type: &typ,
Key: &key,
}
m.SetClusterLevel(level)
return m
}
func peerToPBPeer(p peer.Peer) *Message_Peer {
2014-09-16 00:52:57 -07:00
pbp := new(Message_Peer)
addrs := p.Addresses()
if len(addrs) == 0 || addrs[0] == nil {
2014-08-19 19:14:52 -07:00
pbp.Addr = proto.String("")
} else {
addr := addrs[0].String()
2014-08-19 19:14:52 -07:00
pbp.Addr = &addr
2014-08-09 22:28:46 -07:00
}
pid := string(p.ID())
2014-08-09 22:28:46 -07:00
pbp.Id = &pid
return pbp
}
func PeersToPBPeers(peers []peer.Peer) []*Message_Peer {
2014-09-16 07:17:55 -07:00
pbpeers := make([]*Message_Peer, len(peers))
2014-09-16 01:09:34 -07:00
for i, p := range peers {
pbpeers[i] = peerToPBPeer(p)
}
return pbpeers
}
// Address returns a multiaddr associated with the Message_Peer entry
func (m *Message_Peer) Address() (ma.Multiaddr, error) {
if m == nil {
return nil, errors.New("MessagePeer is nil")
}
return ma.NewMultiaddr(*m.Addr)
}
2014-09-16 00:52:57 -07:00
// GetClusterLevel gets and adjusts the cluster level on the message.
// a +/- 1 adjustment is needed to distinguish a valid first level (1) and
// default "no value" protobuf behavior (0)
2014-09-16 07:17:55 -07:00
func (m *Message) GetClusterLevel() int {
2014-09-16 01:09:34 -07:00
level := m.GetClusterLevelRaw() - 1
if level < 0 {
return 0
2014-09-16 01:09:34 -07:00
}
2014-09-16 07:17:55 -07:00
return int(level)
2014-09-16 00:52:57 -07:00
}
2014-09-16 00:52:57 -07:00
// SetClusterLevel adjusts and sets the cluster level on the message.
// a +/- 1 adjustment is needed to distinguish a valid first level (1) and
// default "no value" protobuf behavior (0)
2014-09-16 07:17:55 -07:00
func (m *Message) SetClusterLevel(level int) {
lvl := int32(level)
m.ClusterLevelRaw = &lvl
}