public SubscriptionRegistration(Subscription subscription, ClientSession session) { if (subscription == null || session == null) throw new ArgumentNullException(); this.subscription = subscription; this.session = session; }
private void SubscriptionUpdatedHandler(Subscription subscription) { if (!UserIsLoggedIn) return; if (!subscriptions.ContainsKey(subscription.Guid)) return; if (subscription.Status == SubscriptionStatus.Unknown || subscription.Status == SubscriptionStatus.Stopped) { //termination if (subscriptions_callbacks[subscription.Guid] != null) subscriptions_callbacks[subscription.Guid](subscription, null); subscriptions_mutex.WaitOne(); subscriptions.Remove(subscription.Guid); subscriptions_callbacks.Remove(subscription.Guid); subscriptions_mutex.ReleaseMutex(); } else { //update subscriptions[subscription.Guid] = subscription; if (subscriptions_callbacks[subscription.Guid] != null) subscriptions_callbacks[subscription.Guid](subscription, null); } }
public Subscription Subscribe(Guid device, short service, ClientSession session) { if (session == null) return null; if (device == Guid.Empty) return null; if (service == 0) return null; if (DeviceManager.Instance.Get(device) == null) return null; if (DeviceManager.Instance.Get(device).Status != DeviceStatus.Online && DeviceManager.Instance.Get(device).Status != DeviceStatus.Paused) return null; // Check for permission if (!session.UserHasPermission(User.PERMISSION_SUBSCRIBE)) return null; // thread safe mutex.WaitOne(); // make sure we don't have duplicates foreach (SubscriptionRegistration registration in registrations.Values) if (registration.Session == session && registration.Subscription.Device == device) { mutex.ReleaseMutex(); //update service mask registration.Subscription.Service = service; return registration.Subscription; } // generates a new guid Guid guid; while (true) { guid = Guid.NewGuid(); if (!registrations.ContainsKey(guid)) break; } // create the object Subscription subscription = new Subscription { Guid = guid, Device = device, Service = service, Status = SubscriptionStatus.Unknown }; SubscriptionRegistration reg = new SubscriptionRegistration(subscription, session); if (DeviceManager.Instance.Get(device).Status == DeviceStatus.Online) reg.SetStatus(SubscriptionStatus.Running); else reg.SetStatus(SubscriptionStatus.Paused); // add to registry registrations.Add(guid, reg); Util.EventLog.WriteEntry(guid.ToString(), "Subscription Started, Count = " + registrations.Count); mutex.ReleaseMutex(); return subscription; }