diff libpurple/protocols/jabber/presence.c @ 17563:95affacf6f82

Added the ability to define extensions to caps
author Andreas Monitzer <pidgin@monitzer.com>
date Wed, 06 Jun 2007 01:19:49 +0000
parents 3919c68eb5b7
children ac1ee71efd89
line wrap: on
line diff
--- a/libpurple/protocols/jabber/presence.c	Wed Jun 06 00:04:29 2007 +0000
+++ b/libpurple/protocols/jabber/presence.c	Wed Jun 06 01:19:49 2007 +0000
@@ -118,7 +118,7 @@
 	purple_status_to_jabber(status, &state, &stripped, &priority);
 
 
-	presence = jabber_presence_create(state, stripped, priority);
+	presence = jabber_presence_create_js(js, state, stripped, priority);
 	g_free(stripped);
 
 	if(js->avatar_hash) {
@@ -138,6 +138,11 @@
 
 xmlnode *jabber_presence_create(JabberBuddyState state, const char *msg, int priority)
 {
+    return jabber_presence_create_js(NULL, state, msg, priority);
+}
+
+xmlnode *jabber_presence_create_js(JabberStream *js, JabberBuddyState state, const char *msg, int priority)
+{
 	xmlnode *show, *status, *presence, *pri, *c;
 	const char *show_string = NULL;
 
@@ -172,6 +177,31 @@
 	xmlnode_set_namespace(c, "http://jabber.org/protocol/caps");
 	xmlnode_set_attrib(c, "node", CAPS0115_NODE);
 	xmlnode_set_attrib(c, "ver", VERSION);
+    
+    if(js != NULL) {
+        /* add the extensions */
+        char extlist[1024];
+        unsigned remaining = 1023; /* one less for the \0 */
+        GSList *feature;
+        
+        extlist[0] = '\0';
+        for(feature = js->features; feature && remaining > 0; feature = feature->next) {
+            JabberFeature *feat = (JabberFeature*)feature->data;
+            unsigned featlen = strlen(feat->shortname);
+            
+            /* cut off when we don't have any more space left in our buffer (too bad) */
+            if(featlen > remaining)
+                break;
+            
+            strncat(extlist,feat->shortname,remaining);
+            remaining -= featlen;
+            strncat(extlist," ",remaining);
+            --remaining;
+        }
+        /* did we add anything? */
+        if(remaining < 1023)
+            xmlnode_set_attrib(c, "ext", extlist);
+    }
 
 	return presence;
 }