Exemplo n.º 1
0
        /// <summary>
        /// Adds an event to the interest list
        /// </summary>
        /// <param name="eventData">Event to add</param>
        /// <param name="handler">Collection of callbacks that will handle this
        /// event</param>
        public void EnqueueEvent(InterestListEvent eventData, InterestListEventHandler handler)
        {
            double?priority = handler.PriorityCallback(eventData, m_presence);

            // If this event has a non-null priority for this presence, enqueue it
            if (priority.HasValue)
            {
                QueuedInterestListEvent qile = new QueuedInterestListEvent(eventData, priority.Value, handler);

                lock (m_syncRoot)
                {
                    C5.PriorityQueueHandle handle;
                    if (m_eventIDs.TryGetValue(eventData.ID, out handle))
                    {
                        // An event with the same ID already exists in the priority queue. Combine this update with the previous one
                        qile = handler.CombineCallback(m_eventHeap[handle], qile);
                        m_eventHeap.Replace(handle, qile);
                    }
                    else
                    {
                        // This event ID is new
                        m_eventHeap.Add(ref handle, qile);
                        m_eventIDs.Add(eventData.ID, handle);
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Dequeues the highest priority events
        /// </summary>
        /// <param name="count">Maximum number of events to dequeue</param>
        public void DequeueEvents(int count)
        {
            Dictionary <string, List <QueuedInterestListEvent> > dequeued = new Dictionary <string, List <QueuedInterestListEvent> >();
            List <QueuedInterestListEvent> events;

            // Fetch the requested number of events, or as many as are available.
            // Put them in collections sorted by event type
            lock (m_syncRoot)
            {
                while (!m_eventHeap.IsEmpty && count-- > 0)
                {
                    QueuedInterestListEvent qile = m_eventHeap.DeleteMin();
                    m_eventIDs.Remove(qile.Event.ID);

                    if (!dequeued.TryGetValue(qile.Event.Type, out events))
                    {
                        events = new List <QueuedInterestListEvent>();
                        dequeued.Add(qile.Event.Type, events);
                    }

                    events.Add(qile);
                }
            }

            // Fire a SendEventCallback for each unique event type
            foreach (List <QueuedInterestListEvent> eventsList in dequeued.Values)
            {
                QueuedInterestListEvent[] eventsArray = eventsList.ToArray();
                InterestListEventHandler  handler     = eventsArray[0].Handler;

                handler.SendCallback(eventsArray, m_presence);
            }
        }
Exemplo n.º 3
0
 public bool TryGetInterestListHandler(string eventType, out InterestListEventHandler handler)
 {
     return(m_interestListHandlers.TryGetValue(eventType, out handler));
 }
Exemplo n.º 4
0
 public void AddInterestListHandler(string eventType, InterestListEventHandler handler)
 {
     m_interestListHandlers[eventType] = handler;
 }
Exemplo n.º 5
0
 /// <summary>
 /// Default constructor
 /// </summary>
 public QueuedInterestListEvent(InterestListEvent eventData, double priority, InterestListEventHandler handler)
 {
     Event    = eventData;
     Priority = priority;
     Handler  = handler;
 }