[telepathy-gabble/master] Add a quirk capability to detect the Google webmail client from its c at node

Danielle Madeley danielle.madeley at collabora.co.uk
Wed Jan 13 02:28:45 PST 2010


---
 src/capabilities.h   |    2 ++
 src/presence-cache.c |   31 +++++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/src/capabilities.h b/src/capabilities.h
index 8170626..027faa6 100644
--- a/src/capabilities.h
+++ b/src/capabilities.h
@@ -33,6 +33,8 @@
 #define QUIRK_PREFIX "\x07"
 /* Gabble 0.7.x with 16 <= x < 29 omits @creator on <content/> */
 #define QUIRK_OMITS_CONTENT_CREATORS "\x07omits-content-creators"
+/* The Google Webmail client doesn't support some features */
+#define QUIRK_GOOGLE_WEBMAIL_CLIENT "\x07google-webmail-client"
 
 /**
  * GabbleCapabilitySet:
diff --git a/src/presence-cache.c b/src/presence-cache.c
index b2491d3..9b37140 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -850,6 +850,35 @@ _parse_cap_bundles (
   return uris;
 }
 
+static void
+_parse_node (GabblePresence *presence,
+    LmMessageNode *lm_node,
+    const gchar *resource,
+    guint serial)
+{
+  LmMessageNode *cap_node;
+  const gchar *node;
+
+  cap_node = lm_message_node_get_child_with_namespace (lm_node, "c", NS_CAPS);
+
+  if (NULL == cap_node)
+    return;
+
+  node = lm_message_node_get_attribute (cap_node, "node");
+
+  if (!tp_strdiff (node, "http://mail.google.com/xmpp/client/caps"))
+    {
+      GabbleCapabilitySet *cap_set = gabble_capability_set_new ();
+
+      DEBUG ("Client is Google Web Client");
+
+      gabble_capability_set_add (cap_set, QUIRK_GOOGLE_WEBMAIL_CLIENT);
+      gabble_presence_set_capabilities (presence, resource, cap_set, serial);
+      gabble_capability_set_free (cap_set);
+    }
+}
+
+
 static void _caps_disco_cb (GabbleDisco *disco,
     GabbleDiscoRequest *request,
     const gchar *jid,
@@ -1286,6 +1315,8 @@ _process_caps (GabblePresenceCache *cache,
   if (presence)
     {
       old_cap_set = gabble_presence_dup_caps (presence);
+
+      _parse_node (presence, lm_node, resource, serial);
     }
 
   for (i = uris; NULL != i; i = i->next)
-- 
1.5.6.5




More information about the telepathy-commits mailing list