diff mcabber/src/xmpp_iq.c @ 1600:c5ee395fbc8c

Updated Entity Capabilities support (XEP-0115)
author franky
date Tue, 23 Sep 2008 10:59:25 +0200
parents dcd5d4c75199
children 351427ef0b4b
line wrap: on
line diff
--- a/mcabber/src/xmpp_iq.c	Sun Oct 11 15:39:32 2009 +0200
+++ b/mcabber/src/xmpp_iq.c	Tue Sep 23 10:59:25 2008 +0200
@@ -461,82 +461,47 @@
 }
 
 
-//  disco_info_set_ext(ansquery, ext)
-// Add features attributes to ansquery for extension ext.
-static void disco_info_set_ext(LmMessageNode *ansquery, const char *ext)
+void _disco_add_feature_helper(gpointer data, gpointer user_data)
 {
-  char *nodename = g_strdup_printf("%s#%s", MCABBER_CAPS_NODE, ext);
-  lm_message_node_set_attribute(ansquery, "node", nodename);
-  g_free(nodename);
-  if (!strcasecmp(ext, "csn")) {
-    // I guess it's ok to send this even if it's not compiled in.
-    lm_message_node_set_attribute(lm_message_node_add_child(ansquery,
-                                                            "feature", NULL),
-                                  "var", NS_CHATSTATES);
-  }
-  if (!strcasecmp(ext, "iql")) {
-    // I guess it's ok to send this even if it's not compiled in.
-    lm_message_node_set_attribute(lm_message_node_add_child(ansquery,
-                                                            "feature", NULL),
-                                  "var", NS_LAST);
-  }
+  LmMessageNode *node = user_data;
+  lm_message_node_set_attribute
+          (lm_message_node_add_child(node, "feature", NULL), "var", data);
 }
 
-//  disco_info_set_default(ansquery, entitycaps)
-// Add features attributes to ansquery.  If entitycaps is TRUE, assume
-// that we're answering an Entity Caps request (if not, the request was
-// a basic discovery query).
+//  disco_info_set_caps(ansquery, entitycaps)
+// Add features attributes to ansquery.  entitycaps should either be a
+// valid capabilities hash or NULL. If it is NULL, the node attribute won't
+// be added to the query child and Entity Capabilities will be announced
+// as a feature.
 // Please change the entity version string if you modify mcabber disco
 // source code, so that it doesn't conflict with the upstream client.
-static void disco_info_set_default(LmMessageNode *ansquery, guint entitycaps)
+static void disco_info_set_caps(LmMessageNode *ansquery,
+                                const char *entitycaps)
 {
-  LmMessageNode *y;
-  char *eversion;
-
-  eversion = g_strdup_printf("%s#%s", MCABBER_CAPS_NODE, entity_version());
-  lm_message_node_set_attribute(ansquery, "node", eversion);
-  g_free(eversion);
-
-  y = lm_message_node_add_child(ansquery, "identity", NULL);
+  if (entitycaps) {
+    char *eversion;
+    eversion = g_strdup_printf("%s#%s", MCABBER_CAPS_NODE, entitycaps);
+    lm_message_node_set_attribute(ansquery, "node", eversion);
+    g_free(eversion);
+  }
 
-  lm_message_node_set_attributes(y,
-                                 "category", "client",
-                                 "type", "pc",
-                                 "name", PACKAGE_NAME,
-                                 NULL);
+  lm_message_node_set_attributes
+          (lm_message_node_add_child(ansquery, "identity", NULL),
+           "category", "client",
+           "name", PACKAGE_STRING,
+           "type", "pc",
+           NULL);
 
-  lm_message_node_set_attribute
-          (lm_message_node_add_child(ansquery, "feature", NULL),
-           "var", NS_DISCO_INFO);
-  lm_message_node_set_attribute
-          (lm_message_node_add_child(ansquery, "feature", NULL),
-           "var", NS_MUC);
-#ifdef JEP0085
-  // Advertise ChatStates only if we're not using Entity Capabilities
-  if (!entitycaps)
+  if (entitycaps)
+    caps_foreach_feature(entitycaps, _disco_add_feature_helper, ansquery);
+  else {
+    caps_foreach_feature(entity_version(xmpp_getstatus()),
+                         _disco_add_feature_helper,
+                         ansquery);
     lm_message_node_set_attribute
             (lm_message_node_add_child(ansquery, "feature", NULL),
-             "var", NS_CHATSTATES);
-#endif
-  lm_message_node_set_attribute
-          (lm_message_node_add_child(ansquery, "feature", NULL),
-           "var", NS_TIME);
-  lm_message_node_set_attribute
-          (lm_message_node_add_child(ansquery, "feature", NULL),
-           "var", NS_XMPP_TIME);
-  lm_message_node_set_attribute
-          (lm_message_node_add_child(ansquery, "feature", NULL),
-           "var", NS_VERSION);
-  lm_message_node_set_attribute
-          (lm_message_node_add_child(ansquery, "feature", NULL),
-           "var", NS_PING);
-  lm_message_node_set_attribute
-          (lm_message_node_add_child(ansquery, "feature", NULL),
-           "var", NS_COMMANDS);
-  if (!entitycaps)
-    lm_message_node_set_attribute
-            (lm_message_node_add_child(ansquery, "feature", NULL),
-             "var", NS_LAST);
+             "var", NS_CAPS);
+  }
 }
 
 static LmHandlerResult handle_iq_disco_info(LmMessageHandler *h,
@@ -546,23 +511,21 @@
   LmMessage *r;
   LmMessageNode *query, *tmp;
   const char *node = NULL;
+  const char *param = NULL;
 
   r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT);
   query = lm_message_node_add_child(r->node, "query", NULL);
   lm_message_node_set_attribute(query, "xmlns", NS_DISCO_INFO);
   tmp = lm_message_node_find_child(m->node, "query");
-  if (tmp)
+  if (tmp) {
     node = lm_message_node_get_attribute(tmp, "node");
-  if (node && startswith(node, MCABBER_CAPS_NODE "#", FALSE)) {
-    const char *param = node+strlen(MCABBER_CAPS_NODE)+1;
-    if (!strcmp(param, entity_version()))
-      disco_info_set_default(query, TRUE);  // client#version
-    else
-      disco_info_set_ext(query, param);     // client#extension
-  } else {
+    param = node+strlen(MCABBER_CAPS_NODE)+1;
+  }
+  if (node && startswith(node, MCABBER_CAPS_NODE "#", FALSE))
+    disco_info_set_caps(query, param);  // client#version
+  else
     // Basic discovery request
-    disco_info_set_default(query, FALSE);
-  }
+    disco_info_set_caps(query, NULL);
 
   lm_connection_send(c, r, NULL);
   lm_message_unref(r);