aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-01-14 20:48:22 +0800
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-01-14 20:59:29 +0800
commita551a0d1cdf34a3f36d21d235257a652db264f7e (patch)
tree574c97825a5d130c2c9b1a1c8008d26f7f42003c
parentb61b45cfe0862f75d7d60708484a588bb54c9cae (diff)
downloadgsoc2013-empathy-a551a0d1cdf34a3f36d21d235257a652db264f7e.tar
gsoc2013-empathy-a551a0d1cdf34a3f36d21d235257a652db264f7e.tar.gz
gsoc2013-empathy-a551a0d1cdf34a3f36d21d235257a652db264f7e.tar.bz2
gsoc2013-empathy-a551a0d1cdf34a3f36d21d235257a652db264f7e.tar.lz
gsoc2013-empathy-a551a0d1cdf34a3f36d21d235257a652db264f7e.tar.xz
gsoc2013-empathy-a551a0d1cdf34a3f36d21d235257a652db264f7e.tar.zst
gsoc2013-empathy-a551a0d1cdf34a3f36d21d235257a652db264f7e.zip
factor out channel_classes_to_capabilities
-rw-r--r--libempathy/empathy-tp-contact-factory.c122
1 files changed, 58 insertions, 64 deletions
diff --git a/libempathy/empathy-tp-contact-factory.c b/libempathy/empathy-tp-contact-factory.c
index ac5a7f2c4..e7220d630 100644
--- a/libempathy/empathy-tp-contact-factory.c
+++ b/libempathy/empathy-tp-contact-factory.c
@@ -630,6 +630,57 @@ tp_contact_factory_location_updated_cb (TpConnection *tp_conn,
tp_contact_factory_update_location (tp_factory, handle, location);
}
+static EmpathyCapabilities
+channel_classes_to_capabilities (GPtrArray *classes,
+ gboolean audio_video)
+{
+ EmpathyCapabilities capabilities = 0;
+ guint i;
+
+ for (i = 0; i < classes->len; i++) {
+ GValueArray *class_struct;
+ GHashTable *fixed_prop;
+ GStrv allowed_prop;
+ TpHandleType handle_type;
+ const gchar *chan_type;
+
+ class_struct = g_ptr_array_index (classes, i);
+ fixed_prop = g_value_get_boxed (g_value_array_get_nth (class_struct, 0));
+ allowed_prop = g_value_get_boxed (g_value_array_get_nth (class_struct, 1));
+
+ handle_type = tp_asv_get_uint32 (fixed_prop,
+ TP_IFACE_CHANNEL ".TargetHandleType", NULL);
+ if (handle_type != TP_HANDLE_TYPE_CONTACT)
+ continue;
+
+ chan_type = tp_asv_get_string (fixed_prop,
+ TP_IFACE_CHANNEL ".ChannelType");
+
+ if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER)) {
+ capabilities |= EMPATHY_CAPABILITIES_FT;
+ }
+
+ else if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_STREAM_TUBE)) {
+ capabilities |= EMPATHY_CAPABILITIES_STREAM_TUBE;
+ }
+ else if (audio_video && !tp_strdiff (chan_type,
+ TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA)) {
+ guint j;
+
+ for (j = 0; allowed_prop[j] != NULL; j++) {
+ if (!tp_strdiff (allowed_prop[j],
+ TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA ".InitialAudio"))
+ capabilities |= EMPATHY_CAPABILITIES_AUDIO;
+ else if (!tp_strdiff (allowed_prop[j],
+ TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA ".InitialVideo"))
+ capabilities |= EMPATHY_CAPABILITIES_VIDEO;
+ }
+ }
+ }
+
+ return capabilities;
+}
+
static void
get_requestable_channel_classes_cb (TpProxy *connection,
const GValue *value,
@@ -640,8 +691,8 @@ get_requestable_channel_classes_cb (TpProxy *connection,
EmpathyTpContactFactory *self = EMPATHY_TP_CONTACT_FACTORY (weak_object);
EmpathyTpContactFactoryPriv *priv = GET_PRIV (self);
GPtrArray *classes;
- guint i;
GList *l;
+ EmpathyCapabilities capabilities;
if (error != NULL) {
DEBUG ("Error: %s", error->message);
@@ -649,32 +700,13 @@ get_requestable_channel_classes_cb (TpProxy *connection,
}
classes = g_value_get_boxed (value);
- for (i = 0; i < classes->len; i++) {
- GValueArray *class_struct;
- GHashTable *fixed_prop;
- GValue *chan_type, *handle_type;
- class_struct = g_ptr_array_index (classes, i);
- fixed_prop = g_value_get_boxed (g_value_array_get_nth (class_struct, 0));
-
- handle_type = g_hash_table_lookup (fixed_prop,
- TP_IFACE_CHANNEL ".TargetHandleType");
- if (handle_type == NULL ||
- g_value_get_uint (handle_type) != TP_HANDLE_TYPE_CONTACT)
- continue;
+ capabilities = channel_classes_to_capabilities (classes, FALSE);
+ if ((capabilities & EMPATHY_CAPABILITIES_FT) != 0)
+ priv->can_request_ft = TRUE;
- chan_type = g_hash_table_lookup (fixed_prop,
- TP_IFACE_CHANNEL ".ChannelType");
- if (chan_type == NULL)
- continue;
-
- if (!tp_strdiff (g_value_get_string (chan_type),
- TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER))
- priv->can_request_ft = TRUE;
- else if (!tp_strdiff (g_value_get_string (chan_type),
- TP_IFACE_CHANNEL_TYPE_STREAM_TUBE))
- priv->can_request_st = TRUE;
- }
+ if ((capabilities & EMPATHY_CAPABILITIES_STREAM_TUBE) != 0)
+ priv->can_request_st = TRUE;
if (!priv->can_request_ft && !priv->can_request_st)
return ;
@@ -741,7 +773,6 @@ update_contact_capabilities (EmpathyTpContactFactory *self,
while (g_hash_table_iter_next (&iter, &key, &value)) {
TpHandle handle = GPOINTER_TO_UINT (key);
GPtrArray *classes = value;
- guint i;
EmpathyContact *contact;
EmpathyCapabilities capabilities;
@@ -752,44 +783,7 @@ update_contact_capabilities (EmpathyTpContactFactory *self,
capabilities = empathy_contact_get_capabilities (contact);
capabilities &= ~EMPATHY_CAPABILITIES_UNKNOWN;
- for (i = 0; i < classes->len; i++) {
- GValueArray *class_struct;
- GHashTable *fixed_prop;
- GStrv allowed_prop;
- TpHandleType handle_type;
- const gchar *chan_type;
-
- class_struct = g_ptr_array_index (classes, i);
- fixed_prop = g_value_get_boxed (g_value_array_get_nth (class_struct, 0));
- allowed_prop = g_value_get_boxed (g_value_array_get_nth (class_struct, 1));
-
- handle_type = tp_asv_get_uint32 (fixed_prop,
- TP_IFACE_CHANNEL ".TargetHandleType", NULL);
- if (handle_type != TP_HANDLE_TYPE_CONTACT)
- continue;
-
- chan_type = tp_asv_get_string (fixed_prop,
- TP_IFACE_CHANNEL ".ChannelType");
-
- if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER))
- capabilities |= EMPATHY_CAPABILITIES_FT;
-
- if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_STREAM_TUBE)) {
- capabilities |= EMPATHY_CAPABILITIES_STREAM_TUBE;
- }
- else if (!tp_strdiff (chan_type, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA)) {
- guint j;
-
- for (j = 0; allowed_prop[j] != NULL; j++) {
- if (!tp_strdiff (allowed_prop[j],
- TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA ".InitialAudio"))
- capabilities |= EMPATHY_CAPABILITIES_AUDIO;
- else if (!tp_strdiff (allowed_prop[j],
- TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA ".InitialVideo"))
- capabilities |= EMPATHY_CAPABILITIES_VIDEO;
- }
- }
- }
+ capabilities |= channel_classes_to_capabilities (classes, TRUE);
DEBUG ("Changing capabilities for contact %s (%d) to %d",
empathy_contact_get_id (contact),