/// <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); } } } }
/// <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); } }
public bool TryGetInterestListHandler(string eventType, out InterestListEventHandler handler) { return(m_interestListHandlers.TryGetValue(eventType, out handler)); }
public void AddInterestListHandler(string eventType, InterestListEventHandler handler) { m_interestListHandlers[eventType] = handler; }
/// <summary> /// Default constructor /// </summary> public QueuedInterestListEvent(InterestListEvent eventData, double priority, InterestListEventHandler handler) { Event = eventData; Priority = priority; Handler = handler; }