private MeshNetworkMessageSubscriptionToken AddSubscriptionInternal<TMessage>(Action<TMessage> deliveryAction, Func<TMessage, bool> messageFilter, bool strongReference, IMeshNetworkMessageProxy proxy) where TMessage : class, IMeshNetworkMessage { if (deliveryAction == null) throw new ArgumentNullException("deliveryAction"); if (messageFilter == null) throw new ArgumentNullException("messageFilter"); if (proxy == null) throw new ArgumentNullException("proxy"); lock (_SubscriptionsPadlock) { var subscriptionToken = new MeshNetworkMessageSubscriptionToken(this, typeof(TMessage)); IMeshNetworkMessageSubscription subscription; if (strongReference) subscription = new StrongMeshNetworkMessageSubscription<TMessage>(subscriptionToken, deliveryAction, messageFilter); else subscription = new WeakMeshNetworkMessageSubscription<TMessage>(subscriptionToken, deliveryAction, messageFilter); _Subscriptions.Add(new SubscriptionItem(proxy, subscription)); return subscriptionToken; } }
/// <summary> /// Initializes a new instance of the WeakMeshMessageSubscription class. /// </summary> /// <param name="destination">Destination object</param> /// <param name="deliveryAction">Delivery action</param> /// <param name="messageFilter">Filter function</param> public WeakMeshNetworkMessageSubscription(MeshNetworkMessageSubscriptionToken subscriptionToken, Action<TMessage> deliveryAction, Func<TMessage, bool> messageFilter) { if (subscriptionToken == null) throw new ArgumentNullException("subscriptionToken"); if (deliveryAction == null) throw new ArgumentNullException("deliveryAction"); if (messageFilter == null) throw new ArgumentNullException("messageFilter"); _SubscriptionToken = subscriptionToken; _DeliveryAction = new WeakReference(deliveryAction); _MessageFilter = new WeakReference(messageFilter); }
private void RemoveSubscriptionInternal<TMessage>(MeshNetworkMessageSubscriptionToken subscriptionToken) where TMessage : class, IMeshNetworkMessage { if (subscriptionToken == null) throw new ArgumentNullException("subscriptionToken"); lock (_SubscriptionsPadlock) { var currentlySubscribed = (from sub in _Subscriptions where object.ReferenceEquals(sub.Subscription.SubscriptionToken, subscriptionToken) select sub).ToList(); currentlySubscribed.ForEach(sub => _Subscriptions.Remove(sub)); } }
/// <summary> /// Initializes a new instance of the MeshMessageSubscription class. /// </summary> /// <param name="destination">Destination object</param> /// <param name="deliveryAction">Delivery action</param> /// <param name="messageFilter">Filter function</param> public StrongMeshNetworkMessageSubscription(MeshNetworkMessageSubscriptionToken subscriptionToken, Action<TMessage> deliveryAction, Func<TMessage, bool> messageFilter) { if (subscriptionToken == null) throw new ArgumentNullException("subscriptionToken"); if (deliveryAction == null) throw new ArgumentNullException("deliveryAction"); if (messageFilter == null) throw new ArgumentNullException("messageFilter"); _SubscriptionToken = subscriptionToken; _DeliveryAction = deliveryAction; _MessageFilter = messageFilter; }
/// <summary> /// Unsubscribe from a particular message type. /// /// Does not throw an exception if the subscription is not found. /// </summary> /// <param name="subscriptionToken">Subscription token received from Subscribe</param> public void Unsubscribe(MeshNetworkMessageSubscriptionToken subscriptionToken) { RemoveSubscriptionInternal<IMeshNetworkMessage>(subscriptionToken); }
/// <summary> /// Unsubscribe from a particular message type. /// /// Does not throw an exception if the subscription is not found. /// </summary> /// <typeparam name="TMessage">Type of message</typeparam> /// <param name="subscriptionToken">Subscription token received from Subscribe</param> public void Unsubscribe<TMessage>(MeshNetworkMessageSubscriptionToken subscriptionToken) where TMessage : class, IMeshNetworkMessage { RemoveSubscriptionInternal<TMessage>(subscriptionToken); }