@@ -36,16 +36,32 @@ #import "XMPPConnection.h" #import "XMPPIQ.h" #import "XMPPJID.h" #import "XMPPMulticastDelegate.h" #import "namespaces.h" + +OF_ASSUME_NONNULL_BEGIN + +@interface XMPPRoster () +- (void)XMPP_updateRosterItem: (XMPPRosterItem *)rosterItem; +- (void)XMPP_handleInitialRosterForConnection: (XMPPConnection *)connection + IQ: (XMPPIQ *)IQ; +- (XMPPRosterItem *)XMPP_rosterItemWithXMLElement: (OFXMLElement *)element; +@end + +OF_ASSUME_NONNULL_END @implementation XMPPRoster @synthesize connection = _connection, dataStorage = _dataStorage; @synthesize rosterItems = _rosterItems; -- initWithConnection: (XMPPConnection*)connection +- init +{ + OF_INVALID_INIT_METHOD +} + +- initWithConnection: (XMPPConnection *)connection { self = [super init]; @try { _rosterItems = [[OFMutableDictionary alloc] init]; @@ -100,29 +116,29 @@ callbackTarget: self selector: @selector(XMPP_handleInitialRosterForConnection: IQ:)]; } -- (bool)connection: (XMPPConnection*)connection - didReceiveIQ: (XMPPIQ*)iq +- (bool)connection: (XMPPConnection *)connection + didReceiveIQ: (XMPPIQ *)IQ { OFXMLElement *rosterElement; OFXMLElement *element; XMPPRosterItem *rosterItem; OFString *origin; - rosterElement = [iq elementForName: @"query" + rosterElement = [IQ elementForName: @"query" namespace: XMPP_NS_ROSTER]; if (rosterElement == nil) return false; - if (![[iq type] isEqual: @"set"]) + if (![[IQ type] isEqual: @"set"]) return false; // Ensure the roster push has been sent by the server - origin = [[iq from] fullJID]; + origin = [[IQ from] fullJID]; if (origin != nil && ![origin isEqual: [[connection JID] bareJID]]) return false; element = [rosterElement elementForName: @"item" namespace: XMPP_NS_ROSTER]; @@ -144,21 +160,21 @@ [_dataStorage setStringValue: ver forPath: @"roster.ver"]; [_dataStorage save]; } - [connection sendStanza: [iq resultIQ]]; + [connection sendStanza: [IQ resultIQ]]; return true; } -- (void)addRosterItem: (XMPPRosterItem*)rosterItem +- (void)addRosterItem: (XMPPRosterItem *)rosterItem { [self updateRosterItem: rosterItem]; } -- (void)updateRosterItem: (XMPPRosterItem*)rosterItem +- (void)updateRosterItem: (XMPPRosterItem *)rosterItem { XMPPIQ *IQ = [XMPPIQ IQWithType: @"set" ID: [_connection generateStanzaID]]; OFXMLElement *query = [OFXMLElement elementWithName: @"query" namespace: XMPP_NS_ROSTER]; @@ -183,11 +199,11 @@ [IQ addChild: query]; [_connection sendStanza: IQ]; } -- (void)deleteRosterItem: (XMPPRosterItem*)rosterItem +- (void)deleteRosterItem: (XMPPRosterItem *)rosterItem { XMPPIQ *IQ = [XMPPIQ IQWithType: @"set" ID: [_connection generateStanzaID]]; OFXMLElement *query = [OFXMLElement elementWithName: @"query" namespace: XMPP_NS_ROSTER]; @@ -222,21 +238,11 @@ @throw [OFInvalidArgumentException exception]; _dataStorage = dataStorage; } -- (XMPPConnection*)connection -{ - return _connection; -} - -- (id )dataStorage -{ - return _dataStorage; -} - -- (void)XMPP_updateRosterItem: (XMPPRosterItem*)rosterItem +- (void)XMPP_updateRosterItem: (XMPPRosterItem *)rosterItem { if ([_connection supportsRosterVersioning]) { OFMutableDictionary *items = [[[_dataStorage dictionaryForPath: @"roster.items"] mutableCopy] autorelease]; @@ -272,11 +278,11 @@ forKey: [[rosterItem JID] bareJID]]; else [_rosterItems removeObjectForKey: [[rosterItem JID] bareJID]]; } -- (XMPPRosterItem*)XMPP_rosterItemWithXMLElement: (OFXMLElement*)element +- (XMPPRosterItem *)XMPP_rosterItemWithXMLElement: (OFXMLElement *)element { OFString *subscription; OFEnumerator *groupEnumerator; OFXMLElement *groupElement; OFMutableArray *groups = [OFMutableArray array]; @@ -308,19 +314,15 @@ [rosterItem setGroups: groups]; return rosterItem; } -- (void)XMPP_handleInitialRosterForConnection: (XMPPConnection*)connection - IQ: (XMPPIQ*)IQ -{ - OFXMLElement *rosterElement; - OFEnumerator *enumerator; - OFXMLElement *element; - - rosterElement = [IQ elementForName: @"query" - namespace: XMPP_NS_ROSTER]; +- (void)XMPP_handleInitialRosterForConnection: (XMPPConnection *)connection + IQ: (XMPPIQ *)IQ +{ + OFXMLElement *rosterElement = [IQ elementForName: @"query" + namespace: XMPP_NS_ROSTER]; if ([connection supportsRosterVersioning]) { if (rosterElement == nil) { OFDictionary *items = [_dataStorage dictionaryForPath: @"roster.items"]; @@ -348,12 +350,11 @@ } else [_dataStorage setDictionary: nil forPath: @"roster.items"]; } - enumerator = [[rosterElement children] objectEnumerator]; - while ((element = [enumerator nextObject]) != nil) { + for (OFXMLElement *element in [rosterElement children]) { OFAutoreleasePool *pool; XMPPRosterItem *rosterItem; if (![[element name] isEqual: @"item"] || ![[element namespace] isEqual: XMPP_NS_ROSTER])