1 // (c) Bernhard Tittelbach, 2013
6 zmq "github.com/vaughan0/go-zmq"
11 // ---------- ZeroMQ Code -------------
13 type ReqSocket *zmq.Socket
14 type PubSocket *zmq.Socket
16 func ZmqsInit(sub_connect_port, sub_listen_port, pub_port, keylookup_port string) (ctx *zmq.Context, sub_chans *zmq.Channels, pub_sock PubSocket, keylookup_sock ReqSocket) {
18 ctx, err = zmq.NewContext()
22 //close only on later panic, otherwise leave open:
23 defer func(){ if r:= recover(); r != nil { ctx.Close(); panic(r) } }()
25 if len(sub_port) > 0 {
26 sub_sock, err := ctx.Socket(zmq.Sub)
30 defer func() { if r:= recover(); r != nil { sub_sock.Close(); panic(r) } }()
32 if err = sub_sock.Bind(sub_listen_port); err != nil {
36 if err = sub_sock.Connect(sub_connect_port); err != nil {
40 sub_chans = sub_sock.ChannelsBuffer(10)
41 go zmqsHandleError(sub_chans)
46 if len(pub_port) > 0 {
47 pub_sock, err := ctx.Socket(zmq.Pub)
51 defer func() { if r:= recover(); r != nil { pub_sock.Close(); panic(r) } }()
53 if err = pub_sock.Bind(pub_port); err != nil {
60 if len(keylookup_port) > 0 {
61 keylookup_sock, err := ctx.Socket(zmq.Req)
65 defer func() { if r:= recover(); r != nil { keylookup_sock.Close(); panic(r) } }()
67 if err = keylookup_sock.Connect(keylookup_port); err != nil {
77 func zmqsHandleError(chans *zmq.Channels) {
78 for error := range(chans.Errors()) {
84 func (s ReqSocket) ZmqsRequestAnswer(request [][]byte) (answer []][]byte) {
85 sock := s.(*zmq.Socket)
86 if err = sock.Send(request); err != nil {
89 parts, err := sock.Recv()
96 func (s PubSocket) ZmqsPublish(msg [][]byte) {
97 sock := s.(*zmq.Socket)
98 if err = sock.Send(msg); err != nil {
103 func (s ReqSocket) LookupCardIdNick(hexbytes []byte) (nick string, error) {
104 answ := s.ZmqsRequestAnswer([][]byte{hexbytes})
106 return "", errors.New("Empty reply received")
108 if answ[0] == []byte("ERROR") {
109 return "", errors.New(string(bytes.Join(answ[1:])))
111 if answ[0] != []byte("RESULT") || len(answ) != 3{
112 return "", errors.New("Unknown reply received")
114 if answ[1] != hexbytes {
115 return "", errors.New("Wrong reply received")
117 return string(answ[2]), nil