Clean up roster handling

This commit is contained in:
Florian Zeitz 2011-04-04 01:53:00 +02:00
parent 5fd19a3d1f
commit 91b2a0b119
3 changed files with 49 additions and 71 deletions

View file

@ -52,14 +52,14 @@
- (void)connection: (XMPPConnection*)conn - (void)connection: (XMPPConnection*)conn
wasBoundToJID: (XMPPJID*)jid; wasBoundToJID: (XMPPJID*)jid;
- (void)connectionDidReceiveRoster: (XMPPConnection*)conn; - (void)connectionDidReceiveRoster: (XMPPConnection*)conn;
- (void)connection: (XMPPConnection*)conn
didReceiveRosterItem: (XMPPRosterItem*)rosterItem;
- (BOOL)connection: (XMPPConnection*)conn - (BOOL)connection: (XMPPConnection*)conn
didReceiveIQ: (XMPPIQ*)iq; didReceiveIQ: (XMPPIQ*)iq;
- (void)connection: (XMPPConnection*)conn - (void)connection: (XMPPConnection*)conn
didReceivePresence: (XMPPPresence*)pres; didReceivePresence: (XMPPPresence*)pres;
- (void)connection: (XMPPConnection*)conn - (void)connection: (XMPPConnection*)conn
didReceiveMessage: (XMPPMessage*)msg; didReceiveMessage: (XMPPMessage*)msg;
- (void)connection: (XMPPConnection*)conn
didReceiveRosterItem: (XMPPRosterItem*)rosterItem;
- (void)connectionWasClosed: (XMPPConnection*)conn; - (void)connectionWasClosed: (XMPPConnection*)conn;
- (void)connectionWillUpgradeToTLS: (XMPPConnection*)conn; - (void)connectionWillUpgradeToTLS: (XMPPConnection*)conn;
- (void)connectionDidUpgradeToTLS: (XMPPConnection*)conn; - (void)connectionDidUpgradeToTLS: (XMPPConnection*)conn;

View file

