public async Task <IList <MqttApplicationMessage> > GetSubscribedMessagesAsync(ICollection <TopicFilter> topicFilters) { if (topicFilters == null) { throw new ArgumentNullException(nameof(topicFilters)); } var matchingRetainedMessages = new List <MqttApplicationMessage>(); List <MqttApplicationMessage> retainedMessages; using (await _messagesLock.WaitAsync().ConfigureAwait(false)) { retainedMessages = _messages.Values.ToList(); } foreach (var retainedMessage in retainedMessages) { foreach (var topicFilter in topicFilters) { if (!MqttTopicFilterComparer.IsMatch(retainedMessage.Topic, topicFilter.Topic)) { continue; } matchingRetainedMessages.Add(retainedMessage); break; } } return(matchingRetainedMessages); }
public async Task <List <MqttApplicationMessage> > GetSubscribedMessagesAsync(MqttSubscribePacket subscribePacket) { var retainedMessages = new List <MqttApplicationMessage>(); await _semaphore.WaitAsync().ConfigureAwait(false); try { foreach (var retainedMessage in _retainedMessages.Values) { foreach (var topicFilter in subscribePacket.TopicFilters) { if (retainedMessage.QualityOfServiceLevel < topicFilter.QualityOfServiceLevel) { continue; } if (!MqttTopicFilterComparer.IsMatch(retainedMessage.Topic, topicFilter.Topic)) { continue; } retainedMessages.Add(retainedMessage); break; } } } finally { _semaphore.Release(); } return(retainedMessages); }
public CheckSubscriptionsResult CheckSubscriptions(string topic, MqttQualityOfServiceLevel qosLevel) { var qosLevels = new HashSet <MqttQualityOfServiceLevel>(); lock (_subscriptions) { foreach (var subscription in _subscriptions) { if (!MqttTopicFilterComparer.IsMatch(topic, subscription.Key)) { continue; } qosLevels.Add(subscription.Value); } } if (qosLevels.Count == 0) { return(new CheckSubscriptionsResult { IsSubscribed = false }); } return(CreateSubscriptionResult(qosLevel, qosLevels)); }
public CheckSubscriptionsResult CheckSubscriptions(string topic, MqttQualityOfServiceLevel qosLevel) { Dictionary <string, MqttTopicFilter> subscriptionsCopy; _subscriptionsLock.EnterReadLock(); try { subscriptionsCopy = new Dictionary <string, MqttTopicFilter>(_subscriptions); } finally { _subscriptionsLock.ExitReadLock(); } var qosLevels = new HashSet <MqttQualityOfServiceLevel>(); foreach (var subscription in subscriptionsCopy) { if (!MqttTopicFilterComparer.IsMatch(topic, subscription.Key)) { continue; } qosLevels.Add(subscription.Value.QualityOfServiceLevel); } if (qosLevels.Count == 0) { return(CheckSubscriptionsResult.NotSubscribed); } return(CreateSubscriptionResult(qosLevel, qosLevels)); }
public Task <IList <MqttApplicationMessage> > GetSubscribedMessagesAsync(ICollection <MqttTopicFilter> topicFilters) { if (topicFilters == null) { throw new ArgumentNullException(nameof(topicFilters)); } var matchingRetainedMessages = new List <MqttApplicationMessage>(); List <MqttApplicationMessage> retainedMessages; lock (_messages) { retainedMessages = _messages.Values.ToList(); } foreach (var retainedMessage in retainedMessages) { foreach (var topicFilter in topicFilters) { if (!MqttTopicFilterComparer.IsMatch(retainedMessage.Topic, topicFilter.Topic)) { continue; } matchingRetainedMessages.Add(retainedMessage); break; } } return(Task.FromResult((IList <MqttApplicationMessage>)matchingRetainedMessages)); }
public async Task <List <MqttApplicationMessage> > GetSubscribedMessagesAsync(ICollection <TopicFilter> topicFilters) { var retainedMessages = new List <MqttApplicationMessage>(); await _semaphore.WaitAsync().ConfigureAwait(false); try { foreach (var retainedMessage in _retainedMessages.Values) { foreach (var topicFilter in topicFilters) { if (!MqttTopicFilterComparer.IsMatch(retainedMessage.Topic, topicFilter.Topic)) { continue; } retainedMessages.Add(retainedMessage); break; } } } finally { _semaphore.Release(); } return(retainedMessages); }
public IList <MqttApplicationMessage> GetSubscribedMessages(ICollection <TopicFilter> topicFilters) { var retainedMessages = new List <MqttApplicationMessage>(); lock (_messages) { foreach (var retainedMessage in _messages.Values) { foreach (var topicFilter in topicFilters) { if (!MqttTopicFilterComparer.IsMatch(retainedMessage.Topic, topicFilter.Topic)) { continue; } retainedMessages.Add(retainedMessage); break; } } } return(retainedMessages); }
public async Task <CheckSubscriptionsResult> CheckSubscriptionsAsync(MqttApplicationMessage applicationMessage) { if (applicationMessage == null) { throw new ArgumentNullException(nameof(applicationMessage)); } await _semaphore.WaitAsync().ConfigureAwait(false); try { var qosLevels = new HashSet <MqttQualityOfServiceLevel>(); foreach (var subscription in _subscriptions) { if (!MqttTopicFilterComparer.IsMatch(applicationMessage.Topic, subscription.Key)) { continue; } qosLevels.Add(subscription.Value); } if (qosLevels.Count == 0) { return(new CheckSubscriptionsResult { IsSubscribed = false }); } return(CreateSubscriptionResult(applicationMessage, qosLevels)); } finally { _semaphore.Release(); } }