diff options
author | Will Thompson <will.thompson@collabora.co.uk> | 2009-07-02 06:43:27 +0800 |
---|---|---|
committer | Will Thompson <will.thompson@collabora.co.uk> | 2009-07-02 06:43:27 +0800 |
commit | 5af5dedd2bd5a57f700d3abf7a326d0462494caa (patch) | |
tree | f330c95ffc94a0688b3882da11d1f434ad2725e0 /libempathy | |
parent | 0e9e2124eee55872b7e6209cbcfd626c9e366e40 (diff) | |
parent | fdbb5ae44e2b82a36f7103b63e5c8a2041faea6c (diff) | |
download | gsoc2013-empathy-5af5dedd2bd5a57f700d3abf7a326d0462494caa.tar gsoc2013-empathy-5af5dedd2bd5a57f700d3abf7a326d0462494caa.tar.gz gsoc2013-empathy-5af5dedd2bd5a57f700d3abf7a326d0462494caa.tar.bz2 gsoc2013-empathy-5af5dedd2bd5a57f700d3abf7a326d0462494caa.tar.lz gsoc2013-empathy-5af5dedd2bd5a57f700d3abf7a326d0462494caa.tar.xz gsoc2013-empathy-5af5dedd2bd5a57f700d3abf7a326d0462494caa.tar.zst gsoc2013-empathy-5af5dedd2bd5a57f700d3abf7a326d0462494caa.zip |
Merge branch 'part-reasons'
Diffstat (limited to 'libempathy')
-rw-r--r-- | libempathy/empathy-tp-chat.c | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c index ac61392e0..a3282818f 100644 --- a/libempathy/empathy-tp-chat.c +++ b/libempathy/empathy-tp-chat.c @@ -875,6 +875,34 @@ tp_chat_got_added_contacts_cb (EmpathyTpContactFactory *factory, tp_chat_check_if_ready (EMPATHY_TP_CHAT (chat)); } +static EmpathyContact * +chat_lookup_contact (EmpathyTpChat *chat, + TpHandle handle, + gboolean remove) +{ + EmpathyTpChatPriv *priv = GET_PRIV (chat); + GList *l; + + for (l = priv->members; l; l = l->next) { + EmpathyContact *c = l->data; + + if (empathy_contact_get_handle (c) != handle) { + continue; + } + + if (remove) { + /* Caller takes the reference. */ + priv->members = g_list_delete_link (priv->members, l); + } else { + g_object_ref (c); + } + + return c; + } + + return NULL; +} + static void tp_chat_group_members_changed_cb (TpChannel *self, gchar *message, @@ -888,23 +916,30 @@ tp_chat_group_members_changed_cb (TpChannel *self, { EmpathyTpChatPriv *priv = GET_PRIV (chat); EmpathyContact *contact; - TpHandle handle; + EmpathyContact *actor_contact = NULL; guint i; - GList *l; + + if (actor != 0) { + actor_contact = chat_lookup_contact (chat, actor, FALSE); + if (actor_contact == NULL) { + /* FIXME: handle this a tad more gracefully: perhaps + * the actor was a server op. We could use the + * contact-ids detail of MembersChangedDetailed. + */ + DEBUG ("actor %u not a channel member", actor); + } + } /* Remove contacts that are not members anymore */ for (i = 0; i < removed->len; i++) { - for (l = priv->members; l; l = l->next) { - contact = l->data; - handle = empathy_contact_get_handle (contact); - if (handle == g_array_index (removed, TpHandle, i)) { - priv->members = g_list_delete_link (priv->members, l); - g_signal_emit_by_name (chat, "members-changed", - contact, NULL, reason, - message, FALSE); - g_object_unref (contact); - break; - } + contact = chat_lookup_contact (chat, + g_array_index (removed, TpHandle, i), TRUE); + + if (contact != NULL) { + g_signal_emit_by_name (chat, "members-changed", contact, + actor_contact, reason, message, + FALSE); + g_object_unref (contact); } } @@ -917,6 +952,10 @@ tp_chat_group_members_changed_cb (TpChannel *self, } tp_chat_update_remote_contact (chat); + + if (actor_contact != NULL) { + g_object_unref (actor_contact); + } } static void |