using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using MQTTnet.Exceptions; using MQTTnet.Protocol; namespace MQTTnet { public class MqttApplicationMessageBuilder { private MqttQualityOfServiceLevel _qualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce; private string _topic; private byte[] _payload; private bool _retain; public MqttApplicationMessageBuilder WithTopic(string topic) { _topic = topic; return this; } public MqttApplicationMessageBuilder WithPayload(IEnumerable payload) { if (payload == null) { _payload = null; return this; } _payload = payload.ToArray(); return this; } public MqttApplicationMessageBuilder WithPayload(Stream payload) { 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 = new byte[0]; } 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) ? new byte[0] : 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; } public MqttApplicationMessage Build() { if (string.IsNullOrEmpty(_topic)) { throw new MqttProtocolViolationException("Topic is not set."); } return new MqttApplicationMessage { Topic = _topic, Payload = _payload ?? new byte[0], QualityOfServiceLevel = _qualityOfServiceLevel, Retain = _retain }; } } }