Handle roster pushs
This commit is contained in:
parent
a9443417bc
commit
5fd19a3d1f
3 changed files with 85 additions and 20 deletions
|
@ -30,6 +30,7 @@
|
||||||
@class XMPPPresence;
|
@class XMPPPresence;
|
||||||
@class XMPPAuthenticator;
|
@class XMPPAuthenticator;
|
||||||
@class XMPPRoster;
|
@class XMPPRoster;
|
||||||
|
@class XMPPRosterItem;
|
||||||
|
|
||||||
#define XMPP_NS_BIND @"urn:ietf:params:xml:ns:xmpp-bind"
|
#define XMPP_NS_BIND @"urn:ietf:params:xml:ns:xmpp-bind"
|
||||||
#define XMPP_NS_CLIENT @"jabber:client"
|
#define XMPP_NS_CLIENT @"jabber:client"
|
||||||
|
@ -51,6 +52,8 @@
|
||||||
- (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
|
||||||
|
|
|
@ -437,7 +437,8 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ([[iq ID] isEqual: rosterID]) {
|
if ([iq elementForName: @"query"
|
||||||
|
namespace: XMPP_NS_ROSTER]) {
|
||||||
[self XMPP_handleRoster: iq];
|
[self XMPP_handleRoster: iq];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -648,15 +649,16 @@
|
||||||
- (void)XMPP_handleRoster: (XMPPIQ*)iq
|
- (void)XMPP_handleRoster: (XMPPIQ*)iq
|
||||||
{
|
{
|
||||||
OFXMLElement *rosterElem;
|
OFXMLElement *rosterElem;
|
||||||
OFEnumerator *enumerator;
|
|
||||||
OFXMLElement *elem;
|
OFXMLElement *elem;
|
||||||
|
OFString *subscription;
|
||||||
assert([[iq type] isEqual: @"result"]);
|
|
||||||
|
|
||||||
rosterElem = [iq elementForName: @"query"
|
rosterElem = [iq elementForName: @"query"
|
||||||
namespace: XMPP_NS_ROSTER];
|
namespace: XMPP_NS_ROSTER];
|
||||||
|
|
||||||
assert(rosterElem != nil);
|
if ([[iq ID] isEqual: rosterID]) {
|
||||||
|
OFEnumerator *enumerator;
|
||||||
|
|
||||||
|
assert([[iq type] isEqual: @"result"]);
|
||||||
|
|
||||||
enumerator = [[rosterElem children] objectEnumerator];
|
enumerator = [[rosterElem children] objectEnumerator];
|
||||||
while ((elem = [enumerator nextObject]) != nil) {
|
while ((elem = [enumerator nextObject]) != nil) {
|
||||||
|
@ -674,13 +676,21 @@
|
||||||
[[elem attributeForName: @"jid"] stringValue]]];
|
[[elem attributeForName: @"jid"] stringValue]]];
|
||||||
[rosterItem setName:
|
[rosterItem setName:
|
||||||
[[elem attributeForName: @"name"] stringValue]];
|
[[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 =
|
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)
|
||||||
|
@ -695,6 +705,52 @@
|
||||||
|
|
||||||
[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];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (XMPPJID*)JID
|
- (XMPPJID*)JID
|
||||||
|
|
|
@ -136,6 +136,12 @@ OF_APPLICATION_DELEGATE(AppDelegate)
|
||||||
[conn sendStanza: pres];
|
[conn sendStanza: pres];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)connection: (XMPPConnection*)conn
|
||||||
|
didReceiveRosterItem: (XMPPRosterItem*)rosterItem
|
||||||
|
{
|
||||||
|
of_log(@"Got roster push: %@", rosterItem);
|
||||||
|
}
|
||||||
|
|
||||||
- (BOOL)connection: (XMPPConnection*)conn
|
- (BOOL)connection: (XMPPConnection*)conn
|
||||||
didReceiveIQ: (XMPPIQ*)iq
|
didReceiveIQ: (XMPPIQ*)iq
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue