From 441a9e4472bcd64e716855f8d3104637def82c1b Mon Sep 17 00:00:00 2001 From: Florian Zeitz Date: Sun, 24 Mar 2013 16:33:42 +0100 Subject: [PATCH] DiscoEntity: Answer to requests send to the caps node --- src/XMPPDiscoEntity.h | 28 ++++++++++++++++++++++++++++ src/XMPPDiscoEntity.m | 27 +++++++++++++++++++++++++++ src/XMPPDiscoNode.m | 6 ------ 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/src/XMPPDiscoEntity.h b/src/XMPPDiscoEntity.h index def24bc..cfc0693 100644 --- a/src/XMPPDiscoEntity.h +++ b/src/XMPPDiscoEntity.h @@ -35,6 +35,7 @@ { OFMutableDictionary *_discoNodes; XMPPConnection *_connection; + OFString *_capsNode; } #ifdef OF_HAVE_PROPERTIES /** @@ -45,6 +46,8 @@ * any number of nodes nested more deeply. */ @property (readonly) OFDictionary *discoNodes; +/// \brief The node advertised for the entity's capabilites +@property (readonly) OFString *capsNode; #endif /** @@ -57,6 +60,18 @@ */ + discoEntityWithConnection: (XMPPConnection*)connection; +/** + * \brief Creates a new autoreleased XMPPDiscoEntity with the specified + * connection. + * + * \param connection The XMPPConnection to serve responses on. + * This must already be bound to a resource) + * \param capsNode The node advertised for the entity's capabilites + * \return A new autoreleased XMPPDiscoEntity + */ ++ discoEntityWithConnection: (XMPPConnection*)connection + capsNode: (OFString*)capsNode; + /** * \brief Initializes an already allocated XMPPDiscoEntity with the specified * connection. @@ -67,6 +82,18 @@ */ - initWithConnection: (XMPPConnection*)connection; +/** + * \brief Initializes an already allocated XMPPDiscoEntity with the specified + * connection. + * + * \param connection The XMPPConnection to serve responses on. + * This must already be bound to a resource) + * \param capsNode The node advertised for the entity's capabilites + * \return An initialized XMPPDiscoEntity + */ +- initWithConnection: (XMPPConnection*)connection + capsNode: (OFString*)capsNode; + /** * \brief Adds a XMPPDiscoNode to provide responses for. * @@ -82,4 +109,5 @@ - (OFString*)capsHash; - (OFDictionary*)discoNodes; +- (OFString*)capsNode; @end diff --git a/src/XMPPDiscoEntity.m b/src/XMPPDiscoEntity.m index 2ba17b8..47a0ee8 100644 --- a/src/XMPPDiscoEntity.m +++ b/src/XMPPDiscoEntity.m @@ -31,7 +31,21 @@ return [[[self alloc] initWithConnection: connection] autorelease]; } ++ discoEntityWithConnection: (XMPPConnection*)connection + capsNode: (OFString*)capsNode +{ + return [[[self alloc] initWithConnection: connection + capsNode: capsNode] autorelease]; +} + - initWithConnection: (XMPPConnection*)connection +{ + return [self initWithConnection: connection + capsNode: nil]; +} + +- initWithConnection: (XMPPConnection*)connection + capsNode: (OFString*)capsNode { self = [super initWithJID: [connection JID] node: nil]; @@ -39,6 +53,7 @@ @try { _discoNodes = [OFMutableDictionary new]; _connection = connection; + _capsNode = [capsNode copy]; [_connection addDelegate: self]; } @catch (id e) { @@ -68,6 +83,11 @@ forKey: [node node]]; } +- (OFString*)capsNode +{ + OF_GETTER(_capsNode, YES); +} + - (OFString*)capsHash { OFMutableString *caps = [OFMutableString string]; @@ -117,10 +137,17 @@ if (query != nil) { OFString *node = [[query attributeForName: @"node"] stringValue]; + if (node == nil) return [self XMPP_handleInfoIQ: IQ connection: connection]; + OFString *capsNode = [_capsNode stringByAppendingFormat: @"#%@", + [self capsHash]]; + if ([capsNode isEqual: node]) + return [self XMPP_handleInfoIQ: IQ + connection: connection]; + XMPPDiscoNode *responder = [_discoNodes objectForKey: node]; if (responder != nil) return [responder XMPP_handleInfoIQ: IQ diff --git a/src/XMPPDiscoNode.m b/src/XMPPDiscoNode.m index 13f6731..92abad5 100644 --- a/src/XMPPDiscoNode.m +++ b/src/XMPPDiscoNode.m @@ -190,12 +190,6 @@ OFEnumerator *enumerator; OFString *feature; XMPPDiscoIdentity *identity; - OFXMLElement *query = [IQ elementForName: @"query" - namespace: XMPP_NS_DISCO_INFO]; - OFString *node = [[query attributeForName: @"node"] stringValue]; - - if (!(node == _node) && ![node isEqual: _node]) - return NO; resultIQ = [IQ resultIQ]; response = [OFXMLElement elementWithName: @"query"