From a433727bd538c175d7bf277179b28ae38c58497f Mon Sep 17 00:00:00 2001 From: Florian Zeitz Date: Fri, 6 Jan 2012 20:18:33 +0100 Subject: [PATCH] Merge XMPP*Callback into a single class --- src/XMPPCallback.h | 20 +++++++------------- src/XMPPCallback.m | 33 ++++++++++++--------------------- src/XMPPConnection.m | 6 +++--- tests/test.m | 11 +++++++++++ 4 files changed, 33 insertions(+), 37 deletions(-) diff --git a/src/XMPPCallback.h b/src/XMPPCallback.h index 6d9689a..a8cb37b 100644 --- a/src/XMPPCallback.h +++ b/src/XMPPCallback.h @@ -24,29 +24,23 @@ @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 diff --git a/src/XMPPCallback.m b/src/XMPPCallback.m index 65b3d7b..dd8c8e6 100644 --- a/src/XMPPCallback.m +++ b/src/XMPPCallback.m @@ -26,37 +26,23 @@ #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_ { @@ -85,7 +71,12 @@ - (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 diff --git a/src/XMPPConnection.m b/src/XMPPConnection.m index 87cef9c..fe0814d 100644 --- a/src/XMPPConnection.m +++ b/src/XMPPConnection.m @@ -362,7 +362,7 @@ withCallbackObject: (id)object if (![iq ID]) [iq setID: [self generateStanzaID]]; - [callbacks setObject: [XMPPObjectCallback + [callbacks setObject: [XMPPCallback callbackWithCallbackObject: object selector: selector] forKey: [iq ID]]; @@ -382,7 +382,7 @@ withCallbackBlock: (xmpp_callback_block)callback; if (![iq ID]) [iq setID: [self generateStanzaID]]; - [callbacks setObject: [XMPPBlockCallback + [callbacks setObject: [XMPPCallback callbackWithCallbackBlock: callback] forKey: [iq ID]]; } @finally { @@ -697,7 +697,7 @@ withCallbackBlock: (xmpp_callback_block)callback; - (void)XMPP_handleIQ: (XMPPIQ*)iq { BOOL handled = NO; - id callback; + XMPPCallback *callback; if ((callback = [callbacks objectForKey: [iq ID]])) { [callback runWithIQ: iq]; diff --git a/tests/test.m b/tests/test.m index 0df3f1a..5667834 100644 --- a/tests/test.m +++ b/tests/test.m @@ -147,6 +147,17 @@ OF_APPLICATION_DELEGATE(AppDelegate) [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