Files
MQTTnet/Source/MQTTnet/MqttTopicFilterBuilder.cs
T
Christian c756a4092f Feature/mqttv5 subscriptions server (#1246)
* Add support for RetainHandling.

* Add support for No Local.

* Add support for _SubscriptionIdentifier_.

* Add more Unit Tests.

* Update docs.
2021-09-23 20:30:43 +02:00

121 lines
4.1 KiB
C#

using MQTTnet.Exceptions;
using MQTTnet.Protocol;
using System;
namespace MQTTnet
{
[Obsolete("Use MqttTopicFilterBuilder instead. It is just a renamed version to align with general namings in this lib.")]
public class TopicFilterBuilder : MqttTopicFilterBuilder
{
}
public class MqttTopicFilterBuilder
{
/// <summary>
/// The quality of service level.
/// The Quality of Service (QoS) level is an agreement between the sender of a message and the receiver of a message that defines the guarantee of delivery for a specific message.
/// There are 3 QoS levels in MQTT:
/// - At most once (0): Message gets delivered no time, once or multiple times.
/// - At least once (1): Message gets delivered at least once (one time or more often).
/// - Exactly once (2): Message gets delivered exactly once (It's ensured that the message only comes once).
/// </summary>
MqttQualityOfServiceLevel _qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce;
/// <summary>
/// The MQTT topic.
/// In MQTT, the word topic refers to an UTF-8 string that the broker uses to filter messages for each connected client.
/// The topic consists of one or more topic levels. Each topic level is separated by a forward slash (topic level separator).
/// </summary>
string _topic;
bool _noLocal;
bool _retainAsPublished;
MqttRetainHandling _retainHandling = MqttRetainHandling.SendAtSubscribe;
public MqttTopicFilterBuilder WithTopic(string topic)
{
_topic = topic;
return this;
}
public MqttTopicFilterBuilder WithQualityOfServiceLevel(MqttQualityOfServiceLevel qualityOfServiceLevel)
{
_qualityOfServiceLevel = qualityOfServiceLevel;
return this;
}
public MqttTopicFilterBuilder WithAtLeastOnceQoS()
{
_qualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce;
return this;
}
public MqttTopicFilterBuilder WithAtMostOnceQoS()
{
_qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce;
return this;
}
public MqttTopicFilterBuilder WithExactlyOnceQoS()
{
_qualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce;
return this;
}
[Obsolete("Please use overload with _bool_ instead.")]
public MqttTopicFilterBuilder WithNoLocal(bool? value = true)
{
_noLocal = value == true;
return this;
}
public MqttTopicFilterBuilder WithNoLocal(bool value = true)
{
_noLocal = value;
return this;
}
[Obsolete("Please use overload with _bool_ instead.")]
public MqttTopicFilterBuilder WithRetainAsPublished(bool? value = true)
{
_retainAsPublished = value == true;
return this;
}
public MqttTopicFilterBuilder WithRetainAsPublished(bool value = true)
{
_retainAsPublished = value;
return this;
}
[Obsolete("Please use overload with _MqttRetainHandling_ instead.")]
public MqttTopicFilterBuilder WithRetainHandling(MqttRetainHandling? value)
{
_retainHandling = value ?? MqttRetainHandling.SendAtSubscribe;
return this;
}
public MqttTopicFilterBuilder WithRetainHandling(MqttRetainHandling value)
{
_retainHandling = value;
return this;
}
public MqttTopicFilter Build()
{
if (string.IsNullOrEmpty(_topic))
{
throw new MqttProtocolViolationException("Topic is not set.");
}
return new MqttTopicFilter
{
Topic = _topic,
QualityOfServiceLevel = _qualityOfServiceLevel,
NoLocal = _noLocal,
RetainAsPublished = _retainAsPublished,
RetainHandling = _retainHandling
};
}
}
}