DiscoEntity: Answer to requests send to the caps node

This commit is contained in:
Florian Zeitz 2013-03-24 16:33:42 +01:00
parent 56e3aef482
commit 441a9e4472
3 changed files with 55 additions and 6 deletions

View file

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

View file

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

View file

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