Index: src/XMPPCallback.h ================================================================== --- src/XMPPCallback.h +++ src/XMPPCallback.h @@ -22,31 +22,25 @@ #import @class XMPPIQ; -@protocol XMPPCallback -- (void)runWithIQ: (XMPPIQ*)iq; -@end - #ifdef OF_HAVE_BLOCKS typedef void(^xmpp_callback_block)(XMPPIQ*); - -@interface XMPPBlockCallback: OFObject -{ - xmpp_callback_block callback; -} -+ callbackWithCallbackBlock: (xmpp_callback_block)callback; -- initWithCallbackBlock: (xmpp_callback_block)callback; -@end #endif -@interface XMPPObjectCallback: OFObject +@interface XMPPCallback: OFObject { id object; SEL selector; } +#ifdef OF_HAVE_BLOCKS ++ callbackWithCallbackBlock: (xmpp_callback_block)callback; +- initWithCallbackBlock: (xmpp_callback_block)callback; +#endif + callbackWithCallbackObject: (id)object selector: (SEL)selector; - initWithCallbackObject: (id)object selector: (SEL)selector; + +- (void)runWithIQ: (XMPPIQ*)iq; @end Index: src/XMPPCallback.m ================================================================== --- src/XMPPCallback.m +++ src/XMPPCallback.m @@ -24,41 +24,27 @@ # include "config.h" #endif #import "XMPPCallback.h" +@implementation XMPPCallback #ifdef OF_HAVE_BLOCKS -@implementation XMPPBlockCallback -+ callbackWithCallbackBlock: (xmpp_callback_block)callback_ ++ callbackWithCallbackBlock: (xmpp_callback_block)callback { - return [[[self alloc] initWithCallbackBlock: callback_] autorelease]; + return [[[self alloc] initWithCallbackBlock: callback] autorelease]; } -- initWithCallbackBlock: (xmpp_callback_block)callback_ +- initWithCallbackBlock: (xmpp_callback_block)callback { self = [super init]; - callback = [callback_ copy]; + object = [callback copy]; return self; } - -- (void)dealloc -{ - [callback release]; - - [super dealloc]; -} - -- (void)runWithIQ: (XMPPIQ*)iq -{ - callback(iq); -} -@end #endif -@implementation XMPPObjectCallback + callbackWithCallbackObject: (id)object_ selector: (SEL)selector_ { return [[[self alloc] initWithCallbackObject: object_ selector: selector_] autorelease]; @@ -83,9 +69,14 @@ [super dealloc]; } - (void)runWithIQ: (XMPPIQ*)iq { - [object performSelector: selector - withObject: iq]; +#ifdef OF_HAVE_BLOCKS + if ([object isKindOfClass: [OFBlock class]]) + ((xmpp_callback_block)object)(iq); + else +#endif + [object performSelector: selector + withObject: iq]; } @end Index: src/XMPPConnection.m ================================================================== --- src/XMPPConnection.m +++ src/XMPPConnection.m @@ -360,11 +360,11 @@ OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; @try { if (![iq ID]) [iq setID: [self generateStanzaID]]; - [callbacks setObject: [XMPPObjectCallback + [callbacks setObject: [XMPPCallback callbackWithCallbackObject: object selector: selector] forKey: [iq ID]]; } @finally { [pool release]; @@ -380,11 +380,11 @@ OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; @try { if (![iq ID]) [iq setID: [self generateStanzaID]]; - [callbacks setObject: [XMPPBlockCallback + [callbacks setObject: [XMPPCallback callbackWithCallbackBlock: callback] forKey: [iq ID]]; } @finally { [pool release]; } @@ -695,11 +695,11 @@ } - (void)XMPP_handleIQ: (XMPPIQ*)iq { BOOL handled = NO; - id callback; + XMPPCallback *callback; if ((callback = [callbacks objectForKey: [iq ID]])) { [callback runWithIQ: iq]; [callbacks removeObjectForKey: [iq ID]]; return; Index: tests/test.m ================================================================== --- tests/test.m +++ tests/test.m @@ -145,10 +145,21 @@ pres = [XMPPPresence presence]; [pres addPriority: 10]; [pres addStatus: @"ObjXMPP test is working!"]; [conn sendStanza: pres]; + +#ifdef OF_HAVE_BLOCKS + XMPPIQ *iq = [XMPPIQ IQWithType: @"get" + ID: [conn generateStanzaID]]; + [iq addChild: [OFXMLElement elementWithName: @"ping" + namespace: @"urn:xmpp:ping"]]; + [conn sendIQ: iq + withCallbackBlock: ^(XMPPIQ* resp) { + of_log(@"Ping response: %@", resp); + }]; +#endif } - (void)connectionDidUpgradeToTLS: (XMPPConnection*)conn { @try {