telepathy-gabble: Implement WLM jidlookup

Xavier Claessens xclaesse at kemper.freedesktop.org
Thu Jun 28 06:42:59 PDT 2012


Module: telepathy-gabble
Branch: master
Commit: c04d52520e405649a2878902a0c825558b5a91ac
URL:    http://cgit.freedesktop.org/telepathy/telepathy-gabble/commit/?id=c04d52520e405649a2878902a0c825558b5a91ac

Author: Xavier Claessens <xavier.claessens at collabora.co.uk>
Date:   Mon May 28 10:30:55 2012 +0200

Implement WLM jidlookup

See description: http://msdn.microsoft.com/en-us/library/live/hh550849.aspx

https://bugs.freedesktop.org/show_bug.cgi?id=50341

---

 configure.ac     |    2 +-
 src/connection.c |  122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/connection.h |    1 +
 src/namespaces.h |    4 ++
 4 files changed, 128 insertions(+), 1 deletions(-)

diff --git a/configure.ac b/configure.ac
index 2649232..c48d3f4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -297,7 +297,7 @@ AC_SUBST(DBUS_CFLAGS)
 AC_SUBST(DBUS_LIBS)
 
 AC_DEFINE(TP_VERSION_MIN_REQUIRED, TP_VERSION_0_18, [Ignore post 0.18 deprecations])
-PKG_CHECK_MODULES(TP_GLIB, [telepathy-glib >= 0.19.0])
+PKG_CHECK_MODULES(TP_GLIB, [telepathy-glib >= 0.19.2])
 
 AC_SUBST(TP_GLIB_CFLAGS)
 AC_SUBST(TP_GLIB_LIBS)
diff --git a/src/connection.c b/src/connection.c
index da09b40..4f7f4b4 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -2817,6 +2817,115 @@ decrement_waiting_connected (GabbleConnection *conn)
 }
 
 static void
+conn_wlm_jid_lookup_cb (GObject *source,
+    GAsyncResult *result,
+    gpointer user_data)
+{
+  GabbleConnection *conn = (GabbleConnection *) source;
+  GSimpleAsyncResult *my_result = user_data;
+  WockyStanza *iq = NULL;
+  WockyNode *node;
+  const gchar *jid = NULL;
+  GError *error = NULL;
+
+  if (!conn_util_send_iq_finish (conn, result, &iq, &error))
+    {
+      g_simple_async_result_take_error (my_result, error);
+      goto out;
+    }
+
+  node = wocky_node_get_child_ns (wocky_stanza_get_top_node (iq),
+      "getjid", NS_WLM_JID_LOOKUP);
+
+  if (node != NULL)
+    {
+      jid = wocky_node_get_content_from_child (node, "jid");
+    }
+
+  if (!tp_str_empty (jid))
+    {
+      g_simple_async_result_set_op_res_gpointer (my_result,
+          g_strdup (jid), g_free);
+    }
+  else
+    {
+      g_simple_async_result_set_error (my_result,
+          TP_ERROR, TP_ERROR_INVALID_HANDLE,
+          "jid not found in getjid reply");
+    }
+
+out:
+  g_simple_async_result_complete (my_result);
+  g_object_unref (my_result);
+}
+
+static void
+conn_wlm_jid_lookup_async (TpHandleRepoIface *repo,
+    TpBaseConnection *base,
+    const gchar *id,
+    gpointer context,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  GabbleConnection *self = GABBLE_CONNECTION (base);
+  WockyStanza *iq;
+  GSimpleAsyncResult *result;
+  gchar *normal_id;
+  GError *error = NULL;
+
+  result = g_simple_async_result_new ((GObject *) repo, callback, user_data,
+      conn_wlm_jid_lookup_async);
+
+  /* First, do local normalization */
+  normal_id = gabble_normalize_contact (repo, id, context, &error);
+  if (normal_id == NULL)
+    {
+      g_simple_async_result_take_error (result, error);
+      g_simple_async_result_complete_in_idle (result);
+      g_object_unref (result);
+      return;
+    }
+
+  /* If it is already a WLM jid, return it */
+  if (g_str_has_suffix (normal_id, "@messenger.live.com"))
+    {
+      g_simple_async_result_set_op_res_gpointer (result, normal_id, g_free);
+      g_simple_async_result_complete_in_idle (result);
+      g_object_unref (result);
+      return;
+    }
+
+  /* Ask the server to give a WLM jid */
+  iq = wocky_stanza_build (WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_GET,
+      conn_util_get_bare_self_jid (self), normal_id,
+      '(', "getjid",
+        ':', NS_WLM_JID_LOOKUP,
+      ')',
+      NULL);
+
+  conn_util_send_iq_async (self, iq, NULL, conn_wlm_jid_lookup_cb, result);
+
+  g_object_unref (iq);
+  g_free (normal_id);
+}
+
+static gchar *
+conn_wlm_jid_lookup_finish (TpHandleRepoIface *repo,
+    GAsyncResult *result,
+    GError **error)
+{
+  GSimpleAsyncResult *simple = (GSimpleAsyncResult *) result;
+
+  g_return_val_if_fail (g_simple_async_result_is_valid (result,
+      G_OBJECT (repo), conn_wlm_jid_lookup_async), NULL);
+
+  if (g_simple_async_result_propagate_error (simple, error))
+    return NULL;
+
+  return g_strdup (g_simple_async_result_get_op_res_gpointer (simple));
+}
+
+static void
 connection_disco_cb (GabbleDisco *disco,
                      GabbleDiscoRequest *request,
                      const gchar *jid,
@@ -2893,12 +3002,25 @@ connection_disco_cb (GabbleDisco *disco,
                 conn->features |= GABBLE_CONNECTION_FEATURES_GOOGLE_QUEUE;
               else if (0 == strcmp (var, NS_GOOGLE_SETTING))
                 conn->features |= GABBLE_CONNECTION_FEATURES_GOOGLE_SETTING;
+              else if (0 == strcmp (var, NS_WLM_JID_LOOKUP))
+                conn->features |= GABBLE_CONNECTION_FEATURES_WLM_JID_LOOKUP;
             }
         }
 
       DEBUG ("set features flags to %d", conn->features);
     }
 
