// For SUBSCRIBE message, we should add subscriber, then send back SUBACK func (this *service) processSubscribe(msg *message.SubscribeMessage) error { resp := message.NewSubackMessage() resp.SetPacketId(msg.PacketId()) // Subscribe to the different topics var retcodes []byte topics := msg.Topics() qos := msg.Qos() this.rmsgs = this.rmsgs[0:0] for i, t := range topics { rqos, err := this.topicsMgr.Subscribe(t, qos[i], &this.onpub) if err != nil { return err } this.sess.AddTopic(string(t), qos[i]) retcodes = append(retcodes, rqos) // yeah I am not checking errors here. If there's an error we don't want the // subscription to stop, just let it go. this.topicsMgr.Retained(t, &this.rmsgs) glog.Debugf("(%s) topic = %s, retained count = %d", this.cid(), string(t), len(this.rmsgs)) } if err := resp.AddReturnCodes(retcodes); err != nil { return err } if _, err := this.writeMessage(resp); err != nil { return err } for _, rm := range this.rmsgs { if err := this.publish(rm, nil); err != nil { glog.Errorf("service/processSubscribe: Error publishing retained message: %v", err) return err } } return nil }