Move all roster handling code to XMPPRoster.

This commit is contained in:
Jonathan Schleifer 2011-04-25 19:48:30 +02:00
parent 82982768bc
commit f651384d81
5 changed files with 121 additions and 116 deletions

View file

@ -84,7 +84,7 @@
XMPPAuthenticator *authModule; XMPPAuthenticator *authModule;
BOOL needsSession; BOOL needsSession;
unsigned int lastID; unsigned int lastID;
OFString *bindID, *sessionID, *rosterID; OFString *bindID, *sessionID;
XMPPRoster *roster; XMPPRoster *roster;
} }
@ -143,11 +143,6 @@
*/ */
- (OFString*)generateStanzaID; - (OFString*)generateStanzaID;
/**
* Requests the roster.
*/
- (void)requestRoster;
- (void)setUsername: (OFString*)username; - (void)setUsername: (OFString*)username;
- (OFString*)username; - (OFString*)username;
- (void)setPassword: (OFString*)password; - (void)setPassword: (OFString*)password;
@ -177,7 +172,6 @@
- (void)XMPP_handleResourceBind: (XMPPIQ*)iq; - (void)XMPP_handleResourceBind: (XMPPIQ*)iq;
- (void)XMPP_sendSession; - (void)XMPP_sendSession;
- (void)XMPP_handleSession: (XMPPIQ*)iq; - (void)XMPP_handleSession: (XMPPIQ*)iq;
- (void)XMPP_handleRoster: (XMPPIQ*)iq;
@end @end
@interface OFObject (XMPPConnectionDelegate) <XMPPConnectionDelegate> @interface OFObject (XMPPConnectionDelegate) <XMPPConnectionDelegate>

View file