+  if ((conn->features & GABBLE_CONNECTION_FEATURES_WLM_JID_LOOKUP) != 0)
+    {
+      TpHandleRepoIface *contact_repo = tp_base_connection_get_handles (base,
+          TP_HANDLE_TYPE_CONTACT);
+
+      tp_dynamic_handle_repo_set_normalize_async (
+          (TpDynamicHandleRepo *) contact_repo,
+          conn_wlm_jid_lookup_async,
+          conn_wlm_jid_lookup_finish);
+    }
+
   conn_presence_set_initial_presence_async (conn,
       connection_initial_presence_cb, NULL);
 
diff --git a/src/connection.h b/src/connection.h
index 39c961d..f648ef4 100644
--- a/src/connection.h
+++ b/src/connection.h
@@ -139,6 +139,7 @@ typedef enum
   GABBLE_CONNECTION_FEATURES_GOOGLE_SHARED_STATUS = 1 << 7,
   GABBLE_CONNECTION_FEATURES_GOOGLE_QUEUE = 1 << 8,
   GABBLE_CONNECTION_FEATURES_GOOGLE_SETTING = 1 << 9,
+  GABBLE_CONNECTION_FEATURES_WLM_JID_LOOKUP = 1 << 10,
 } GabbleConnectionFeatures;
 
 typedef struct _GabbleConnectionPrivate GabbleConnectionPrivate;
diff --git a/src/namespaces.h b/src/namespaces.h
index 4f8415c..0103aa4 100644
--- a/src/namespaces.h
+++ b/src/namespaces.h
@@ -134,4 +134,8 @@
 #define NS_TP_FT_METADATA_SERVICE "http://telepathy.freedesktop.org/xmpp/file-transfer-service"
 #define NS_TP_FT_METADATA       "http://telepathy.freedesktop.org/xmpp/file-transfer-metadata"
 
+/* This is used by WLM to convert Windows Live ID to XMPP jid.
+ * See http://msdn.microsoft.com/en-us/library/live/hh550849.aspx */
+#define NS_WLM_JID_LOOKUP "http://messenger.live.com/xmpp/jidlookup"
+
 #endif /* __GABBLE_NAMESPACES__H__ */



More information about the telepathy-commits mailing list