func (self *Handler) Publish(p *codec.PublishMessage) { //log.Info("Received Publish Message: %s: %+v", p.PacketIdentifier, p) conn := self.Connection // TODO: check permission. // TODO: この部分はengine側にあるべき機能なので治す(というか下のconnectionがやる所?) if p.QosLevel == 1 { ack := codec.NewPubackMessage() ack.PacketIdentifier = p.PacketIdentifier conn.WriteMessageQueue(ack) log.Debug("Send puback message to sender. [%s: %d]", conn.GetId(), ack.PacketIdentifier) } else if p.QosLevel == 2 { ack := codec.NewPubrecMessage() ack.PacketIdentifier = p.PacketIdentifier conn.WriteMessageQueue(ack) log.Debug("Send pubrec message to sender. [%s: %d]", conn.GetId(), ack.PacketIdentifier) } // TODO: QoSによっては適切なMessageIDを追加する // Server / ClientはそれぞれMessageTableが違う if p.QosLevel > 0 { // TODO: と、いうことはメッセージの deep コピーが簡単にできるようにしないとだめ // 色々考えると面倒だけど、ひとまずはフルコピーでやっとこう // id := conn.GetOutGoingTable().NewId() // p.PacketIdentifier = id conn.GetOutGoingTable().Register(p.PacketIdentifier, p, conn) p.Opaque = conn } // NOTE: We don't block here. currently use goroutine but should pass message to background worker. go self.Engine.SendPublishMessage(p, conn.GetId(), conn.IsBridge()) }