@ -77,7 +77,6 @@
[authModule release]; [authModule release];
[bindID release]; [bindID release];
[sessionID release]; [sessionID release];
[rosterID release];
[roster release]; [roster release];
[super dealloc]; [super dealloc];
@ -231,15 +230,11 @@
[parser parseBuffer: buffer [parser parseBuffer: buffer
withLength: length]; withLength: length];
if (oldParser != nil) { [oldParser release];
[oldParser release]; [oldElementBuilder release];
oldParser = nil;
}
if (oldElementBuilder != nil) { oldParser = nil;
[oldElementBuilder release]; oldElementBuilder = nil;
oldElementBuilder = nil;
}
} }
- (OFTCPSocket*)socket - (OFTCPSocket*)socket
@ -568,10 +563,9 @@
} }
if ([iq elementForName: @"query" if ([iq elementForName: @"query"
namespace: XMPP_NS_ROSTER]) { namespace: XMPP_NS_ROSTER])
[self XMPP_handleRoster: iq]; if ([roster handleIQ: iq])
return; return;
}
if ([delegate respondsToSelector: @selector(connection:didReceiveIQ:)]) if ([delegate respondsToSelector: @selector(connection:didReceiveIQ:)])
handled = [delegate connection: self handled = [delegate connection: self
@ -762,101 +756,6 @@
sessionID = nil; sessionID = nil;
} }
- (void)requestRoster
{
XMPPIQ *iq;
if (rosterID != nil)
assert(0);
rosterID = [[self generateStanzaID] retain];
iq = [XMPPIQ IQWithType: @"get"
ID: rosterID];
[iq addChild: [OFXMLElement elementWithName: @"query"
namespace: XMPP_NS_ROSTER]];
[self sendStanza: iq];
}
- (void)XMPP_handleRoster: (XMPPIQ*)iq
{
OFXMLElement *rosterElement;
OFXMLElement *element;
XMPPRosterItem *rosterItem = nil;
OFString *subscription;
OFEnumerator *enumerator;
BOOL isPush = ![[iq ID] isEqual: rosterID];
rosterElement = [iq elementForName: @"query"
namespace: XMPP_NS_ROSTER];
if (isPush)
assert([[iq type] isEqual: @"set"]);
else
assert([[iq type] isEqual: @"result"]);
enumerator = [[rosterElement children] objectEnumerator];
while ((element = [enumerator nextObject]) != nil) {
OFMutableArray *groups = [OFMutableArray array];
OFEnumerator *groupEnumerator;
OFXMLElement *groupElement;
if (![[element name] isEqual: @"item"] ||
![[element namespace] isEqual: XMPP_NS_ROSTER])
continue;
rosterItem = [XMPPRosterItem rosterItem];
[rosterItem setJID: [XMPPJID JIDWithString:
[[element attributeForName: @"jid"] stringValue]]];
[rosterItem setName:
[[element attributeForName: @"name"] stringValue]];
subscription = [[element attributeForName:
@"subscription"] stringValue];
if (![subscription isEqual: @"none"] &&
![subscription isEqual: @"to"] &&
![subscription isEqual: @"from"] &&
![subscription isEqual: @"both"] &&
(![subscription isEqual: @"remove"] || !isPush))
subscription = @"none";
[rosterItem setSubscription: subscription];
groupEnumerator = [[element
elementsForName: @"group"
namespace: XMPP_NS_ROSTER] objectEnumerator];
while ((groupElement = [groupEnumerator nextObject]) != nil)
[groups addObject: [groupElement stringValue]];
if ([groups count] > 0)
[rosterItem setGroups: groups];
if ([subscription isEqual: @"remove"])
[roster XMPP_deleteRosterItem: rosterItem];
else
[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:
@selector(connectionDidReceiveRoster:)])
[delegate connectionDidReceiveRoster: self];
[rosterID release];
rosterID = nil;
}
}
- (XMPPJID*)JID - (XMPPJID*)JID
{ {
return [[JID copy] autorelease]; return [[JID copy] autorelease];

View file

@ -24,11 +24,13 @@
@class XMPPConnection; @class XMPPConnection;
@class XMPPRosterItem; @class XMPPRosterItem;
@class XMPPIQ;
@interface XMPPRoster: OFObject @interface XMPPRoster: OFObject
{ {
XMPPConnection *connection; XMPPConnection *connection;
OFMutableDictionary *rosterItems; OFMutableDictionary *rosterItems;
OFString *rosterID;
} }
- initWithConnection: (XMPPConnection*)conn; - initWithConnection: (XMPPConnection*)conn;
@ -36,6 +38,8 @@
- (void)XMPP_updateRosterItem: (XMPPRosterItem*)rosterItem; - (void)XMPP_updateRosterItem: (XMPPRosterItem*)rosterItem;
- (void)XMPP_deleteRosterItem: (XMPPRosterItem*)rosterItem; - (void)XMPP_deleteRosterItem: (XMPPRosterItem*)rosterItem;
- (OFDictionary*)rosterItems; - (OFDictionary*)rosterItems;
- (BOOL)handleIQ: (XMPPIQ*)iq;
- (void)requestRoster;
- (void)addRosterItem: (XMPPRosterItem*)rosterItem; - (void)addRosterItem: (XMPPRosterItem*)rosterItem;
- (void)updateRosterItem: (XMPPRosterItem*)rosterItem; - (void)updateRosterItem: (XMPPRosterItem*)rosterItem;
- (void)deleteRosterItem: (XMPPRosterItem*)rosterItem; - (void)deleteRosterItem: (XMPPRosterItem*)rosterItem;

View file

@ -20,6 +20,8 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
*/ */
#include <assert.h>
#import "XMPPRoster.h" #import "XMPPRoster.h"
#import "XMPPRosterItem.h" #import "XMPPRosterItem.h"
#import "XMPPConnection.h" #import "XMPPConnection.h"
@ -45,6 +47,8 @@
- (void)dealloc - (void)dealloc
{ {
[connection release]; [connection release];
[rosterItems release];
[rosterID release];
[super dealloc]; [super dealloc];
} }
@ -70,6 +74,110 @@
return [[rosterItems copy] autorelease]; return [[rosterItems copy] autorelease];
} }
- (void)requestRoster
{
XMPPIQ *iq;
if (rosterID != nil)
assert(0);
rosterID = [[connection generateStanzaID] retain];
iq = [XMPPIQ IQWithType: @"get"
ID: rosterID];
[iq addChild: [OFXMLElement elementWithName: @"query"
namespace: XMPP_NS_ROSTER]];
[connection sendStanza: iq];
}
- (BOOL)handleIQ: (XMPPIQ*)iq
{
OFXMLElement *rosterElement;
OFXMLElement *element;
XMPPRosterItem *rosterItem = nil;
OFString *subscription;
OFEnumerator *enumerator;
BOOL isPush = ![[iq ID] isEqual: rosterID];
rosterElement = [iq elementForName: @"query"
namespace: XMPP_NS_ROSTER];
if (rosterElement == nil)
return NO;
if (isPush) {
if (![[iq type] isEqual: @"set"])
return NO;
} else {
if (![[iq type] isEqual: @"result"])
return NO;
}
enumerator = [[rosterElement children] objectEnumerator];
while ((element = [enumerator nextObject]) != nil) {
OFMutableArray *groups = [OFMutableArray array];
OFEnumerator *groupEnumerator;
OFXMLElement *groupElement;
if (![[element name] isEqual: @"item"] ||
![[element namespace] isEqual: XMPP_NS_ROSTER])
continue;
rosterItem = [XMPPRosterItem rosterItem];
[rosterItem setJID: [XMPPJID JIDWithString:
[[element attributeForName: @"jid"] stringValue]]];
[rosterItem setName:
[[element attributeForName: @"name"] stringValue]];
subscription = [[element attributeForName:
@"subscription"] stringValue];
if (![subscription isEqual: @"none"] &&
![subscription isEqual: @"to"] &&
![subscription isEqual: @"from"] &&
![subscription isEqual: @"both"] &&
(![subscription isEqual: @"remove"] || !isPush))
subscription = @"none";
[rosterItem setSubscription: subscription];
groupEnumerator = [[element
elementsForName: @"group"
namespace: XMPP_NS_ROSTER] objectEnumerator];
while ((groupElement = [groupEnumerator nextObject]) != nil)
[groups addObject: [groupElement stringValue]];
if ([groups count] > 0)
[rosterItem setGroups: groups];
if ([subscription isEqual: @"remove"])
[self XMPP_deleteRosterItem: rosterItem];
else
[self XMPP_addRosterItem: rosterItem];
if (isPush && [[connection delegate] respondsToSelector:
@selector(connection:didReceiveRosterItem:)])
[[connection delegate] connection: connection
didReceiveRosterItem: rosterItem];
}
if (isPush) {
XMPPIQ *response = [XMPPIQ IQWithType: @"result"
ID: [iq ID]];
[response setTo: [iq from]];
[connection sendStanza: response];
} else {
if ([[connection delegate] respondsToSelector:
@selector(connectionDidReceiveRoster:)])
[[connection delegate]
connectionDidReceiveRoster: connection];
[rosterID release];
rosterID = nil;
}
return YES;
}
- (void)addRosterItem: (XMPPRosterItem*)rosterItem - (void)addRosterItem: (XMPPRosterItem*)rosterItem
{ {
[self updateRosterItem: rosterItem]; [self updateRosterItem: rosterItem];

View file

@ -120,7 +120,7 @@ OF_APPLICATION_DELEGATE(AppDelegate)
{ {
of_log(@"Bound to JID: %@", [jid fullJID]); of_log(@"Bound to JID: %@", [jid fullJID]);
[conn requestRoster]; [[conn roster] requestRoster];
} }
- (void)connectionDidReceiveRoster: (XMPPConnection*)conn - (void)connectionDidReceiveRoster: (XMPPConnection*)conn