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,19 +650,21 @@
{ {
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]; OFMutableArray *groups = [OFMutableArray array];
OFEnumerator *groupEnumerator; OFEnumerator *groupEnumerator;
OFXMLElement *groupElem; OFXMLElement *groupElem;
@ -679,10 +681,12 @@
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"] || !isPush))
subscription = @"none";
[rosterItem setSubscription: subscription]; [rosterItem setSubscription: subscription];
groupEnumerator = groupEnumerator =
@ -696,60 +700,29 @@
if ([groups count] > 0) if ([groups count] > 0)
[rosterItem setGroups: groups]; [rosterItem setGroups: groups];
if ([subscription isEqual: @"remove"])
[roster XMPP_deleteRosterItem: rosterItem];
else
[roster XMPP_addRosterItem: rosterItem]; [roster XMPP_addRosterItem: rosterItem];
if (isPush && [delegate respondsToSelector:
@selector(connection:didReceiveRosterItem:)])
[delegate connection:self
didReceiveRosterItem: rosterItem];
} }
if (isPush) {
XMPPIQ *response = [XMPPIQ IQWithType: @"result"
ID: [iq ID]];
[response setTo: [iq from]];
[self sendStanza: response];
} else {
if ([delegate respondsToSelector: if ([delegate respondsToSelector:
@selector(connectionDidReceiveRoster:)]) @selector(connectionDidReceiveRoster:)])
[delegate connectionDidReceiveRoster: self]; [delegate connectionDidReceiveRoster: self];
[rosterID release]; [rosterID release];
rosterID = nil; rosterID = nil;
} else {
XMPPRosterItem *rosterItem;
OFMutableArray *groups = [OFMutableArray array];
OFEnumerator *groupEnumerator;
OFXMLElement *groupElem;
XMPPIQ *response;
assert([[iq type] isEqual: @"set"]);
elem = [[rosterElem children] firstObject];
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"] ||
[subscription isEqual: @"remove"])
[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_updateRosterItem: rosterItem];
response = [XMPPIQ IQWithType: @"result"
ID: [iq ID]];
[response setTo: [iq from]];
[self sendStanza: response];
if ([delegate respondsToSelector:
@selector(connection:didReceiveRosterItem:)])
[delegate connection:self
didReceiveRosterItem: rosterItem];
} }
} }
@ -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;