[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