Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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));
        }
Пример #5
0
        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));
        }
Пример #6
0
        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();
            }
        }