aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy/empathy-tp-chat.c
diff options
context:
space:
mode:
authorWill Thompson <will.thompson@collabora.co.uk>2009-07-02 06:43:27 +0800
committerWill Thompson <will.thompson@collabora.co.uk>2009-07-02 06:43:27 +0800
commit5af5dedd2bd5a57f700d3abf7a326d0462494caa (patch)
treef330c95ffc94a0688b3882da11d1f434ad2725e0 /libempathy/empathy-tp-chat.c
parent0e9e2124eee55872b7e6209cbcfd626c9e366e40 (diff)
parentfdbb5ae44e2b82a36f7103b63e5c8a2041faea6c (diff)
downloadgsoc2013-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/empathy-tp-chat.c')
-rw-r--r--libempathy/empathy-tp-chat.c65
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