public SubscriptionRegistration(Subscription subscription, ClientSession session)
 {
     if (subscription == null || session == null)
         throw new ArgumentNullException();
     this.subscription = subscription;
     this.session = session;
 }
Example #2
0
        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);
            }
        }
Example #3
0
        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;
        }