Handle roster pushs

This commit is contained in:
Florian Zeitz 2011-04-04 00:48:37 +02:00
parent a9443417bc
commit 5fd19a3d1f
3 changed files with 85 additions and 20 deletions

View file

@ -30,6 +30,7 @@
@class XMPPPresence;
@class XMPPAuthenticator;
@class XMPPRoster;
@class XMPPRosterItem;
#define XMPP_NS_BIND @"urn:ietf:params:xml:ns:xmpp-bind"
#define XMPP_NS_CLIENT @"jabber:client"
@ -51,6 +52,8 @@
- (void)connection: (XMPPConnection*)conn
wasBoundToJID: (XMPPJID*)jid;
- (void)connectionDidReceiveRoster: (XMPPConnection*)conn;
- (void)connection: (XMPPConnection*)conn
didReceiveRosterItem: (XMPPRosterItem*)rosterItem;
- (BOOL)connection: (XMPPConnection*)conn
didReceiveIQ: (XMPPIQ*)iq;
- (void)connection: (XMPPConnection*)conn

View file

@ -437,7 +437,8 @@
return;
}
if ([[iq ID] isEqual: rosterID]) {
if ([iq elementForName: @"query"
namespace: XMPP_NS_ROSTER]) {
[self XMPP_handleRoster: iq];
return;
}
@ -648,15 +649,16 @@
- (void)XMPP_handleRoster: (XMPPIQ*)iq
{
OFXMLElement *rosterElem;
OFEnumerator *enumerator;
OFXMLElement *elem;
assert([[iq type] isEqual: @"result"]);
OFString *subscription;
rosterElem = [iq elementForName: @"query"
namespace: XMPP_NS_ROSTER];
assert(rosterElem != nil);
if ([[iq ID] isEqual: rosterID]) {
OFEnumerator *enumerator;
assert([[iq type] isEqual: @"result"]);
enumerator = [[rosterElem children] objectEnumerator];
while ((elem = [enumerator nextObject]) != nil) {
@ -674,13 +676,21 @@
[[elem attributeForName: @"jid"] stringValue]]];
[rosterItem setName:
[[elem attributeForName: @"name"] stringValue]];
[rosterItem setSubscription:
[[elem attributeForName: @"subscription"] 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)
namespace: XMPP_NS_ROSTER]
objectEnumerator];
while ((groupElem = [groupEnumerator nextObject])
!= nil)
[groups addObject: [groupElem stringValue]];
if ([groups count] > 0)
@ -695,6 +705,52 @@
[rosterID release];
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];
}
}
- (XMPPJID*)JID

View file

@ -136,6 +136,12 @@ OF_APPLICATION_DELEGATE(AppDelegate)
[conn sendStanza: pres];
}
- (void)connection: (XMPPConnection*)conn
didReceiveRosterItem: (XMPPRosterItem*)rosterItem
{
of_log(@"Got roster push: %@", rosterItem);
}
- (BOOL)connection: (XMPPConnection*)conn
didReceiveIQ: (XMPPIQ*)iq
{