@@ -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