public IList GetSubscribers(IMessage message, bool evalSelector) { lock (_objLock) { bool filter = true; if (message.headers == null || message.headers.Count == 0) { filter = false; } if (!filter) { return(GetSubscribers()); } else { Subtopic subtopic = null; if (message.headers.ContainsKey(AsyncMessage.SubtopicHeader)) { subtopic = new Subtopic(message.headers[AsyncMessage.SubtopicHeader] as string); MessagingAdapter messagingAdapter = _messageDestination.ServiceAdapter as MessagingAdapter; if (messagingAdapter != null) { if (!messagingAdapter.AllowSend(subtopic)) { return(null); } } } ArrayList subscribers = new ArrayList(); foreach (MessageClient messageClient in _subscribers.Values) { bool include = true; if (subtopic != null && messageClient.Subtopic != null) { include = include && subtopic.Matches(messageClient.Subtopic); } if (messageClient.Selector != null && evalSelector) { include = include && messageClient.Selector.Evaluate(null, message.headers); } if (include) { subscribers.Add(messageClient.ClientId); } } return(subscribers); } } }
public MessageClient AddSubscriber(string clientId, string endpointId, Subtopic subtopic, Selector selector) { lock (_objLock) { if (subtopic != null) { MessagingAdapter messagingAdapter = _messageDestination.ServiceAdapter as MessagingAdapter; if (messagingAdapter != null) { if (!messagingAdapter.AllowSubscribe(subtopic)) { ASObject aso = new ASObject(); aso["subtopic"] = subtopic.Value; throw new MessageException(aso); } } } if (!_subscribers.Contains(clientId)) { //Set in RtmpService MessageClient messageClient = new MessageClient(clientId, _messageDestination, endpointId); messageClient.Subtopic = subtopic; messageClient.Selector = selector; messageClient.AddSubscription(selector, subtopic); AddSubscriber(messageClient); messageClient.NotifyCreatedListeners(); return(messageClient); } else { MessageClient messageClient = _subscribers[clientId] as MessageClient; IClient client = FluorineContext.Current.Client; if (client != null && !client.Id.Equals(messageClient.Client.Id)) { throw new MessageException("Duplicate subscriptions from multiple Flex Clients"); } //Reset the endpoint push state for the subscription to make sure its current because a resubscribe could be arriving over a new endpoint or a new session. messageClient.ResetEndpoint(endpointId); return(messageClient); } } }