|
- package packet
-
- import (
- "bytes"
- "io"
- )
-
- // base holds the fields and methods which are common
- // among the MQTT Control Packets.
- type base struct {
- // fixedHeader represents the fixed header of the Packet.
- fixedHeader FixedHeader
- // VariableHeader represents the variable header of the Packet.
- variableHeader []byte
- // Payload represents the payload of the Packet.
- payload []byte
- }
-
- // WriteTo writes the Packet data to the writer.
- func (b *base) WriteTo(w io.Writer) (int64, error) {
- // Create a byte buffer.
- var bf bytes.Buffer
-
- // Write the Packet data to the buffer.
- bf.Write(b.fixedHeader)
- bf.Write(b.variableHeader)
- bf.Write(b.payload)
-
- // Write the buffered data to the writer.
- n, err := w.Write(bf.Bytes())
-
- // Return the result.
- return int64(n), err
- }
-
- // Type extracts the MQTT Control Packet type from
- // the fixed header and returns it.
- func (b *base) Type() (byte, error) {
- return b.fixedHeader.ptype()
- }
-
- // appendRemainingLength appends the Remaining Length
- // to the fixed header.
- func (b *base) appendRemainingLength() {
- // Calculate and encode the Remaining Length.
- rl := encodeLength(uint32(len(b.variableHeader) + len(b.payload)))
-
- // Append the Remaining Length to the fixed header.
- b.fixedHeader = appendRemainingLength(b.fixedHeader, rl)
- }
-
- // appendRemainingLength appends the Remaining Length
- // to the slice and returns it.
- func appendRemainingLength(b []byte, rl uint32) []byte {
- // Append the Remaining Length to the slice.
- switch {
- case rl&0xFF000000 > 0:
- b = append(b, byte((rl&0xFF000000)>>24))
- fallthrough
- case rl&0x00FF0000 > 0:
- b = append(b, byte((rl&0x00FF0000)>>16))
- fallthrough
- case rl&0x0000FF00 > 0:
- b = append(b, byte((rl&0x0000FF00)>>8))
- fallthrough
- default:
- b = append(b, byte(rl&0x000000FF))
- }
-
- // Return the slice.
- return b
- }
|