diff options
author | Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> | 2011-05-26 17:07:27 +0100 |
---|---|---|
committer | Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> | 2011-05-26 19:50:26 +0100 |
commit | 2954fe8bfbcf70e01a11e15a6672b3a0c6f8d37c (patch) | |
tree | 282f631fd698980746dd884b0f13b0b2348bb34d | |
parent | 0410a2ea2db77992225a9456203ada051f3d3723 (diff) |
Correctly track call members
We were assuming that flags_changed in MembersChanged had all
the call members, but that's not right as there may be several
members and only a few changing their flags. We now correctly
update the members.
This also fixes a possible assertion failure when unreffing
a NULL pointer.
-rw-r--r-- | telepathy-yell/call-channel.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/telepathy-yell/call-channel.c b/telepathy-yell/call-channel.c index ee600b2..643a77f 100644 --- a/telepathy-yell/call-channel.c +++ b/telepathy-yell/call-channel.c @@ -117,6 +117,33 @@ enum /* signals */ static guint _signals[LAST_SIGNAL] = { 0, }; static void +update_call_members (TpyCallChannel *self, + GHashTable *flags_changed, + const GArray *removed) +{ + GHashTableIter iter; + gpointer key, value; + TpHandle handle; + guint i; + + if (flags_changed != NULL) + { + g_hash_table_iter_init (&iter, flags_changed); + while (g_hash_table_iter_next (&iter, &key, &value)) + g_hash_table_insert (self->priv->members, key, value); + } + + if (removed != NULL) + { + for (i = 0; i < removed->len; i++) + { + handle = g_array_index (removed, TpHandle, i); + g_hash_table_remove (self->priv->members, GUINT_TO_POINTER (handle)); + } + } +} + +static void maybe_go_to_ready (TpyCallChannel *self) { TpyCallChannelPrivate *priv = self->priv; @@ -224,11 +251,11 @@ on_call_members_changed_cb (TpProxy *proxy, { TpyCallChannel *self = TPY_CALL_CHANNEL (proxy); - DEBUG ("Call members changed: %d members", - g_hash_table_size (flags_changed)); + DEBUG ("Call members: %d changed, %d removed", + g_hash_table_size (flags_changed), + removed->len); - g_hash_table_unref (self->priv->members); - self->priv->members = g_hash_table_ref (flags_changed); + update_call_members (self, flags_changed, removed); g_signal_emit (self, _signals[MEMBERS_CHANGED], 0, self->priv->members); } @@ -291,9 +318,7 @@ on_call_channel_get_all_properties_cb (TpProxy *proxy, hash_table = tp_asv_get_boxed (properties, "CallMembers", TPY_HASH_TYPE_CALL_MEMBER_MAP); - if (hash_table != NULL) - self->priv->members = g_boxed_copy (TPY_HASH_TYPE_CALL_MEMBER_MAP, - hash_table); + update_call_members (self, hash_table, NULL); contents = tp_asv_get_boxed (properties, "Contents", TP_ARRAY_TYPE_OBJECT_PATH_LIST); @@ -338,6 +363,7 @@ tpy_call_channel_dispose (GObject *obj) tp_clear_pointer (&self->priv->contents, g_ptr_array_unref); tp_clear_pointer (&self->priv->details, g_hash_table_unref); + tp_clear_pointer (&self->priv->members, g_hash_table_unref); tp_clear_object (&self->priv->result); @@ -665,6 +691,8 @@ tpy_call_channel_init (TpyCallChannel *self) TPY_TYPE_CALL_CHANNEL, TpyCallChannelPrivate); self->priv->contents = g_ptr_array_new_with_free_func (g_object_unref); + + self->priv->members = g_hash_table_new (g_direct_hash, g_direct_equal); } /** |