[telepathy-gabble/telepathy-gabble-0.8] factor out capability URI extraction from messages
Dafydd Harries
dafydd.harries at collabora.co.uk
Tue Jan 12 11:02:05 PST 2010
Then, make GabbleCapsChannelManager's parse_caps take the resulting gchar **.
---
src/caps-channel-manager.c | 4 ++--
src/caps-channel-manager.h | 4 ++--
src/ft-manager.c | 19 ++++---------------
src/presence-cache.c | 39 +++++++++++++++++++++++++++++++++++----
src/private-tubes-factory.c | 35 +++++++++++++----------------------
5 files changed, 56 insertions(+), 45 deletions(-)
diff --git a/src/caps-channel-manager.c b/src/caps-channel-manager.c
index e3039f6..f833d33 100644
--- a/src/caps-channel-manager.c
+++ b/src/caps-channel-manager.c
@@ -95,7 +95,7 @@ void gabble_caps_channel_manager_get_feature_list (
gpointer gabble_caps_channel_manager_parse_capabilities (
GabbleCapsChannelManager *caps_manager,
- LmMessageNode *query_result)
+ gchar **uris)
{
GabbleCapsChannelManagerIface *iface =
GABBLE_CAPS_CHANNEL_MANAGER_GET_INTERFACE (caps_manager);
@@ -103,7 +103,7 @@ gpointer gabble_caps_channel_manager_parse_capabilities (
if (method != NULL)
{
- return method (caps_manager, query_result);
+ return method (caps_manager, uris);
}
/* ... else assume there is not caps for this kind of channels */
return NULL;
diff --git a/src/caps-channel-manager.h b/src/caps-channel-manager.h
index bc4b230..f622e10 100644
--- a/src/caps-channel-manager.h
+++ b/src/caps-channel-manager.h
@@ -68,7 +68,7 @@ typedef void (*GabbleCapsChannelManagerGetFeatureListFunc) (
GSList **features);
typedef gpointer (*GabbleCapsChannelManagerParseCapsFunc) (
- GabbleCapsChannelManager *manager, LmMessageNode *children);
+ GabbleCapsChannelManager *manager, gchar **uris);
typedef void (*GabbleCapsChannelManagerFreeCapsFunc) (
GabbleCapsChannelManager *manager, gpointer specific_caps);
@@ -95,7 +95,7 @@ void gabble_caps_channel_manager_get_feature_list (
GSList **features);
gpointer gabble_caps_channel_manager_parse_capabilities (
- GabbleCapsChannelManager *manager, LmMessageNode *query_result);
+ GabbleCapsChannelManager *caps_manager, gchar **uris);
void gabble_caps_channel_manager_free_capabilities (GabbleCapsChannelManager *manager,
gpointer specific_caps);
diff --git a/src/ft-manager.c b/src/ft-manager.c
index 8c8d9de..8fee5b9 100644
--- a/src/ft-manager.c
+++ b/src/ft-manager.c
@@ -705,24 +705,13 @@ gabble_ft_manager_get_feature_list (
static gpointer
gabble_ft_manager_parse_caps (GabbleCapsChannelManager *manager,
- LmMessageNode *query_result)
+ gchar **uris)
{
- NodeIter i;
+ gchar **i;
- for (i = node_iter (query_result); i; i = node_iter_next (i))
+ for (i = uris; *i; i++)
{
- LmMessageNode *child = node_iter_data (i);
- const gchar *var;
-
- if (0 != strcmp (child->name, "feature"))
- continue;
-
- var = lm_message_node_get_attribute (child, "var");
-
- if (NULL == var)
- continue;
-
- if (!tp_strdiff (var, NS_FILE_TRANSFER))
+ if (!tp_strdiff (*i, NS_FILE_TRANSFER))
return SOME_NON_NULL_POINTER;
}
diff --git a/src/presence-cache.c b/src/presence-cache.c
index 191594b..df24821 100644
--- a/src/presence-cache.c
+++ b/src/presence-cache.c
@@ -1013,9 +1013,36 @@ find_matching_waiter (GSList *waiters,
return NULL;
}
+static gchar **
+extract_capability_namespaces (LmMessageNode *query_result)
+{
+ GPtrArray *uris = g_ptr_array_new ();
+ NodeIter i;
+
+ for (i = node_iter (query_result); i; i = node_iter_next (i))
+ {
+ LmMessageNode *child = node_iter_data (i);
+ const gchar *var;
+
+ if (0 != strcmp (child->name, "feature"))
+ continue;
+
+ var = lm_message_node_get_attribute (child, "var");
+
+ if (NULL == var)
+ continue;
+
+ g_ptr_array_add (uris, g_strdup (var));
+ }
+
+ g_ptr_array_add (uris, NULL);
+ return (gchar **) g_ptr_array_free (uris, FALSE);
+}
+
static GHashTable *
-parse_contact_caps (TpBaseConnection *base_conn,
- LmMessageNode *query_result)
+parse_contact_caps (
+ TpBaseConnection *base_conn,
+ gchar **uris)
{
GHashTable *per_channel_manager_caps = g_hash_table_new (NULL, NULL);
TpChannelManagerIter iter;
@@ -1031,7 +1058,7 @@ parse_contact_caps (TpBaseConnection *base_conn,
g_assert (GABBLE_IS_CAPS_CHANNEL_MANAGER (manager));
factory_caps = gabble_caps_channel_manager_parse_capabilities (
- GABBLE_CAPS_CHANNEL_MANAGER (manager), query_result);
+ GABBLE_CAPS_CHANNEL_MANAGER (manager), uris);
if (factory_caps != NULL)
g_hash_table_insert (per_channel_manager_caps,
@@ -1120,6 +1147,7 @@ _caps_disco_cb (GabbleDisco *disco,
TpBaseConnection *base_conn;
gchar *resource;
gboolean jid_is_valid;
+ gchar **uris = NULL;
cache = GABBLE_PRESENCE_CACHE (user_data);
priv = GABBLE_PRESENCE_CACHE_PRIV (cache);
@@ -1165,7 +1193,8 @@ _caps_disco_cb (GabbleDisco *disco,
}
caps = capabilities_parse (query_result);
- per_channel_manager_caps = parse_contact_caps (base_conn, query_result);
+ uris = extract_capability_namespaces (query_result);
+ per_channel_manager_caps = parse_contact_caps (base_conn, uris);
/* Only 'sha-1' is mandatory to implement by XEP-0115. If the remote contact
* uses another hash algorithm, don't check the hash and fallback to the old
@@ -1260,6 +1289,8 @@ _caps_disco_cb (GabbleDisco *disco,
}
OUT:
+ g_strfreev (uris);
+
if (handle)
tp_handle_unref (contact_repo, handle);
}
diff --git a/src/private-tubes-factory.c b/src/private-tubes-factory.c
index 67cf433..1607fae 100644
--- a/src/private-tubes-factory.c
+++ b/src/private-tubes-factory.c
@@ -661,10 +661,10 @@ gabble_private_tubes_factory_free_feat (gpointer data)
static gpointer
gabble_private_tubes_factory_parse_caps (
GabbleCapsChannelManager *manager,
- LmMessageNode *query_result)
+ gchar **uris)
{
TubesCapabilities *caps;
- NodeIter i;
+ gchar **i;
caps = g_new0 (TubesCapabilities, 1);
caps->stream_tube_caps = g_hash_table_new_full (g_str_hash, g_str_equal,
@@ -672,41 +672,32 @@ gabble_private_tubes_factory_parse_caps (
caps->dbus_tube_caps = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, gabble_private_tubes_factory_free_feat);
- for (i = node_iter (query_result); i; i = node_iter_next (i))
+ for (i = uris; *i; i++)
{
- LmMessageNode *child = node_iter_data (i);
- const gchar *var;
+ const gchar *uri = *i;
- if (0 != strcmp (child->name, "feature"))
- continue;
-
- var = lm_message_node_get_attribute (child, "var");
-
- if (NULL == var)
- continue;
-
- if (!g_str_has_prefix (var, NS_TUBES))
+ if (!g_str_has_prefix (uri, NS_TUBES))
continue;
/* tubes generic cap or service specific */
caps->tubes_supported = TRUE;
- if (g_str_has_prefix (var, NS_TUBES "/"))
+ if (g_str_has_prefix (uri, NS_TUBES "/"))
{
/* http://telepathy.freedesktop.org/xmpp/tubes/$type#$service */
- var += strlen (NS_TUBES "/");
- if (g_str_has_prefix (var, "stream#"))
+ uri += strlen (NS_TUBES "/");
+ if (g_str_has_prefix (uri, "stream#"))
{
gchar *service;
- var += strlen ("stream#");
- service = g_strdup (var);
+ uri += strlen ("stream#");
+ service = g_strdup (uri);
g_hash_table_insert (caps->stream_tube_caps, service, NULL);
}
- else if (g_str_has_prefix (var, "dbus#"))
+ else if (g_str_has_prefix (uri, "dbus#"))
{
gchar *service;
- var += strlen ("dbus#");
- service = g_strdup (var);
+ uri += strlen ("dbus#");
+ service = g_strdup (uri);
g_hash_table_insert (caps->dbus_tube_caps, service, NULL);
}
}
--
1.5.6.5
More information about the telepathy-commits
mailing list