-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpubrec.go
106 lines (94 loc) · 3.16 KB
/
pubrec.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package mqttpackets
import (
"bytes"
"io"
"net"
)
// Pubrec is the Variable Header definition for a Pubrec control packet
type Pubrec struct {
Properties *Properties
PacketID uint16
ReasonCode byte
}
// PubrecSuccess, etc are the list of valid Pubrec reason codes
const (
PubrecSuccess = 0x00
PubrecNoMatchingSubscribers = 0x10
PubrecUnspecifiedError = 0x80
PubrecImplementationSpecificError = 0x83
PubrecNotAuthorized = 0x87
PubrecTopicNameInvalid = 0x90
PubrecPacketIdentifierInUse = 0x91
PubrecQuotaExceeded = 0x97
PubrecPayloadFormatInvalid = 0x99
)
//Unpack is the implementation of the interface required function for a packet
func (p *Pubrec) Unpack(r *bytes.Buffer) error {
var err error
success := r.Len() == 2
noProps := r.Len() == 3
p.PacketID, err = readUint16(r)
if err != nil {
return err
}
if !success && p.Properties != nil {
p.ReasonCode, err = r.ReadByte()
if err != nil {
return err
}
if !noProps {
err = p.Properties.Unpack(r, PUBACK)
if err != nil {
return err
}
}
}
return nil
}
// Buffers is the implementation of the interface required function for a packet
func (p *Pubrec) Buffers() net.Buffers {
var b bytes.Buffer
writeUint16(p.PacketID, &b)
if p.Properties == nil {
return net.Buffers{b.Bytes()}
}
b.WriteByte(p.ReasonCode)
n := net.Buffers{b.Bytes()}
idvp := p.Properties.Pack(PUBREC)
propLen := encodeVBI(len(idvp))
if len(idvp) > 0 {
n = append(n, propLen)
n = append(n, idvp)
}
return n
}
// WriteTo is the implementation of the interface required function for a packet
func (p *Pubrec) WriteTo(w io.Writer) (int64, error) {
cp := &ControlPacket{FixedHeader: FixedHeader{Type: PUBREC}}
cp.Content = p
return cp.WriteTo(w)
}
// Reason returns a string representation of the meaning of the ReasonCode
func (p *Pubrec) Reason() string {
switch p.ReasonCode {
case 0:
return "Success - The message is accepted. Publication of the QoS 2 message proceeds."
case 16:
return "No matching subscribers. - The message is accepted but there are no subscribers. This is sent only by the Server. If the Server knows that case there are no matching subscribers, it MAY use this Reason Code instead of 0x00 (Success)"
case 128:
return "Unspecified error - The receiver does not accept the publish but either does not want to reveal the reason, or it does not match one of the other values."
case 131:
return "Implementation specific error - The PUBLISH is valid but the receiver is not willing to accept it."
case 135:
return "Not authorized - The PUBLISH is not authorized."
case 144:
return "Topic Name invalid - The Topic Name is not malformed, but is not accepted by this Client or Server."
case 145:
return "Packet Identifier in use - The Packet Identifier is already in use. This might indicate a mismatch in the Session State between the Client and Server."
case 151:
return "Quota exceeded - An implementation or administrative imposed limit has been exceeded."
case 153:
return "Payload format invalid - The payload format does not match the one specified in the Payload Format Indicator."
}
return ""
}