1 Star 0 Fork 2

何吕/volantmq

forked from JUMEI_ARCH/volantmq 
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
disconnect.go 2.73 KB
一键复制 编辑 原始数据 按行查看 历史
Artur Troian 提交于 2017-09-22 00:15 +08:00 . Optimize memory usage
// Copyright (c) 2014 The VolantMQ Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package packet
// Disconnect The DISCONNECT Packet is the final Control Packet sent from the Client to the Server.
// It indicates that the Client is disconnecting cleanly.
type Disconnect struct {
header
reasonCode ReasonCode
}
var _ Provider = (*Disconnect)(nil)
func newDisconnect() *Disconnect {
return &Disconnect{}
}
// ReasonCode get disconnect reason
func (msg *Disconnect) ReasonCode() ReasonCode {
return msg.reasonCode
}
// SetReasonCode set disconnect reason
func (msg *Disconnect) SetReasonCode(c ReasonCode) {
msg.reasonCode = c
}
// decode message
func (msg *Disconnect) decodeMessage(from []byte) (int, error) {
offset := 0
if msg.version == ProtocolV50 {
// [MQTT-3.14.2.1]
if msg.remLen < 1 {
msg.reasonCode = CodeSuccess
return offset, nil
}
msg.reasonCode = ReasonCode(from[offset])
if !msg.reasonCode.IsValidForType(msg.mType) {
return offset, CodeProtocolError
}
offset++
// V5.0 [MQTT-3.14.2.2.1]
if len(from[offset:]) < 1 && msg.remLen < 2 {
return offset, CodeMalformedPacket
}
if msg.remLen < 2 {
offset++
} else {
n, err := msg.properties.decode(msg.Type(), from[offset:])
offset += n
if err != nil {
return offset, err
}
}
} else {
if msg.remLen > 0 {
return offset, CodeRefusedServerUnavailable
}
}
return offset, nil
}
func (msg *Disconnect) encodeMessage(to []byte) (int, error) {
offset := 0
var err error
if msg.version == ProtocolV50 {
pLen := msg.properties.FullLen()
if pLen > 1 || msg.reasonCode != CodeSuccess {
to[offset] = byte(msg.reasonCode)
offset++
if pLen > 1 {
var n int
n, err = msg.properties.encode(to[offset:])
offset += n
}
}
}
return offset, err
}
// Len of message
func (msg *Disconnect) size() int {
total := 0
if msg.version == ProtocolV50 {
pLen := msg.properties.FullLen()
// If properties exist (which indicated when pLen > 1) include in body size reason code and properties
// otherwise include only reason code if it differs from CodeSuccess
if pLen > 1 || msg.reasonCode != CodeSuccess {
total++
if pLen > 1 {
total += int(pLen)
}
}
}
return total
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/kaifazhe/volantmq.git
git@gitee.com:kaifazhe/volantmq.git
kaifazhe
volantmq
volantmq
v0.0.4

搜索帮助