From 1a38d433f22f577feb4007160d7a591b00518c9f Mon Sep 17 00:00:00 2001
From: Florian Zeitz <florob@babelmonkeys.de>
Date: Wed, 3 Apr 2013 23:37:48 +0200
Subject: [PATCH] Add basic Service Discovery support

---
 src/core/JubChatClient.h |  2 ++
 src/core/JubChatClient.m | 32 +++++++++++++++++++++++++++++---
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/src/core/JubChatClient.h b/src/core/JubChatClient.h
index cacb72d..57cfd0b 100644
--- a/src/core/JubChatClient.h
+++ b/src/core/JubChatClient.h
@@ -13,12 +13,14 @@
 	XMPPRoster *_roster;
 	XMPPStreamManagement *_streamManagement;
 	XMPPContactManager *_contactManager;
+	XMPPDiscoEntity *_discoEntity;
 	XMPPPresence *_presence;
 	id<JubUI> _ui;
 }
 @property (readonly) XMPPConnection *connection;
 @property (readonly) XMPPRoster *roster;
 @property (readonly) XMPPContactManager *contactManager;
+@property (readonly) XMPPDiscoEntity *discoEntity;
 @property (readonly) XMPPPresence *presence;
 @property (assign) id<JubUI> ui;
 
diff --git a/src/core/JubChatClient.m b/src/core/JubChatClient.m
index eea1b8a..1d7874a 100644
--- a/src/core/JubChatClient.m
+++ b/src/core/JubChatClient.m
@@ -1,9 +1,13 @@
 #import "JubChatClient.h"
+#import "ObjXMPP/namespaces.h"
+
+#define JUB_CLIENT_URI @"http://babelmonkeys.de/jubjub"
 
 @implementation JubChatClient
 @synthesize connection = _connection;
 @synthesize roster = _roster;
 @synthesize contactManager = _contactManager;
+@synthesize discoEntity = _discoEntity;
 @synthesize presence = _presence;
 @synthesize ui = _ui;
 
@@ -47,6 +51,7 @@
 
 	[_roster release];
 	[_contactManager release];
+	[_discoEntity release];
 	[_streamManagement release];
 	[_connection release];
 	[_presence release];
@@ -111,6 +116,17 @@
 	if (text != nil)
 		presence.status = text;
 
+	OFXMLElement *caps = [OFXMLElement elementWithName: @"c"
+						 namespace: XMPP_NS_CAPS];
+	[caps addAttributeWithName: @"hash"
+		       stringValue: @"sha-1"];
+	[caps addAttributeWithName: @"ver"
+		       stringValue: [_discoEntity capsHash]];
+	[caps addAttributeWithName: @"node"
+		       stringValue: JUB_CLIENT_URI];
+
+	[presence addChild: caps];
+
 	[_connection sendStanza: presence];
 }
 
@@ -119,6 +135,17 @@
 {
 	of_log(@"Bound to JID: %@", [jid fullJID]);
 
+	_discoEntity =
+	    [[XMPPDiscoEntity alloc] initWithConnection: connection
+					       capsNode: JUB_CLIENT_URI];
+
+	XMPPDiscoIdentity *identity =
+	    [XMPPDiscoIdentity identityWithCategory: @"client"
+					       type: @"pc"
+					       name: @"JubJub"];
+	[_discoEntity addIdentity: identity];
+	[_discoEntity addFeature: XMPP_NS_CAPS];
+
 	[_roster requestRoster];
 }
 
@@ -145,8 +172,7 @@
 
 - (void)rosterWasReceived: (XMPPRoster*)roster
 {
-	XMPPPresence *pres = [XMPPPresence presence];
-	[pres setStatus: @"Hello from JubJub"];
-	[_connection sendStanza: pres];
+	[self sendPresenceWithStatus: @"available"
+				text: @"Hello from JubJub"];
 }
 @end
-- 
2.39.5