public void AddPresence(Presence p, PresenceManager handler) { JID from = p.From; string res = from.Resource; Debug.Assert(p.Type == PresenceType.available); // If this is an update, remove the existing one. // we'll add the new one back in, in the correct place. gen.LinkedListNode<Presence> n = Find(res); if (n != null) m_all.Remove(n); gen.LinkedListNode<Presence> inserted = new gen.LinkedListNode<Presence>(p); for (n = m_all.First; n != null; n = n.Next) { if (p < n.Value) { m_all.AddBefore(n, inserted); break; } } // This is the highest one. if (inserted.List == null) { m_all.AddLast(inserted); if (p.IntPriority >= 0) Primary(p, handler); } }
public void RemovePresence(Presence p, PresenceManager handler) { JID from = p.From; string res = from.Resource; Debug.Assert(p.Type == PresenceType.unavailable); gen.LinkedListNode <Presence> n = Find(res); // unavail for a resource we haven't gotten presence from. if (n == null) { return; } gen.LinkedListNode <Presence> last = m_all.Last; m_all.Remove(n); if (last == n) { // current high-pri. if ((m_all.Last != null) && (m_all.Last.Value.IntPriority >= 0)) { Primary(m_all.Last.Value, handler); } else { // last non-negative presence went away if (n.Value.IntPriority >= 0) { Primary(null, handler); } } } }
private gen.LinkedListNode<Presence> Find(string resource) { for (gen.LinkedListNode<Presence> n = m_all.First; n != null; n = n.Next) { if (n.Value.From.Resource == resource) return n; } return null; }
public void AddPresence(Presence p, PresenceManager handler) { JID from = p.From; string res = from.Resource; Debug.Assert(p.Type == PresenceType.available); // If this is an update, remove the existing one. // we'll add the new one back in, in the correct place. gen.LinkedListNode<Presence> n = Find(res); if (n != null) m_all.Remove(n); gen.LinkedListNode<Presence> inserted = new gen.LinkedListNode<Presence>(p); for (n = m_all.First; n != null; n = n.Next) { if (p < n.Value) { m_all.AddBefore(n, inserted); break; } } // This is the highest one. if (inserted.List == null) { m_all.AddLast(inserted); if (p.IntPriority >= 0) Primary(p, handler); } }