[telepathy-gabble/master] Reuse caps table when parsing caps

Will Thompson will.thompson at collabora.co.uk
Tue May 5 11:53:49 PDT 2009


---
 src/capabilities.c   |   39 +++++++++++++++++++++++++++++++++++++
 src/capabilities.h   |    2 +
 src/presence-cache.c |   52 +------------------------------------------------
 3 files changed, 43 insertions(+), 50 deletions(-)

diff --git a/src/capabilities.c b/src/capabilities.c
index a5dc65b..f814361 100644
--- a/src/capabilities.c
+++ b/src/capabilities.c
@@ -21,10 +21,15 @@
 #include "config.h"
 #include "capabilities.h"
 
+#include <string.h>
+
 #include <telepathy-glib/interfaces.h>
 #include <telepathy-glib/channel-manager.h>
 
+#define DEBUG_FLAG GABBLE_DEBUG_PRESENCE
+
 #include "caps-channel-manager.h"
+#include "debug.h"
 #include "namespaces.h"
 #include "presence-cache.h"
 #include "media-channel.h"
@@ -94,6 +99,40 @@ capabilities_get_features (GabblePresenceCapabilities caps,
   return features;
 }
 
+GabblePresenceCapabilities
+capabilities_parse (LmMessageNode *query_result)
+{
+  GabblePresenceCapabilities ret = PRESENCE_CAP_NONE;
+  LmMessageNode *child;
+  const gchar *var;
+  const Feature *i;
+
+  for (child = query_result->children; NULL != child; child = child->next)
+    {
+      if (0 != strcmp (child->name, "feature"))
+        continue;
+
+      var = lm_message_node_get_attribute (child, "var");
+
+      if (NULL == var)
+        continue;
+
+      for (i = self_advertised_features; i->ns != NULL; i++)
+        {
+          if (0 == strcmp (var, i->ns))
+            {
+              ret |= i->caps;
+              break;
+            }
+        }
+
+      if (i->ns == NULL)
+        DEBUG ("ignoring unknown capability %s", var);
+    }
+
+  return ret;
+}
+
 void
 capabilities_fill_cache (GabblePresenceCache *cache)
 {
diff --git a/src/capabilities.h b/src/capabilities.h
index 00ca15e..e5d1d6f 100644
--- a/src/capabilities.h
+++ b/src/capabilities.h
@@ -71,6 +71,8 @@ void capabilities_fill_cache (GabblePresenceCache *cache);
  */
 GabblePresenceCapabilities capabilities_get_initial_caps (void);
 
+GabblePresenceCapabilities capabilities_parse (LmMessageNode *query_result);
+
 typedef GabblePresenceCapabilities (*TypeFlagsToCapsFunc) (guint typeflags);
 typedef guint (*CapsToTypeFlagsFunc) (GabblePresenceCapabilities caps);
 
diff --git a/src/presence-cache.c b/src/presence-cache.c
index b03183c..9bf76ff 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -38,6 +38,7 @@
 
 #define DEBUG_FLAG GABBLE_DEBUG_PRESENCE
 
+#include "capabilities.h"
 #include "caps-channel-manager.h"
 #include "caps-hash.h"
 #include "debug.h"
@@ -832,7 +833,6 @@ _caps_disco_cb (GabbleDisco *disco,
 {
   GSList *waiters, *i;
   DiscoWaiter *waiter_self;
-  LmMessageNode *child;
   GabblePresenceCache *cache;
   GabblePresenceCachePrivate *priv;
   TpHandleRepoIface *contact_repo;
@@ -922,55 +922,7 @@ _caps_disco_cb (GabbleDisco *disco,
     }
 
   /* parsing for Connection.Interface.Capabilities*/
-  for (child = query_result->children; NULL != child; child = child->next)
-    {
-      const gchar *var;
-
-      if (0 != strcmp (child->name, "feature"))
-        continue;
-
-      var = lm_message_node_get_attribute (child, "var");
-
-      if (NULL == var)
-        continue;
-
-      /* TODO: use a table that equates disco features to caps */
-      if (0 == strcmp (var, NS_GOOGLE_TRANSPORT_P2P))
-        caps |= PRESENCE_CAP_GOOGLE_TRANSPORT_P2P;
-      else if (0 == strcmp (var, NS_GOOGLE_FEAT_VOICE))
-        caps |= PRESENCE_CAP_GOOGLE_VOICE;
-      else if (0 == strcmp (var, NS_JINGLE015))
-        caps |= PRESENCE_CAP_JINGLE015;
-      else if (0 == strcmp (var, NS_JINGLE_DESCRIPTION_AUDIO))
-        caps |= PRESENCE_CAP_JINGLE_DESCRIPTION_AUDIO;
-      else if (0 == strcmp (var, NS_JINGLE_DESCRIPTION_VIDEO))
-        caps |= PRESENCE_CAP_JINGLE_DESCRIPTION_VIDEO;
-      else if (0 == strcmp (var, NS_CHAT_STATES))
-        caps |= PRESENCE_CAP_CHAT_STATES;
-      else if (0 == strcmp (var, NS_SI))
-        caps |= PRESENCE_CAP_SI;
-      else if (0 == strcmp (var, NS_BYTESTREAMS))
-        caps |= PRESENCE_CAP_BYTESTREAMS;
-      else if (0 == strcmp (var, NS_IBB))
-        caps |= PRESENCE_CAP_IBB;
-      else if (0 == strcmp (var, NS_TUBES))
-        caps |= PRESENCE_CAP_SI_TUBES;
-      else if (!tp_strdiff (var, NS_OLPC_BUDDY_PROPS "+notify") ||
-          !tp_strdiff (var, NS_OLPC_ACTIVITIES "+notify") ||
-          !tp_strdiff (var, NS_OLPC_CURRENT_ACTIVITY "+notify") ||
-          !tp_strdiff (var, NS_OLPC_ACTIVITY_PROPS "+notify"))
-        caps |= PRESENCE_CAP_OLPC_1;
-      else if (!tp_strdiff (var, NS_JINGLE_RTP))
-        caps |= PRESENCE_CAP_JINGLE_RTP;
-      else if (!tp_strdiff (var, NS_JINGLE032))
-        caps |= PRESENCE_CAP_JINGLE032;
-      else if (!tp_strdiff (var, NS_JINGLE_TRANSPORT_ICE))
-        caps |= PRESENCE_CAP_JINGLE_TRANSPORT_ICE;
-      else if (!tp_strdiff (var, NS_JINGLE_TRANSPORT_RAWUDP))
-        caps |= PRESENCE_CAP_JINGLE_TRANSPORT_RAWUDP;
-      else if (0 == strcmp (var, NS_FILE_TRANSFER))
-        caps |= PRESENCE_CAP_SI_FILE_TRANSFER;
-    }
+  caps = capabilities_parse (query_result);
 
   handle = tp_handle_ensure (contact_repo, jid, NULL, NULL);
   if (handle == 0)
-- 
1.5.6.5




More information about the telepathy-commits mailing list