[telepathy-gabble/master] Construct contact capabilities from caps sets
Will Thompson
will.thompson at collabora.co.uk
Tue Sep 8 04:10:01 PDT 2009
Modify gabble_caps_channel_manager_get_contact_capabilities () to be in
terms of GabbleCapabilitySets, ignoring the per_channel_manager_caps
hash table, and update the GetContactCapabilities and
ContactCapabilitiesChanged implementations accordingly.
---
src/caps-channel-manager.c | 7 ++--
src/caps-channel-manager.h | 8 +++-
src/connection.c | 14 +++++++-
src/ft-manager.c | 33 ++++-------------
src/im-factory.c | 6 ++--
src/private-tubes-factory.c | 81 ++++++++++++------------------------------
6 files changed, 57 insertions(+), 92 deletions(-)
diff --git a/src/caps-channel-manager.c b/src/caps-channel-manager.c
index f6cc60d..fac86aa 100644
--- a/src/caps-channel-manager.c
+++ b/src/caps-channel-manager.c
@@ -60,10 +60,11 @@ gabble_caps_channel_manager_get_type (void)
/* Virtual-method wrappers */
-void gabble_caps_channel_manager_get_contact_capabilities (
+void
+gabble_caps_channel_manager_get_contact_capabilities (
GabbleCapsChannelManager *caps_manager,
- GabbleConnection *conn,
TpHandle handle,
+ const GabbleCapabilitySet *caps,
GPtrArray *arr)
{
GabbleCapsChannelManagerIface *iface =
@@ -72,7 +73,7 @@ void gabble_caps_channel_manager_get_contact_capabilities (
if (method != NULL)
{
- method (caps_manager, conn, handle, arr);
+ method (caps_manager, handle, caps, arr);
}
/* ... else assume there is not caps for this kind of channels */
}
diff --git a/src/caps-channel-manager.h b/src/caps-channel-manager.h
index 75b2e9a..80298be 100644
--- a/src/caps-channel-manager.h
+++ b/src/caps-channel-manager.h
@@ -56,7 +56,9 @@ typedef struct _GabbleCapsChannelManagerIface GabbleCapsChannelManagerIface;
/* May be moved to TpChannelManager later */
typedef void (*GabbleCapsChannelManagerGetContactCapsFunc) (
- GabbleCapsChannelManager *manager, GabbleConnection *conn, TpHandle handle,
+ GabbleCapsChannelManager *manager,
+ TpHandle handle,
+ const GabbleCapabilitySet *caps,
GPtrArray *arr);
typedef void (*GabbleCapsChannelManagerAddCapFunc) (
@@ -88,7 +90,9 @@ typedef gboolean (*GabbleCapsChannelManagerCapsDiffFunc) (
void gabble_caps_channel_manager_get_contact_capabilities (
- GabbleCapsChannelManager *manager, GabbleConnection *conn, TpHandle handle,
+ GabbleCapsChannelManager *caps_manager,
+ TpHandle handle,
+ const GabbleCapabilitySet *caps,
GPtrArray *arr);
void gabble_caps_channel_manager_get_feature_list (
diff --git a/src/connection.c b/src/connection.c
index c06d5bb..6b7a0f4 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -2336,18 +2336,30 @@ gabble_connection_get_handle_contact_capabilities (GabbleConnection *self,
TpHandle handle, GPtrArray *arr)
{
TpBaseConnection *base_conn = TP_BASE_CONNECTION (self);
+ GabblePresence *p;
+ GabbleCapabilitySet *caps;
TpChannelManagerIter iter;
TpChannelManager *manager;
+ if (handle == base_conn->self_handle)
+ p = self->self_presence;
+ else
+ p = gabble_presence_cache_get (self->presence_cache, handle);
+
+ caps = gabble_presence_get_caps (p);
+
tp_base_connection_channel_manager_iter_init (&iter, base_conn);
+
while (tp_base_connection_channel_manager_iter_next (&iter, &manager))
{
/* all channel managers must implement the capability interface */
g_assert (GABBLE_IS_CAPS_CHANNEL_MANAGER (manager));
gabble_caps_channel_manager_get_contact_capabilities (
- GABBLE_CAPS_CHANNEL_MANAGER (manager), self, handle, arr);
+ GABBLE_CAPS_CHANNEL_MANAGER (manager), handle, caps, arr);
}
+
+ gabble_capability_set_free (caps);
}
static void
diff --git a/src/ft-manager.c b/src/ft-manager.c
index a0d5d40..13abe9c 100644
--- a/src/ft-manager.c
+++ b/src/ft-manager.c
@@ -642,35 +642,18 @@ add_file_transfer_channel_class (GPtrArray *arr,
static void
gabble_ft_manager_get_contact_caps (GabbleCapsChannelManager *manager,
- GabbleConnection *conn,
- TpHandle handle,
- GPtrArray *arr)
+ TpHandle handle,
+ const GabbleCapabilitySet *caps,
+ GPtrArray *arr)
{
- TpBaseConnection *base = (TpBaseConnection *) conn;
- GabblePresence *presence;
+ GabbleFtManager *self = GABBLE_FT_MANAGER (manager);
g_assert (handle != 0);
- if (handle == base->self_handle)
- {
- /* We support file transfer */
- add_file_transfer_channel_class (arr, handle);
- return;
- }
-
- presence = gabble_presence_cache_get (conn->presence_cache, handle);
- if (presence == NULL)
- return;
-
- if (presence->per_channel_manager_caps == NULL)
- return;
-
- if (!GPOINTER_TO_INT (g_hash_table_lookup (presence->per_channel_manager_caps,
- manager)))
- return;
-
- /* FT is supported */
- add_file_transfer_channel_class (arr, handle);
+ /* We always support file transfer */
+ if (handle == self->priv->connection->parent.self_handle ||
+ gabble_capability_set_has (caps, NS_FILE_TRANSFER))
+ add_file_transfer_channel_class (arr, handle);
}
static gpointer
diff --git a/src/im-factory.c b/src/im-factory.c
index 0f09a88..8f5cccc 100644
--- a/src/im-factory.c
+++ b/src/im-factory.c
@@ -451,9 +451,9 @@ connection_status_changed_cb (GabbleConnection *conn,
static void
gabble_im_factory_get_contact_caps (GabbleCapsChannelManager *manager,
- GabbleConnection *conn,
- TpHandle handle,
- GPtrArray *arr)
+ TpHandle handle,
+ const GabbleCapabilitySet *caps,
+ GPtrArray *arr)
{
/* We don't need to check this contact's capabilities, we assume every
* contact support text channels. */
diff --git a/src/private-tubes-factory.c b/src/private-tubes-factory.c
index f23a291..c751100 100644
--- a/src/private-tubes-factory.c
+++ b/src/private-tubes-factory.c
@@ -416,7 +416,7 @@ gabble_private_tubes_factory_close_all (GabblePrivateTubesFactory *fac)
}
static void
-add_service_to_array (gchar *service,
+add_service_to_array (const gchar *service,
GPtrArray *arr,
TpTubeType type,
TpHandle handle)
@@ -545,77 +545,42 @@ add_generic_tube_caps (GPtrArray *arr)
g_ptr_array_add (arr, g_value_get_boxed (&monster2));
}
+#define STREAM_CAP_PREFIX (NS_TUBES "/stream#")
+#define DBUS_CAP_PREFIX (NS_TUBES "/dbus#")
+
static void
gabble_private_tubes_factory_get_contact_caps (
GabbleCapsChannelManager *manager,
- GabbleConnection *conn,
TpHandle handle,
+ const GabbleCapabilitySet *caps,
GPtrArray *arr)
{
- TpBaseConnection *base = (TpBaseConnection *) conn;
- TubesCapabilities *caps;
- GHashTable *stream_tube_caps;
- GHashTable *dbus_tube_caps;
- GabblePresence *presence;
- GHashTableIter tube_caps_iter;
- gpointer service;
-
- g_assert (handle != 0);
-
- if (handle == base->self_handle)
- presence = conn->self_presence;
- else
- presence = gabble_presence_cache_get (conn->presence_cache, handle);
+ GabblePrivateTubesFactory *self = GABBLE_PRIVATE_TUBES_FACTORY (manager);
+ gboolean supports_tubes;
+ guint i;
- if (presence == NULL)
- return;
+ /* Always claim that we support tubes. */
+ supports_tubes = (handle == self->priv->conn->parent.self_handle);
- if (handle == base->self_handle &&
- (presence->per_channel_manager_caps == NULL ||
- g_hash_table_lookup (presence->per_channel_manager_caps, manager)
- == NULL))
+ for (i = 0; i < caps->len; i++)
{
- /* No tubes capabilities have been set but we always support at
- * least generic tubes caps */
- add_generic_tube_caps (arr);
- return;
- }
+ const gchar *ns = g_ptr_array_index (caps, i);
- if (presence->per_channel_manager_caps == NULL)
- return;
-
- caps = g_hash_table_lookup (presence->per_channel_manager_caps, manager);
-
- if (caps == NULL)
- return;
-
- if (!caps->tubes_supported)
- return;
+ if (!g_str_has_prefix (ns, NS_TUBES))
+ continue;
- add_generic_tube_caps (arr);
+ supports_tubes = TRUE;
- stream_tube_caps = caps->stream_tube_caps;
- dbus_tube_caps = caps->dbus_tube_caps;
-
- if (stream_tube_caps != NULL)
- {
- g_hash_table_iter_init (&tube_caps_iter, stream_tube_caps);
- while (g_hash_table_iter_next (&tube_caps_iter, &service,
- NULL))
- {
- add_service_to_array (service, arr, TP_TUBE_TYPE_STREAM, handle);
- }
+ if (g_str_has_prefix (ns, STREAM_CAP_PREFIX))
+ add_service_to_array (ns + strlen (STREAM_CAP_PREFIX), arr,
+ TP_TUBE_TYPE_STREAM, handle);
+ else if (g_str_has_prefix (ns, DBUS_CAP_PREFIX))
+ add_service_to_array (ns + strlen (DBUS_CAP_PREFIX), arr,
+ TP_TUBE_TYPE_DBUS, handle);
}
- if (dbus_tube_caps != NULL)
- {
- g_hash_table_iter_init (&tube_caps_iter, dbus_tube_caps);
- while (g_hash_table_iter_next (&tube_caps_iter, &service,
- NULL))
- {
- add_service_to_array (service, arr, TP_TUBE_TYPE_DBUS, handle);
- }
- }
+ if (supports_tubes)
+ add_generic_tube_caps (arr);
}
static void
--
1.5.6.5
More information about the telepathy-commits
mailing list