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  }