From d1dc83933342a6bf6c45e271365931fa1b78b182 Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Mon, 30 Jan 2012 18:45:43 +0100 Subject: [PATCH] Make use of multicast delegates in XMPPRoster. --- src/XMPPConnection.m | 22 +++++++++++----------- src/XMPPMulticastDelegate.h | 12 ++++++------ src/XMPPMulticastDelegate.m | 14 +++++++------- src/XMPPRoster.h | 11 ++++------- src/XMPPRoster.m | 22 ++++++++++++---------- tests/test.m | 2 +- 6 files changed, 41 insertions(+), 42 deletions(-) diff --git a/src/XMPPConnection.m b/src/XMPPConnection.m index 6a30a69..c1471c4 100644 --- a/src/XMPPConnection.m +++ b/src/XMPPConnection.m @@ -306,7 +306,7 @@ { if (length < 1) { [delegates broadcastSelector: @selector(connectionWasClosed:) - forConnection: self]; + withObject: self]; return; } @@ -376,7 +376,7 @@ - (void)sendStanza: (OFXMLElement*)element { [delegates broadcastSelector: @selector(connection:didSendElement:) - forConnection: self + withObject: self withObject: element]; [sock writeString: [element XMLString]]; @@ -486,7 +486,7 @@ forNamespace: XMPP_NS_STREAM]; [delegates broadcastSelector: @selector(connection:didReceiveElement:) - forConnection: self + withObject: self withObject: element]; if ([[element namespace] isEqual: XMPP_NS_CLIENT]) @@ -688,7 +688,7 @@ [delegates broadcastSelector: @selector( connectionWillUpgradeToTLS:) - forConnection: self]; + withObject: self]; newSock = [[SSLSocket alloc] initWithSocket: sock privateKeyFile: privateKeyFile @@ -700,7 +700,7 @@ [delegates broadcastSelector: @selector( connectionDidUpgradeToTLS:) - forConnection: self]; + withObject: self]; /* Stream restart */ [self XMPP_startStream]; @@ -744,7 +744,7 @@ [delegates broadcastSelector: @selector( connectionWWasAuthenticated:) - forConnection: self]; + withObject: self]; /* Stream restart */ [self XMPP_startStream]; @@ -777,7 +777,7 @@ handled = [delegates broadcastSelector: @selector( connection:didReceiveIQ:) - forConnection: self + withObject: self withObject: iq]; if (!handled && ![[iq type] isEqual: @"error"] && @@ -790,14 +790,14 @@ - (void)XMPP_handleMessage: (XMPPMessage*)message { [delegates broadcastSelector: @selector(connection:didReceiveMessage:) - forConnection: self + withObject: self withObject: message]; } - (void)XMPP_handlePresence: (XMPPPresence*)presence { [delegates broadcastSelector: @selector(connection:didReceivePresence:) - forConnection: self + withObject: self withObject: presence]; } @@ -968,7 +968,7 @@ } [delegates broadcastSelector: @selector(connection:wasBoundToJID:) - forConnection: self + withObject: self withObject: JID]; } @@ -991,7 +991,7 @@ assert(0); [delegates broadcastSelector: @selector(connection:wasBoundToJID:) - forConnection: self + withObject: self withObject: JID]; } diff --git a/src/XMPPMulticastDelegate.h b/src/XMPPMulticastDelegate.h index c59c107..c3abb90 100644 --- a/src/XMPPMulticastDelegate.h +++ b/src/XMPPMulticastDelegate.h @@ -20,7 +20,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#import "XMPPConnection.h" +#import @class OFDataArray; @@ -29,11 +29,11 @@ OFDataArray *delegates; } -- (void)addDelegate: (id )delegate; -- (void)removeDelegate: (id )delegate; +- (void)addDelegate: (id)delegate; +- (void)removeDelegate: (id)delegate; - (BOOL)broadcastSelector: (SEL)selector - forConnection: (XMPPConnection*)connection; -- (BOOL)broadcastSelector: (SEL)selector - forConnection: (XMPPConnection*)connection withObject: (id)object; +- (BOOL)broadcastSelector: (SEL)selector + withObject: (id)object1 + withObject: (id)object2; @end diff --git a/src/XMPPMulticastDelegate.m b/src/XMPPMulticastDelegate.m index 50577a6..b7a8a84 100644 --- a/src/XMPPMulticastDelegate.m +++ b/src/XMPPMulticastDelegate.m @@ -50,12 +50,12 @@ [super dealloc]; } -- (void)addDelegate: (id )delegate +- (void)addDelegate: (id)delegate { [delegates addItem: &delegate]; } -- (void)removeDelegate: (id)delegate +- (void)removeDelegate: (id)delegate { id *cArray = [delegates cArray]; size_t i, count = [delegates count]; @@ -69,7 +69,7 @@ } - (BOOL)broadcastSelector: (SEL)selector - forConnection: (XMPPConnection*)connection + withObject: (id)object { id *cArray = [delegates cArray]; size_t i, count = [delegates count]; @@ -82,15 +82,15 @@ BOOL (*imp)(id, SEL, id) = (BOOL(*)(id, SEL, id)) [cArray[i] methodForSelector: selector]; - handled |= imp(cArray[i], selector, connection); + handled |= imp(cArray[i], selector, object); } return handled; } - (BOOL)broadcastSelector: (SEL)selector - forConnection: (XMPPConnection*)connection - withObject: (id)object + withObject: (id)object1 + withObject: (id)object2 { id *cArray = [delegates cArray]; size_t i, count = [delegates count]; @@ -103,7 +103,7 @@ BOOL (*imp)(id, SEL, id, id) = (BOOL(*)(id, SEL, id, id)) [cArray[i] methodForSelector: selector]; - handled |= imp(cArray[i], selector, connection, object); + handled |= imp(cArray[i], selector, object1, object2); } return handled; diff --git a/src/XMPPRoster.h b/src/XMPPRoster.h index 2e715da..96c9933 100644 --- a/src/XMPPRoster.h +++ b/src/XMPPRoster.h @@ -28,6 +28,7 @@ @class XMPPRosterItem; @class XMPPIQ; @class XMPPRoster; +@class XMPPMulticastDelegate; @protocol XMPPRosterDelegate #ifndef XMPP_ROSTER_M @@ -49,21 +50,17 @@ { XMPPConnection *connection; OFMutableDictionary *rosterItems; - id delegate; + XMPPMulticastDelegate *delegates; } -#ifdef OF_HAVE_PROPERTIES -@property (assign) id delegate; -#endif - - initWithConnection: (XMPPConnection*)conn; - (OFDictionary*)rosterItems; - (void)requestRoster; - (void)addRosterItem: (XMPPRosterItem*)rosterItem; - (void)updateRosterItem: (XMPPRosterItem*)rosterItem; - (void)deleteRosterItem: (XMPPRosterItem*)rosterItem; -- (void)setDelegate: (id )delegate; -- (id )delegate; +- (void)addDelegate: (id )delegate; +- (void)removeDelegate: (id )delegate; - (void)XMPP_addRosterItem: (XMPPRosterItem*)rosterItem; - (void)XMPP_updateRosterItem: (XMPPRosterItem*)rosterItem; - (void)XMPP_deleteRosterItem: (XMPPRosterItem*)rosterItem; diff --git a/src/XMPPRoster.m b/src/XMPPRoster.m index 37c5f57..400553a 100644 --- a/src/XMPPRoster.m +++ b/src/XMPPRoster.m @@ -46,6 +46,7 @@ rosterItems = [[OFMutableDictionary alloc] init]; connection = connection_; [connection addDelegate: self]; + delegates = [[XMPPMulticastDelegate alloc] init]; } @catch (id e) { [self release]; @throw e; @@ -57,6 +58,7 @@ - (void)dealloc { [connection removeDelegate: self]; + [delegates release]; [rosterItems release]; [super dealloc]; @@ -107,10 +109,10 @@ else [self XMPP_addRosterItem: rosterItem]; - if ([delegate respondsToSelector: - @selector(roster:didReceiveRosterItem:)]) - [delegate roster: self - didReceiveRosterItem: rosterItem]; + [delegates broadcastSelector: @selector( + roster:didReceiveRosterItem:) + withObject: self + withObject: rosterItem]; } [connection_ sendStanza: [iq resultIQ]]; @@ -172,14 +174,14 @@ [connection sendStanza: iq]; } -- (void)setDelegate: (id )delegate_ +- (void)addDelegate: (id )delegate { - delegate = (id )delegate_; + [delegates addDelegate: delegate]; } -- (id )delegate +- (void)removeDelegate: (id )delegate { - return delegate; + [delegates removeDelegate: delegate]; } - (void)XMPP_addRosterItem: (XMPPRosterItem*)rosterItem @@ -258,8 +260,8 @@ [self XMPP_addRosterItem: rosterItem]; } - if ([delegate respondsToSelector: @selector(rosterWasReceived:)]) - [delegate rosterWasReceived: self]; + [delegates broadcastSelector: @selector(rosterWasReceived:) + withObject: self]; } @end diff --git a/tests/test.m b/tests/test.m index 561d793..646a0f4 100644 --- a/tests/test.m +++ b/tests/test.m @@ -97,7 +97,7 @@ OF_APPLICATION_DELEGATE(AppDelegate) roster = [[XMPPRoster alloc] initWithConnection: conn]; [conn addDelegate: self]; - [roster setDelegate: self]; + [roster addDelegate: self]; if ([arguments count] != 3) { of_log(@"Invalid count of command line arguments!");