diff mcabber/src/jab_iq.c @ 1003:c8b1a52b2fd6

Initial VCard retrieval support
author Mikael Berthe <mikael@lilotux.net>
date Tue, 07 Nov 2006 22:43:17 +0100
parents dd9e7eb5f8a8
children b57a01ffeed6
line wrap: on
line diff
--- a/mcabber/src/jab_iq.c	Tue Nov 07 22:21:39 2006 +0100
+++ b/mcabber/src/jab_iq.c	Tue Nov 07 22:43:17 2006 +0100
@@ -355,6 +355,132 @@
   jab_send(jc, iqn->xmldata);
 }
 
+static void handle_vcard_node(const char *barejid, xmlnode vcardnode)
+{
+  xmlnode x;
+  const char *p;
+  char *buf;
+
+  x = xmlnode_get_firstchild(vcardnode);
+  for ( ; x; x = xmlnode_get_nextsibling(x)) {
+    const char *title, *data;
+    p = xmlnode_get_name(x);
+    data = xmlnode_get_data(x);
+    if (p && data) {
+      title = NULL;
+      if (!strcmp(p, "FN"))
+        title = "Name";
+      else if (!strcmp(p, "NICKNAME"))
+        title = "Nickname";
+      else if (!strcmp(p, "URL"))
+        title = "URL";
+      else if (!strcmp(p, "BDAY"))
+        title = "Birthday";
+      else if (!strcmp(p, "TZ"))
+        title = "Timezone";
+      else if (!strcmp(p, "TITLE"))
+        title = "Title";
+      else if (!strcmp(p, "ROLE"))
+        title = "Role";
+      else if (!strcmp(p, "DESC"))
+        title = "Comment";
+      else if (!strcmp(p, "N")) {
+        data = xmlnode_get_tag_data(x, "FAMILY");
+        if (data) {
+          buf = g_strdup_printf("Family Name: %s", data);
+          scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE);
+          g_free(buf);
+        }
+        data = xmlnode_get_tag_data(x, "GIVEN");
+        if (data) {
+          buf = g_strdup_printf("Given Name: %s", data);
+          scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE);
+          g_free(buf);
+        }
+        data = xmlnode_get_tag_data(x, "MIDDLE");
+        if (data) {
+          buf = g_strdup_printf("Middle Name: %s", data);
+          scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE);
+          g_free(buf);
+        }
+      } else if (!strcmp(p, "ADR")) {   // TODO
+      } else if (!strcmp(p, "TEL")) {   // TODO
+      } else if (!strcmp(p, "EMAIL")) {
+        data = xmlnode_get_tag_data(x, "USERID");
+        if (data)
+          title = "Email"; // XXX
+      } else if (!strcmp(p, "ORG")) {   // TODO
+      }
+
+      if (title) {
+        buf = g_strdup_printf("%s: %s", title, data);
+        scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE);
+        g_free(buf);
+      }
+    }
+  }
+}
+
+static void iqscallback_vcard(eviqs *iqp, xmlnode xml_result, guint iqcontext)
+{
+  xmlnode ansqry;
+  char *p;
+  char *bjid;
+  char *buf;
+
+  // Leave now if we cannot process xml_result
+  if (!xml_result || iqcontext) return;
+
+  // Display IQ result sender...
+  p = xmlnode_get_attrib(xml_result, "from");
+  if (!p) {
+    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:vCard result (no sender name).");
+    return;
+  }
+  bjid = p;
+
+  buf = g_strdup_printf("Received IQ:vCard result from <%s>", bjid);
+  scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
+
+  // Get the vCard node
+  ansqry = xmlnode_get_tag(xml_result, "vCard");
+  if (!ansqry) {
+    scr_LogPrint(LPRINT_LOGNORM, "Empty IQ:vCard result!");
+    return;
+  }
+
+  // bjid should really be the "bare JID", let's strip the resource
+  p = strchr(bjid, JID_RESOURCE_SEPARATOR);
+  if (p) *p = '\0';
+
+  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO);
+  g_free(buf);
+
+  // Get result data...
+  handle_vcard_node(bjid, ansqry);
+}
+
+void request_vcard(const char *jid)
+{
+  eviqs *iqn;
+  char *barejid;
+
+  barejid = jidtodisp(jid);
+
+  // Create a new IQ structure.  We use NULL for the namespace because
+  // we'll have to use a special tag, not the usual "query" one.
+  iqn = iqs_new(JPACKET__GET, NULL, "vcard", IQS_DEFAULT_TIMEOUT);
+  xmlnode_put_attrib(iqn->xmldata, "to", barejid);
+  // Remove the useless <query/> tag, and insert a vCard one.
+  xmlnode_hide(xmlnode_get_tag(iqn->xmldata, "query"));
+  xmlnode_put_attrib(xmlnode_insert_tag(iqn->xmldata, "vCard"),
+                     "xmlns", NS_VCARD);
+  iqn->callback = &iqscallback_vcard;
+  jab_send(jc, iqn->xmldata);
+
+  g_free(barejid);
+}
+
 void iqscallback_auth(eviqs *iqp, xmlnode xml_result)
 {
   if (jstate == STATE_GETAUTH) {
@@ -392,19 +518,6 @@
   if (!iqs_callback(id, xmldata, IQS_CONTEXT_RESULT))
     return;
 
-  /*
-  if (!strcmp(id, "VCARDreq")) {
-    x = xmlnode_get_firstchild(xmldata);
-    if (!x) x = xmldata;
-
-    scr_LogPrint(LPRINT_LOGNORM, "Got VCARD");    // TODO
-    return;
-  } else if (!strcmp(id, "versionreq")) {
-    scr_LogPrint(LPRINT_LOGNORM, "Got version");  // TODO
-    return;
-  }
-  */
-
   x = xmlnode_get_tag(xmldata, "query");
   if (!x) return;