using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using MQTTnet.Internal; namespace MQTTnet.Extensions.ManagedClient { public class ManagedMqttClientStorageManager { private readonly List _messages = new List(); private readonly AsyncLock _messagesLock = new AsyncLock(); private readonly IManagedMqttClientStorage _storage; public ManagedMqttClientStorageManager(IManagedMqttClientStorage storage) { _storage = storage ?? throw new ArgumentNullException(nameof(storage)); } public async Task> LoadQueuedMessagesAsync() { var loadedMessages = await _storage.LoadQueuedMessagesAsync().ConfigureAwait(false); _messages.AddRange(loadedMessages); return _messages; } public async Task AddAsync(ManagedMqttApplicationMessage applicationMessage) { if (applicationMessage == null) throw new ArgumentNullException(nameof(applicationMessage)); using (await _messagesLock.LockAsync(CancellationToken.None).ConfigureAwait(false)) { _messages.Add(applicationMessage); await SaveAsync().ConfigureAwait(false); } } public async Task RemoveAsync(ManagedMqttApplicationMessage applicationMessage) { if (applicationMessage == null) throw new ArgumentNullException(nameof(applicationMessage)); using (await _messagesLock.LockAsync(CancellationToken.None).ConfigureAwait(false)) { var index = _messages.IndexOf(applicationMessage); if (index == -1) { return; } _messages.RemoveAt(index); await SaveAsync().ConfigureAwait(false); } } private Task SaveAsync() { return _storage.SaveQueuedMessagesAsync(_messages); } } }