message.go 1.93 KB
Newer Older
1
package dht_pb
2

Jeromy's avatar
Jeromy committed
3
import (
4 5
	"errors"

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"
Jeromy's avatar
Jeromy committed
8 9 10
	peer "github.com/jbenet/go-ipfs/peer"
)

11
func NewMessage(typ Message_MessageType, key string, level int) *Message {
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
12 13 14 15 16 17 18 19
	m := &Message{
		Type: &typ,
		Key:  &key,
	}
	m.SetClusterLevel(level)
	return m
}

20
func peerToPBPeer(p peer.Peer) *Message_Peer {
21
	pbp := new(Message_Peer)
22 23
	addrs := p.Addresses()
	if len(addrs) == 0 || addrs[0] == nil {
Jeromy's avatar
Jeromy committed
24 25
		pbp.Addr = proto.String("")
	} else {
26
		addr := addrs[0].String()
Jeromy's avatar
Jeromy committed
27
		pbp.Addr = &addr
Jeromy's avatar
Jeromy committed
28
	}
29
	pid := string(p.ID())
Jeromy's avatar
Jeromy committed
30 31
	pbp.Id = &pid
	return pbp
32 33
}

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
34 35
// PeersToPBPeers converts a slice of Peers into a slice of *Message_Peers,
// ready to go out on the wire.
36
func PeersToPBPeers(peers []peer.Peer) []*Message_Peer {
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
37
	pbpeers := make([]*Message_Peer, len(peers))
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
38 39 40 41 42 43
	for i, p := range peers {
		pbpeers[i] = peerToPBPeer(p)
	}
	return pbpeers
}

44 45 46 47 48 49 50 51
// 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)
}

52 53 54
// 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)
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
55
func (m *Message) GetClusterLevel() int {
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
56 57
	level := m.GetClusterLevelRaw() - 1
	if level < 0 {
58
		return 0
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
59
	}
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
60
	return int(level)
61
}
62

63 64 65
// 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)
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
66 67 68
func (m *Message) SetClusterLevel(level int) {
	lvl := int32(level)
	m.ClusterLevelRaw = &lvl
69
}
70 71 72 73 74 75 76 77

func (m *Message) Loggable() map[string]interface{} {
	return map[string]interface{}{
		"message": map[string]string{
			"type": m.Type.String(),
		},
	}
}