@ -650,71 +650,29 @@
{ {
OFXMLElement *rosterElem; OFXMLElement *rosterElem;
OFXMLElement *elem; OFXMLElement *elem;
XMPPRosterItem *rosterItem = nil;
OFString *subscription; OFString *subscription;
OFEnumerator *enumerator;
BOOL isPush = ![[iq ID] isEqual: rosterID];
rosterElem = [iq elementForName: @"query" rosterElem = [iq elementForName: @"query"
namespace: XMPP_NS_ROSTER]; namespace: XMPP_NS_ROSTER];
if ([[iq ID] isEqual: rosterID]) { if (isPush)
OFEnumerator *enumerator; assert([[iq type] isEqual: @"set"]);
else
assert([[iq type] isEqual: @"result"]); assert([[iq type] isEqual: @"result"]);
enumerator = [[rosterElem children] objectEnumerator]; enumerator = [[rosterElem children] objectEnumerator];
while ((elem = [enumerator nextObject]) != nil) { while ((elem = [enumerator nextObject]) != nil) {
XMPPRosterItem *rosterItem;
OFMutableArray *groups = [OFMutableArray array];
OFEnumerator *groupEnumerator;
OFXMLElement *groupElem;
if (![[elem name] isEqual: @"item"] ||
![[elem namespace] isEqual: XMPP_NS_ROSTER])
continue;
rosterItem = [XMPPRosterItem rosterItem];
[rosterItem setJID: [XMPPJID JIDWithString:
[[elem attributeForName: @"jid"] stringValue]]];
[rosterItem setName:
[[elem attributeForName: @"name"] stringValue]];
subscription = [[elem attributeForName:
@"subscription"] stringValue];
if ([subscription isEqual: @"none"] ||
[subscription isEqual: @"to"] ||
[subscription isEqual: @"from"] ||
[subscription isEqual: @"both"])
[rosterItem setSubscription: subscription];
groupEnumerator =
[[elem elementsForName: @"group"
namespace: XMPP_NS_ROSTER]
objectEnumerator];
while ((groupElem = [groupEnumerator nextObject])
!= nil)
[groups addObject: [groupElem stringValue]];
if ([groups count] > 0)
[rosterItem setGroups: groups];
[roster XMPP_addRosterItem: rosterItem];
}
if ([delegate respondsToSelector:
@selector(connectionDidReceiveRoster:)])
[delegate connectionDidReceiveRoster: self];
[rosterID release];
rosterID = nil;
} else {
XMPPRosterItem *rosterItem;
OFMutableArray *groups = [OFMutableArray array]; OFMutableArray *groups = [OFMutableArray array];
OFEnumerator *groupEnumerator; OFEnumerator *groupEnumerator;
OFXMLElement *groupElem; OFXMLElement *groupElem;
XMPPIQ *response;
assert([[iq type] isEqual: @"set"]); if (![[elem name] isEqual: @"item"] ||
![[elem namespace] isEqual: XMPP_NS_ROSTER])
continue;
elem = [[rosterElem children] firstObject];
rosterItem = [XMPPRosterItem rosterItem]; rosterItem = [XMPPRosterItem rosterItem];
[rosterItem setJID: [XMPPJID JIDWithString: [rosterItem setJID: [XMPPJID JIDWithString:
[[elem attributeForName: @"jid"] stringValue]]]; [[elem attributeForName: @"jid"] stringValue]]];
@ -723,34 +681,49 @@
subscription = [[elem attributeForName: subscription = [[elem attributeForName:
@"subscription"] stringValue]; @"subscription"] stringValue];
if ([subscription isEqual: @"none"] || if (![subscription isEqual: @"none"] &&
[subscription isEqual: @"to"] || ![subscription isEqual: @"to"] &&
[subscription isEqual: @"from"] || ![subscription isEqual: @"from"] &&
[subscription isEqual: @"both"] || ![subscription isEqual: @"both"] &&
[subscription isEqual: @"remove"]) (![subscription isEqual: @"remove"] || !isPush))
[rosterItem setSubscription: subscription]; subscription = @"none";
[rosterItem setSubscription: subscription];
groupEnumerator = groupEnumerator =
[[elem elementsForName: @"group" [[elem elementsForName: @"group"
namespace: XMPP_NS_ROSTER] objectEnumerator]; namespace: XMPP_NS_ROSTER]
while ((groupElem = [groupEnumerator nextObject]) != nil) objectEnumerator];
while ((groupElem = [groupEnumerator nextObject])
!= nil)
[groups addObject: [groupElem stringValue]]; [groups addObject: [groupElem stringValue]];
if ([groups count] > 0) if ([groups count] > 0)
[rosterItem setGroups: groups]; [rosterItem setGroups: groups];
[roster XMPP_updateRosterItem: rosterItem]; if ([subscription isEqual: @"remove"])
[roster XMPP_deleteRosterItem: rosterItem];
else
[roster XMPP_addRosterItem: rosterItem];
response = [XMPPIQ IQWithType: @"result" if (isPush && [delegate respondsToSelector:
ID: [iq ID]];
[response setTo: [iq from]];
[self sendStanza: response];
if ([delegate respondsToSelector:
@selector(connection:didReceiveRosterItem:)]) @selector(connection:didReceiveRosterItem:)])
[delegate connection:self [delegate connection:self
didReceiveRosterItem: rosterItem]; didReceiveRosterItem: rosterItem];
} }
if (isPush) {
XMPPIQ *response = [XMPPIQ IQWithType: @"result"
ID: [iq ID]];
[response setTo: [iq from]];
[self sendStanza: response];
} else {
if ([delegate respondsToSelector:
@selector(connectionDidReceiveRoster:)])
[delegate connectionDidReceiveRoster: self];
[rosterID release];
rosterID = nil;
}
} }
- (XMPPJID*)JID - (XMPPJID*)JID
@ -816,6 +789,11 @@
{ {
} }
- (void)connection: (XMPPConnection*)conn
didReceiveRosterItem: (XMPPRosterItem*)rosterItem
{
}
- (void)connectionWasClosed: (XMPPConnection*)conn - (void)connectionWasClosed: (XMPPConnection*)conn
{ {
} }

View file

@ -123,7 +123,7 @@ OF_APPLICATION_DELEGATE(AppDelegate)
[conn requestRoster]; [conn requestRoster];
} }
- (void)connectionDidReceiveRoster :(XMPPConnection*)conn - (void)connectionDidReceiveRoster: (XMPPConnection*)conn
{ {
XMPPPresence *pres; XMPPPresence *pres;