Index: src/XMPPConnection.m ================================================================== --- src/XMPPConnection.m +++ src/XMPPConnection.m @@ -304,11 +304,11 @@ - (void)parseBuffer: (const char*)buffer withLength: (size_t)length { if (length < 1) { [delegates broadcastSelector: @selector(connectionWasClosed:) - forConnection: self]; + withObject: self]; return; } [parser parseBuffer: buffer withLength: length]; @@ -374,11 +374,11 @@ } - (void)sendStanza: (OFXMLElement*)element { [delegates broadcastSelector: @selector(connection:didSendElement:) - forConnection: self + withObject: self withObject: element]; [sock writeString: [element XMLString]]; } @@ -484,11 +484,11 @@ [element setDefaultNamespace: XMPP_NS_CLIENT]; [element setPrefix: @"stream" forNamespace: XMPP_NS_STREAM]; [delegates broadcastSelector: @selector(connection:didReceiveElement:) - forConnection: self + withObject: self withObject: element]; if ([[element namespace] isEqual: XMPP_NS_CLIENT]) [self XMPP_handleStanza: element]; @@ -686,11 +686,11 @@ /* FIXME: Catch errors here */ SSLSocket *newSock; [delegates broadcastSelector: @selector( connectionWillUpgradeToTLS:) - forConnection: self]; + withObject: self]; newSock = [[SSLSocket alloc] initWithSocket: sock privateKeyFile: privateKeyFile certificateFile: certificateFile]; [sock release]; @@ -698,11 +698,11 @@ encrypted = YES; [delegates broadcastSelector: @selector( connectionDidUpgradeToTLS:) - forConnection: self]; + withObject: self]; /* Stream restart */ [self XMPP_startStream]; return; @@ -742,11 +742,11 @@ [authModule continueWithData: [OFDataArray dataArrayWithBase64EncodedString: [element stringValue]]]; [delegates broadcastSelector: @selector( connectionWWasAuthenticated:) - forConnection: self]; + withObject: self]; /* Stream restart */ [self XMPP_startStream]; return; @@ -775,11 +775,11 @@ return; } handled = [delegates broadcastSelector: @selector( connection:didReceiveIQ:) - forConnection: self + withObject: self withObject: iq]; if (!handled && ![[iq type] isEqual: @"error"] && ![[iq type] isEqual: @"result"]) { [self sendStanza: [iq errorIQWithType: @"cancel" @@ -788,18 +788,18 @@ } - (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]; } - (void)XMPP_handleFeatures: (OFXMLElement*)element { @@ -966,11 +966,11 @@ [self XMPP_sendSession]; return; } [delegates broadcastSelector: @selector(connection:wasBoundToJID:) - forConnection: self + withObject: self withObject: JID]; } - (void)XMPP_sendSession { @@ -989,11 +989,11 @@ { if (![[iq type] isEqual: @"result"]) assert(0); [delegates broadcastSelector: @selector(connection:wasBoundToJID:) - forConnection: self + withObject: self withObject: JID]; } - (OFString*)XMPP_IDNAToASCII: (OFString*)domain_ { Index: src/XMPPMulticastDelegate.h ================================================================== --- src/XMPPMulticastDelegate.h +++ src/XMPPMulticastDelegate.h @@ -18,22 +18,22 @@ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ -#import "XMPPConnection.h" +#import @class OFDataArray; @interface XMPPMulticastDelegate: OFObject { 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; + withObject: (id)object; - (BOOL)broadcastSelector: (SEL)selector - forConnection: (XMPPConnection*)connection - withObject: (id)object; + withObject: (id)object1 + withObject: (id)object2; @end Index: src/XMPPMulticastDelegate.m ================================================================== --- src/XMPPMulticastDelegate.m +++ src/XMPPMulticastDelegate.m @@ -48,16 +48,16 @@ [delegates release]; [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]; for (i = 0; i < count; i++) { @@ -67,11 +67,11 @@ } } } - (BOOL)broadcastSelector: (SEL)selector - forConnection: (XMPPConnection*)connection + withObject: (id)object { id *cArray = [delegates cArray]; size_t i, count = [delegates count]; BOOL handled = NO; @@ -80,19 +80,19 @@ continue; 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]; BOOL handled = NO; @@ -101,11 +101,11 @@ continue; 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; } @end Index: src/XMPPRoster.h ================================================================== --- src/XMPPRoster.h +++ src/XMPPRoster.h @@ -26,10 +26,11 @@ #import "XMPPConnection.h" @class XMPPRosterItem; @class XMPPIQ; @class XMPPRoster; +@class XMPPMulticastDelegate; @protocol XMPPRosterDelegate #ifndef XMPP_ROSTER_M #endif @@ -47,29 +48,25 @@ #endif { 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; - (void)XMPP_handleInitialRoster: (XMPPIQ*)iq; - (XMPPRosterItem*)XMPP_rosterItemWithXMLElement: (OFXMLElement*)element; @end @interface OFObject (XMPPRosterDelegate) @end Index: src/XMPPRoster.m ================================================================== --- src/XMPPRoster.m +++ src/XMPPRoster.m @@ -44,10 +44,11 @@ @try { rosterItems = [[OFMutableDictionary alloc] init]; connection = connection_; [connection addDelegate: self]; + delegates = [[XMPPMulticastDelegate alloc] init]; } @catch (id e) { [self release]; @throw e; } @@ -55,10 +56,11 @@ } - (void)dealloc { [connection removeDelegate: self]; + [delegates release]; [rosterItems release]; [super dealloc]; } @@ -105,14 +107,14 @@ if ([[rosterItem subscription] isEqual: @"remove"]) [self XMPP_deleteRosterItem: rosterItem]; 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]]; return YES; @@ -170,18 +172,18 @@ [iq addChild: query]; [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 { return [self XMPP_updateRosterItem: rosterItem]; @@ -256,12 +258,12 @@ [self XMPP_deleteRosterItem: rosterItem]; else [self XMPP_addRosterItem: rosterItem]; } - if ([delegate respondsToSelector: @selector(rosterWasReceived:)]) - [delegate rosterWasReceived: self]; + [delegates broadcastSelector: @selector(rosterWasReceived:) + withObject: self]; } @end @implementation OFObject (XMPPRosterDelegate) - (void)rosterWasReceived: (XMPPRoster*)roster Index: tests/test.m ================================================================== --- tests/test.m +++ tests/test.m @@ -95,11 +95,11 @@ conn = [[XMPPConnection alloc] init]; 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!"); [OFApplication terminateWithStatus: 1]; }