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