| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using MQTTnet.Exceptions;
- using MQTTnet.Packets;
- using MQTTnet.Protocol;
- namespace MQTTnet
- {
- public class MqttApplicationMessageBuilder
- {
- private MqttQualityOfServiceLevel _qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce;
- private string _topic;
- private byte[] _payload;
- private bool _retain;
- private string _contentType;
- private string _responseTopic;
- private byte[] _correlationData;
- private ushort? _topicAlias;
- private List<uint> _subscriptionIdentifiers;
- private uint? _messageExpiryInterval;
- private MqttPayloadFormatIndicator? _payloadFormatIndicator;
- private List<MqttUserProperty> _userProperties;
- public MqttApplicationMessageBuilder WithTopic(string topic)
- {
- _topic = topic;
- return this;
- }
- public MqttApplicationMessageBuilder WithPayload(byte[] payload)
- {
- _payload = payload;
- return this;
- }
- public MqttApplicationMessageBuilder WithPayload(IEnumerable<byte> payload)
- {
- if (payload == null)
- {
- _payload = null;
- return this;
- }
- _payload = payload as byte[];
- if (_payload == null)
- {
- _payload = payload.ToArray();
- }
- return this;
- }
- public MqttApplicationMessageBuilder WithPayload(Stream payload)
- {
- if (payload == null)
- {
- _payload = null;
- return this;
- }
- return WithPayload(payload, payload.Length - payload.Position);
- }
- public MqttApplicationMessageBuilder WithPayload(Stream payload, long length)
- {
- if (payload == null)
- {
- _payload = null;
- return this;
- }
- if (payload.Length == 0)
- {
- _payload = null;
- }
- else
- {
- _payload = new byte[length];
- payload.Read(_payload, 0, _payload.Length);
- }
- return this;
- }
- public MqttApplicationMessageBuilder WithPayload(string payload)
- {
- if (payload == null)
- {
- _payload = null;
- return this;
- }
- _payload = string.IsNullOrEmpty(payload) ? null : Encoding.UTF8.GetBytes(payload);
- return this;
- }
- public MqttApplicationMessageBuilder WithQualityOfServiceLevel(MqttQualityOfServiceLevel qualityOfServiceLevel)
- {
- _qualityOfServiceLevel = qualityOfServiceLevel;
- return this;
- }
- public MqttApplicationMessageBuilder WithRetainFlag(bool value = true)
- {
- _retain = value;
- return this;
- }
- public MqttApplicationMessageBuilder WithAtLeastOnceQoS()
- {
- _qualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce;
- return this;
- }
- public MqttApplicationMessageBuilder WithAtMostOnceQoS()
- {
- _qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce;
- return this;
- }
- public MqttApplicationMessageBuilder WithExactlyOnceQoS()
- {
- _qualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce;
- return this;
- }
- /// <summary>
- /// This is only supported when using MQTTv5.
- /// </summary>
- public MqttApplicationMessageBuilder WithUserProperty(string name, string value)
- {
- if (_userProperties == null)
- {
- _userProperties = new List<MqttUserProperty>();
- }
- _userProperties.Add(new MqttUserProperty(name, value));
- return this;
- }
- /// <summary>
- /// This is only supported when using MQTTv5.
- /// </summary>
- public MqttApplicationMessageBuilder WithContentType(string contentType)
- {
- _contentType = contentType;
- return this;
- }
- /// <summary>
- /// This is only supported when using MQTTv5.
- /// </summary>
- public MqttApplicationMessageBuilder WithResponseTopic(string responseTopic)
- {
- _responseTopic = responseTopic;
- return this;
- }
- /// <summary>
- /// This is only supported when using MQTTv5.
- /// </summary>
- public MqttApplicationMessageBuilder WithCorrelationData(byte[] correlationData)
- {
- _correlationData = correlationData;
- return this;
- }
- /// <summary>
- /// This is only supported when using MQTTv5.
- /// </summary>
- public MqttApplicationMessageBuilder WithTopicAlias(ushort topicAlias)
- {
- _topicAlias = topicAlias;
- return this;
- }
- /// <summary>
- /// This is only supported when using MQTTv5.
- /// </summary>
- public MqttApplicationMessageBuilder WithSubscriptionIdentifier(uint subscriptionIdentifier)
- {
- if (_subscriptionIdentifiers == null)
- {
- _subscriptionIdentifiers = new List<uint>();
- }
- _subscriptionIdentifiers.Add(subscriptionIdentifier);
- return this;
- }
- /// <summary>
- /// This is only supported when using MQTTv5.
- /// </summary>
- public MqttApplicationMessageBuilder WithMessageExpiryInterval(uint messageExpiryInterval)
- {
- _messageExpiryInterval = messageExpiryInterval;
- return this;
- }
- /// <summary>
- /// This is only supported when using MQTTv5.
- /// </summary>
- public MqttApplicationMessageBuilder WithPayloadFormatIndicator(MqttPayloadFormatIndicator payloadFormatIndicator)
- {
- _payloadFormatIndicator = payloadFormatIndicator;
- return this;
- }
- public MqttApplicationMessage Build()
- {
- if (string.IsNullOrEmpty(_topic))
- {
- throw new MqttProtocolViolationException("Topic is not set.");
- }
- var applicationMessage = new MqttApplicationMessage
- {
- Topic = _topic,
- Payload = _payload,
- QualityOfServiceLevel = _qualityOfServiceLevel,
- Retain = _retain,
- ContentType = _contentType,
- ResponseTopic = _responseTopic,
- CorrelationData = _correlationData,
- TopicAlias = _topicAlias,
- SubscriptionIdentifiers = _subscriptionIdentifiers,
- MessageExpiryInterval = _messageExpiryInterval,
- PayloadFormatIndicator = _payloadFormatIndicator,
- UserProperties = _userProperties
- };
- return applicationMessage;
- }
- }
- }
|