Refactor code.

This commit is contained in:
Christian
2021-10-24 21:19:40 +02:00
parent 5af54963a0
commit 43e4038212
39 changed files with 500 additions and 463 deletions
@@ -17,7 +17,6 @@ namespace MQTTnet.Formatter
Password = clientOptions.Credentials?.Password,
CleanSession = clientOptions.CleanSession,
KeepAlivePeriod = (ushort) clientOptions.KeepAlivePeriod.TotalSeconds,
WillMessage = clientOptions.WillMessage,
Properties =
{
AuthenticationMethod = clientOptions.AuthenticationMethod,
@@ -32,6 +31,26 @@ namespace MQTTnet.Formatter
}
};
if (clientOptions.WillMessage != null)
{
connectPacket.WillFlag = true;
connectPacket.WillTopic = clientOptions.WillMessage.Topic;
connectPacket.WillQoS = clientOptions.WillMessage.QualityOfServiceLevel;
connectPacket.WillMessage = clientOptions.WillMessage.Payload;
connectPacket.WillRetain = clientOptions.WillMessage.Retain;
connectPacket.WillProperties.ContentType = clientOptions.WillMessage.ContentType;
connectPacket.WillProperties.CorrelationData = clientOptions.WillMessage.CorrelationData;
connectPacket.WillProperties.ResponseTopic = clientOptions.WillMessage.ResponseTopic;
connectPacket.WillProperties.MessageExpiryInterval = clientOptions.WillMessage.MessageExpiryInterval;
connectPacket.WillProperties.PayloadFormatIndicator = clientOptions.WillMessage.PayloadFormatIndicator;
//connectPacket.WillProperties.WillDelayInterval = clientOptions.WillMessage.;
if (clientOptions.WillMessage.UserProperties != null)
{
connectPacket.WillProperties.UserProperties.AddRange(clientOptions.WillMessage.UserProperties);
}
}
if (clientOptions.UserProperties != null)
{
connectPacket.Properties.UserProperties.AddRange(clientOptions.UserProperties);
@@ -0,0 +1,29 @@
namespace MQTTnet.Formatter
{
public sealed class MqttPacketFactories
{
public MqttConnectPacketFactory Connect { get; } = new MqttConnectPacketFactory();
public MqttConnAckPacketFactory ConnAck { get; } = new MqttConnAckPacketFactory();
public MqttDisconnectPacketFactory Disconnect { get; } = new MqttDisconnectPacketFactory();
public MqttSubscribePacketFactory Subscribe { get; } = new MqttSubscribePacketFactory();
public MqttSubAckPacketFactory SubAck { get; } = new MqttSubAckPacketFactory();
public MqttUnsubscribePacketFactory Unsubscribe { get; } = new MqttUnsubscribePacketFactory();
public MqttUnsubAckPacketFactory UnsubAck { get; } = new MqttUnsubAckPacketFactory();
public MqttPublishPacketFactory Publish { get; } = new MqttPublishPacketFactory();
public MqttPubAckPacketFactory PubAck { get; } = new MqttPubAckPacketFactory();
public MqttPubRelPacketFactory PubRel { get; } = new MqttPubRelPacketFactory();
public MqttPubRecPacketFactory PubRec { get; } = new MqttPubRecPacketFactory();
public MqttPubCompPacketFactory PubComp { get; } = new MqttPubCompPacketFactory();
}
}
@@ -1,4 +1,5 @@
using System;
using MQTTnet.Exceptions;
using MQTTnet.Packets;
namespace MQTTnet.Formatter
@@ -41,5 +42,36 @@ namespace MQTTnet.Formatter
return packet;
}
public MqttPublishPacket Create(MqttConnectPacket connectPacket)
{
if (connectPacket == null) throw new ArgumentNullException(nameof(connectPacket));
if (!connectPacket.WillFlag)
{
throw new MqttProtocolViolationException("The CONNECT packet contains no will message (WillFlag).");
}
var packet = new MqttPublishPacket
{
Topic = connectPacket.WillTopic,
Payload = connectPacket.WillMessage,
QualityOfServiceLevel = connectPacket.WillQoS,
Retain = connectPacket.WillRetain,
Dup = false,
Properties =
{
ContentType = connectPacket.WillProperties.ContentType,
CorrelationData = connectPacket.WillProperties.CorrelationData,
MessageExpiryInterval = connectPacket.WillProperties.MessageExpiryInterval,
PayloadFormatIndicator = connectPacket.WillProperties.PayloadFormatIndicator,
ResponseTopic = connectPacket.WillProperties.ResponseTopic
}
};
packet.Properties.UserProperties.AddRange(connectPacket.WillProperties.UserProperties);
return packet;
}
}
}
@@ -11,7 +11,7 @@ namespace MQTTnet.Formatter.V3
public class MqttV310PacketFormatter : IMqttPacketFormatter
{
const int FixedHeaderSize = 1;
static readonly MqttDisconnectPacket DisconnectPacket = new MqttDisconnectPacket();
readonly IMqttPacketWriter _packetWriter;
@@ -30,7 +30,7 @@ namespace MQTTnet.Formatter.V3
_packetWriter.Seek(5);
var fixedHeader = EncodePacket(packet, _packetWriter);
var remainingLength = (uint)(_packetWriter.Length - 5);
var remainingLength = (uint) (_packetWriter.Length - 5);
var remainingLengthSize = MqttPacketWriter.GetLengthOfVariableInteger(remainingLength);
@@ -57,7 +57,7 @@ namespace MQTTnet.Formatter.V3
throw new MqttProtocolViolationException($"The packet type is invalid ({controlPacketType}).");
}
switch ((MqttControlPacketType)controlPacketType)
switch ((MqttControlPacketType) controlPacketType)
{
case MqttControlPacketType.Connect: return DecodeConnectPacket(receivedMqttPacket.BodyReader);
case MqttControlPacketType.ConnAck: return DecodeConnAckPacket(receivedMqttPacket.BodyReader);
@@ -187,7 +187,7 @@ namespace MQTTnet.Formatter.V3
var topicFilter = new MqttTopicFilter
{
Topic = body.ReadStringWithLengthPrefix(),
QualityOfServiceLevel = (MqttQualityOfServiceLevel)body.ReadByte()
QualityOfServiceLevel = (MqttQualityOfServiceLevel) body.ReadByte()
};
packet.TopicFilters.Add(topicFilter);
@@ -201,7 +201,7 @@ namespace MQTTnet.Formatter.V3
ThrowIfBodyIsEmpty(receivedMqttPacket.BodyReader);
var retain = (receivedMqttPacket.FixedHeader & 0x1) > 0;
var qualityOfServiceLevel = (MqttQualityOfServiceLevel)(receivedMqttPacket.FixedHeader >> 1 & 0x3);
var qualityOfServiceLevel = (MqttQualityOfServiceLevel) (receivedMqttPacket.FixedHeader >> 1 & 0x3);
var dup = (receivedMqttPacket.FixedHeader & 0x8) > 0;
var topic = receivedMqttPacket.BodyReader.ReadStringWithLengthPrefix();
@@ -267,13 +267,12 @@ namespace MQTTnet.Formatter.V3
if (willFlag)
{
packet.WillMessage = new MqttApplicationMessage
{
Topic = body.ReadStringWithLengthPrefix(),
Payload = body.ReadWithLengthPrefix(),
QualityOfServiceLevel = (MqttQualityOfServiceLevel)willQoS,
Retain = willRetain
};
packet.WillFlag = true;
packet.WillQoS = (MqttQualityOfServiceLevel) willQoS;
packet.WillRetain = willRetain;
packet.WillTopic = body.ReadStringWithLengthPrefix();
packet.WillMessage = body.ReadWithLengthPrefix();
}
if (usernameFlag)
@@ -301,7 +300,7 @@ namespace MQTTnet.Formatter.V3
while (!body.EndOfStream)
{
packet.ReturnCodes.Add((MqttSubscribeReturnCode)body.ReadByte());
packet.ReturnCodes.Add((MqttSubscribeReturnCode) body.ReadByte());
}
return packet;
@@ -314,7 +313,7 @@ namespace MQTTnet.Formatter.V3
var packet = new MqttConnAckPacket();
body.ReadByte(); // Reserved.
packet.ReturnCode = (MqttConnectReturnCode)body.ReadByte();
packet.ReturnCode = (MqttConnectReturnCode) body.ReadByte();
return packet;
}
@@ -351,12 +350,12 @@ namespace MQTTnet.Formatter.V3
connectFlags |= 0x2;
}
if (packet.WillMessage != null)
if (packet.WillFlag)
{
connectFlags |= 0x4;
connectFlags |= (byte)((byte)packet.WillMessage.QualityOfServiceLevel << 3);
connectFlags |= (byte) ((byte) packet.WillQoS << 3);
if (packet.WillMessage.Retain)
if (packet.WillRetain)
{
connectFlags |= 0x20;
}
@@ -381,10 +380,10 @@ namespace MQTTnet.Formatter.V3
packetWriter.Write(packet.KeepAlivePeriod);
packetWriter.WriteWithLengthPrefix(packet.ClientId);
if (packet.WillMessage != null)
if (packet.WillFlag)
{
packetWriter.WriteWithLengthPrefix(packet.WillMessage.Topic);
packetWriter.WriteWithLengthPrefix(packet.WillMessage.Payload);
packetWriter.WriteWithLengthPrefix(packet.WillTopic);
packetWriter.WriteWithLengthPrefix(packet.WillMessage);
}
if (packet.Username != null)
@@ -403,7 +402,7 @@ namespace MQTTnet.Formatter.V3
protected virtual byte EncodeConnAckPacket(MqttConnAckPacket packet, IMqttPacketWriter packetWriter)
{
packetWriter.Write(0); // Reserved.
packetWriter.Write((byte)packet.ReturnCode);
packetWriter.Write((byte) packet.ReturnCode);
return MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.ConnAck);
}
@@ -455,7 +454,7 @@ namespace MQTTnet.Formatter.V3
fixedHeader |= 0x01;
}
fixedHeader |= (byte)((byte)packet.QualityOfServiceLevel << 1);
fixedHeader |= (byte) ((byte) packet.QualityOfServiceLevel << 1);
if (packet.Dup)
{
@@ -525,14 +524,14 @@ namespace MQTTnet.Formatter.V3
{
throw new MqttProtocolViolationException("RetainAsPublished is not supported in 3.1.1.");
}
if (topicFilter.RetainHandling != MqttRetainHandling.SendAtSubscribe)
{
throw new MqttProtocolViolationException("RetainHandling is not supported in 3.1.1.");
}
packetWriter.WriteWithLengthPrefix(topicFilter.Topic);
packetWriter.Write((byte)topicFilter.QualityOfServiceLevel);
packetWriter.Write((byte) topicFilter.QualityOfServiceLevel);
}
}
@@ -552,7 +551,7 @@ namespace MQTTnet.Formatter.V3
{
foreach (var packetSubscribeReturnCode in packet.ReturnCodes)
{
packetWriter.Write((byte)packetSubscribeReturnCode);
packetWriter.Write((byte) packetSubscribeReturnCode);
}
}
@@ -606,4 +605,4 @@ namespace MQTTnet.Formatter.V3
}
}
}
}
}
@@ -24,12 +24,12 @@ namespace MQTTnet.Formatter.V3
connectFlags |= 0x2;
}
if (packet.WillMessage != null)
if (packet.WillFlag)
{
connectFlags |= 0x4;
connectFlags |= (byte)((byte)packet.WillMessage.QualityOfServiceLevel << 3);
connectFlags |= (byte)((byte)packet.WillQoS << 3);
if (packet.WillMessage.Retain)
if (packet.WillRetain)
{
connectFlags |= 0x20;
}
@@ -54,10 +54,10 @@ namespace MQTTnet.Formatter.V3
packetWriter.Write(packet.KeepAlivePeriod);
packetWriter.WriteWithLengthPrefix(packet.ClientId);
if (packet.WillMessage != null)
if (packet.WillFlag)
{
packetWriter.WriteWithLengthPrefix(packet.WillMessage.Topic);
packetWriter.WriteWithLengthPrefix(packet.WillMessage.Payload);
packetWriter.WriteWithLengthPrefix(packet.WillTopic);
packetWriter.WriteWithLengthPrefix(packet.WillMessage);
}
if (packet.Username != null)
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using MQTTnet.Adapter;
using MQTTnet.Exceptions;
using MQTTnet.Packets;
@@ -72,11 +71,9 @@ namespace MQTTnet.Formatter.V5
if (willMessageFlag)
{
packet.WillMessage = new MqttApplicationMessage
{
QualityOfServiceLevel = (MqttQualityOfServiceLevel)willMessageQoS,
Retain = willMessageRetainFlag
};
packet.WillFlag = true;
packet.WillQoS = (MqttQualityOfServiceLevel) willMessageQoS;
packet.WillRetain = willMessageRetainFlag;
}
packet.KeepAlivePeriod = body.ReadTwoByteInteger();
@@ -128,7 +125,7 @@ namespace MQTTnet.Formatter.V5
packet.ClientId = body.ReadStringWithLengthPrefix();
if (packet.WillMessage != null)
if (packet.WillFlag)
{
var willPropertiesReader = new MqttV500PropertiesReader(body);
@@ -136,50 +133,31 @@ namespace MQTTnet.Formatter.V5
{
if (willPropertiesReader.CurrentPropertyId == MqttPropertyId.PayloadFormatIndicator)
{
packet.WillMessage.PayloadFormatIndicator = propertiesReader.ReadPayloadFormatIndicator();
packet.WillProperties.PayloadFormatIndicator = propertiesReader.ReadPayloadFormatIndicator();
}
else if (willPropertiesReader.CurrentPropertyId == MqttPropertyId.MessageExpiryInterval)
{
packet.WillMessage.MessageExpiryInterval = propertiesReader.ReadMessageExpiryInterval();
}
else if (willPropertiesReader.CurrentPropertyId == MqttPropertyId.TopicAlias)
{
packet.WillMessage.TopicAlias = propertiesReader.ReadTopicAlias();
packet.WillProperties.MessageExpiryInterval = propertiesReader.ReadMessageExpiryInterval();
}
else if (willPropertiesReader.CurrentPropertyId == MqttPropertyId.ResponseTopic)
{
packet.WillMessage.ResponseTopic = propertiesReader.ReadResponseTopic();
packet.WillProperties.ResponseTopic = propertiesReader.ReadResponseTopic();
}
else if (willPropertiesReader.CurrentPropertyId == MqttPropertyId.CorrelationData)
{
packet.WillMessage.CorrelationData = propertiesReader.ReadCorrelationData();
}
else if (willPropertiesReader.CurrentPropertyId == MqttPropertyId.SubscriptionIdentifier)
{
if (packet.WillMessage.SubscriptionIdentifiers == null)
{
packet.WillMessage.SubscriptionIdentifiers = new List<uint>();
}
packet.WillMessage.SubscriptionIdentifiers.Add(propertiesReader.ReadSubscriptionIdentifier());
packet.WillProperties.CorrelationData = propertiesReader.ReadCorrelationData();
}
else if (willPropertiesReader.CurrentPropertyId == MqttPropertyId.ContentType)
{
packet.WillMessage.ContentType = propertiesReader.ReadContentType();
packet.WillProperties.ContentType = propertiesReader.ReadContentType();
}
else if (willPropertiesReader.CurrentPropertyId == MqttPropertyId.WillDelayInterval)
{
// This is a special case!
packet.Properties.WillDelayInterval = propertiesReader.ReadWillDelayInterval();
packet.WillProperties.WillDelayInterval = propertiesReader.ReadWillDelayInterval();
}
else if (willPropertiesReader.CurrentPropertyId == MqttPropertyId.UserProperty)
{
if (packet.WillMessage.UserProperties == null)
{
packet.WillMessage.UserProperties = new List<MqttUserProperty>();
}
propertiesReader.AddUserPropertyTo(packet.Properties.UserProperties);
propertiesReader.AddUserPropertyTo(packet.WillProperties.UserProperties);
}
else
{
@@ -187,8 +165,8 @@ namespace MQTTnet.Formatter.V5
}
}
packet.WillMessage.Topic = body.ReadStringWithLengthPrefix();
packet.WillMessage.Payload = body.ReadWithLengthPrefix();
packet.WillTopic = body.ReadStringWithLengthPrefix();
packet.WillMessage = body.ReadWithLengthPrefix();
}
if (usernameFlag)
@@ -88,12 +88,12 @@ namespace MQTTnet.Formatter.V5
connectFlags |= 0x2;
}
if (packet.WillMessage != null)
if (packet.WillFlag)
{
connectFlags |= 0x4;
connectFlags |= (byte)((byte)packet.WillMessage.QualityOfServiceLevel << 3);
connectFlags |= (byte)((byte)packet.WillQoS << 3);
if (packet.WillMessage.Retain)
if (packet.WillRetain)
{
connectFlags |= 0x20;
}
@@ -135,25 +135,23 @@ namespace MQTTnet.Formatter.V5
packetWriter.WriteWithLengthPrefix(packet.ClientId);
if (packet.WillMessage != null)
if (packet.WillFlag)
{
var willPropertiesWriter = new MqttV500PropertiesWriter();
willPropertiesWriter.WritePayloadFormatIndicator(packet.WillMessage.PayloadFormatIndicator);
willPropertiesWriter.WriteMessageExpiryInterval(packet.WillMessage.MessageExpiryInterval);
willPropertiesWriter.WriteTopicAlias(packet.WillMessage.TopicAlias);
willPropertiesWriter.WriteResponseTopic(packet.WillMessage.ResponseTopic);
willPropertiesWriter.WriteCorrelationData(packet.WillMessage.CorrelationData);
willPropertiesWriter.WriteSubscriptionIdentifiers(packet.WillMessage.SubscriptionIdentifiers);
willPropertiesWriter.WriteContentType(packet.WillMessage.ContentType);
willPropertiesWriter.WriteUserProperties(packet.WillMessage.UserProperties);
willPropertiesWriter.WritePayloadFormatIndicator(packet.WillProperties.PayloadFormatIndicator);
willPropertiesWriter.WriteMessageExpiryInterval(packet.WillProperties.MessageExpiryInterval);
willPropertiesWriter.WriteResponseTopic(packet.WillProperties.ResponseTopic);
willPropertiesWriter.WriteCorrelationData(packet.WillProperties.CorrelationData);
willPropertiesWriter.WriteContentType(packet.WillProperties.ContentType);
willPropertiesWriter.WriteUserProperties(packet.WillProperties.UserProperties);
// This is a special case!
willPropertiesWriter.WriteWillDelayInterval(packet.Properties?.WillDelayInterval);
willPropertiesWriter.WriteTo(packetWriter);
packetWriter.WriteWithLengthPrefix(packet.WillMessage.Topic);
packetWriter.WriteWithLengthPrefix(packet.WillMessage.Payload);
packetWriter.WriteWithLengthPrefix(packet.WillTopic);
packetWriter.WriteWithLengthPrefix(packet.WillMessage);
}
if (packet.Username != null)
@@ -143,7 +143,7 @@ namespace MQTTnet.Formatter.V5
return _body.ReadVariableLengthInteger();
}
public MqttPayloadFormatIndicator? ReadPayloadFormatIndicator()
public MqttPayloadFormatIndicator ReadPayloadFormatIndicator()
{
return (MqttPayloadFormatIndicator)_body.ReadByte();
}