protected override Publish Read(byte[] bytes)
        {
            var remainingLengthBytesLength = 0;
            var remainingLength            = MqttProtocol.Encoding.DecodeRemainingLength(bytes, out remainingLengthBytesLength);

            var packetFlags = bytes.Byte(0).Bits(5, 4);

            if (packetFlags.Bits(6, 2) == 0x03)
            {
                throw new MqttException(Properties.Resources.Formatter_InvalidQualityOfService);
            }

            var qos        = (MqttQualityOfService)packetFlags.Bits(6, 2);
            var duplicated = packetFlags.IsSet(3);

            if (qos == MqttQualityOfService.AtMostOnce && duplicated)
            {
                throw new MqttException(Properties.Resources.PublishFormatter_InvalidDuplicatedWithQoSZero);
            }

            var retainFlag = packetFlags.IsSet(0);

            var topicStartIndex = 1 + remainingLengthBytesLength;
            var nextIndex       = 0;
            var topic           = bytes.GetString(topicStartIndex, out nextIndex);

            if (!topicEvaluator.IsValidTopicName(topic))
            {
                var error = string.Format(Properties.Resources.PublishFormatter_InvalidTopicName, topic);

                throw new MqttException(error);
            }

            var variableHeaderLength = topic.Length + 2;
            var packetId             = default(ushort?);

            if (qos != MqttQualityOfService.AtMostOnce)
            {
                packetId              = bytes.Bytes(nextIndex, 2).ToUInt16();
                variableHeaderLength += 2;
            }

            var publish = new Publish(topic, qos, retainFlag, duplicated, packetId);

            if (remainingLength > variableHeaderLength)
            {
                var payloadStartIndex = 1 + remainingLengthBytesLength + variableHeaderLength;

                publish.Payload = bytes.Bytes(payloadStartIndex);
            }

            return(publish);
        }
Exemple #2
0
        protected override Publish Read(byte[] bytes)
        {
            int remainingLength = MqttProtocol.Encoding.DecodeRemainingLength(bytes, out int remainingLengthBytesLength);

            byte packetFlags = bytes.Byte(0).Bits(5, 4);

            if (packetFlags.Bits(6, 2) == 0x03)
            {
                throw new MqttException(ClientProperties.Formatter_InvalidQualityOfService);
            }

            MqttQualityOfService qos = (MqttQualityOfService)packetFlags.Bits(6, 2);
            bool duplicated          = packetFlags.IsSet(3);

            if (qos == MqttQualityOfService.AtMostOnce && duplicated)
            {
                throw new MqttException(ClientProperties.PublishFormatter_InvalidDuplicatedWithQoSZero);
            }

            bool retainFlag = packetFlags.IsSet(0);

            int    topicStartIndex = 1 + remainingLengthBytesLength;
            string topic           = bytes.GetString(topicStartIndex, out int nextIndex);

            if (!_topicEvaluator.IsValidTopicName(topic))
            {
                throw new MqttException(ClientProperties.PublishFormatter_InvalidTopicName(topic));
            }

            int    variableHeaderLength = topic.Length + 2;
            ushort?packetId             = default;

            if (qos != MqttQualityOfService.AtMostOnce)
            {
                packetId              = bytes.Bytes(nextIndex, 2).ToUInt16();
                variableHeaderLength += 2;
            }

            Publish publish = new Publish(topic, qos, retainFlag, duplicated, packetId);

            if (remainingLength > variableHeaderLength)
            {
                int payloadStartIndex = 1 + remainingLengthBytesLength + variableHeaderLength;

                publish.Payload = bytes.Bytes(payloadStartIndex);
            }

            return(publish);
        }