private IQ SetRoster(XmppStream stream, IQ iq, XmppHandlerContext context) { var answer = new IQ(IqType.result); answer.Id = iq.Id; answer.To = iq.From; answer.From = iq.To; iq.Id = UniqueId.CreateNewId(); var roster = (Roster)iq.Query; UserRosterItem item = null; try { var rosterItems = roster.GetRoster(); if (rosterItems.Length != 1) throw new JabberException(ErrorCode.BadRequest); var rosterItem = rosterItems[0]; item = UserRosterItem.FromRosterItem(rosterItem); if (rosterItem.Subscription == SubscriptionType.remove) { context.StorageManager.RosterStorage.RemoveRosterItem(iq.From, item.Jid); //Send presences var unsubscribe = new Presence() { Type = PresenceType.unsubscribe, To = item.Jid, From = iq.From }; var unsubscribed = new Presence() { Type = PresenceType.unsubscribed, To = item.Jid, From = iq.From }; var unavailable = new Presence() { Type = PresenceType.unavailable, To = item.Jid, From = iq.From }; bool sended = false; foreach (var session in context.SessionManager.GetBareJidSessions(item.Jid)) { if (session.RosterRequested) { context.Sender.SendTo(session, unsubscribe); context.Sender.SendTo(session, unsubscribed); sended = true; } context.Sender.SendTo(session, unavailable); } if (!sended) { context.StorageManager.OfflineStorage.SaveOfflinePresence(unsubscribe); context.StorageManager.OfflineStorage.SaveOfflinePresence(unsubscribed); } } else { item = context.StorageManager.RosterStorage.SaveRosterItem(iq.From, item); roster.RemoveAllChildNodes(); roster.AddRosterItem(item.ToRosterItem()); } //send all available user's resources context.Sender.Broadcast(context.SessionManager.GetBareJidSessions(iq.From), iq); } catch (System.Exception) { roster.RemoveAllChildNodes(); item = context.StorageManager.RosterStorage.GetRosterItem(iq.From, item.Jid); if (item != null) { roster.AddRosterItem(item.ToRosterItem()); context.Sender.Broadcast(context.SessionManager.GetBareJidSessions(iq.From), iq); } throw; } return answer; }