public SubscriptionRegistration(Subscription subscription, ClientSession session) { if (subscription == null || session == null) throw new ArgumentNullException(); this.subscription = subscription; this.session = session; }
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; }
/// <summary> /// Create a new session /// </summary> /// <returns></returns> public static ClientSession Create() { mutex.WaitOne(); while (true) { Guid id = Guid.NewGuid(); if (!sessions.ContainsKey(id)) { ClientSession session = new ClientSession(); session.id = id; sessions.Add(id, session); Util.EventLog.WriteEntry(id.ToString(), "ClientSession Started, Count = " + sessions.Count); mutex.ReleaseMutex(); return session; } } }
public void UnsubscribeAll(ClientSession session) { if (session == null) return; // thread safe mutex.WaitOne(); foreach (SubscriptionRegistration registration in registrations.Values) if (registration.Session == session) registration.SetStatus(SubscriptionStatus.Stopped); mutex.ReleaseMutex(); CleanUp(); }
public void Unsubscribe(Guid subscription, ClientSession session) { if (session == null) return; // thread safe mutex.WaitOne(); if (registrations.ContainsKey(subscription)) if(registrations[subscription].Session == session) registrations.Remove(subscription); mutex.ReleaseMutex(); }