@@ -34,10 +34,11 @@ #import "XMPPStanza.h" #import "XMPPJID.h" #import "XMPPIQ.h" #import "XMPPMessage.h" #import "XMPPPresence.h" +#import "XMPPRosterItem.h" #import "XMPPExceptions.h" #define NS_BIND @"urn:ietf:params:xml:ns:xmpp-bind" #define NS_CLIENT @"jabber:client" #define NS_ROSTER @"jabber:iq:roster" @@ -629,32 +630,41 @@ if (![rosterElem.name isEqual: @"query"] || ![rosterElem.namespace isEqual: NS_ROSTER]) assert(0); for (OFXMLElement *elem in rosterElem.children) { - OFArray *groups; + XMPPRosterItem *rosterItem; + OFMutableArray *groups = [OFMutableArray array]; if (![elem.name isEqual: @"item"] || ![elem.ns isEqual: NS_ROSTER]) continue; - groups = [elem elementsForName: @"group" - namespace: NS_ROSTER]; + rosterItem = [XMPPRosterItem rosterItem]; + rosterItem.JID = [XMPPJID JIDWithString: + [rosterElem attributeForName: @"jid"].stringValue]; + rosterItem.name = + [rosterElem attributeForName: @"name"].stringValue; + rosterItem.subscription = + [rosterElem attributeForName: @"subscription"].stringValue; - for (OFXMLElement *groupElem in groups) { - OFString *group = groupElem.stringValue; + for (OFXMLElement *groupElem in + [elem elementsForName: @"group" + namespace: NS_ROSTER]) { OFMutableArray *rosterGroup = - [roster objectForKey: group]; + [roster objectForKey: rosterElem.stringValue]; if (rosterGroup == nil) { rosterGroup = [OFMutableArray array]; [roster setObject: rosterGroup - forKey: group]; + forKey: rosterElem.stringValue]; } - [rosterGroup addObject: elem]; + [rosterGroup addObject: rosterItem]; } + + rosterItem.groups = groups; if (groups.count == 0) { OFMutableArray *rosterGroup = [roster objectForKey: @""]; @@ -662,11 +672,11 @@ rosterGroup = [OFMutableArray array]; [roster setObject: rosterGroup forKey: @""]; } - [rosterGroup addObject: elem]; + [rosterGroup addObject: rosterItem]; } } if ([delegate respondsToSelector: @selector(connectionDidReceiveRoster:)])