[empathy] tp-chat: Wait that all the pending messages have been added to the pending queue
- From: Guillaume Desmottes <gdesmott src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [empathy] tp-chat: Wait that all the pending messages have been added to the pending queue
- Date: Mon, 28 Jun 2010 16:23:35 +0000 (UTC)
commit ab65204f5cf4788225d96871f42b7fbb08364665
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date: Mon Jun 28 17:50:09 2010 +0200
tp-chat: Wait that all the pending messages have been added to the pending queue
EmpathyChat which is using the TpChat should be sure that all the pending
messages have been processed so it can rely on
empathy_tp_chat_get_pending_messages() to return all the pending messages.
If not, it can't check if the message it receives from the logger are actually
pending ones and so will display them twice (#622729).
libempathy/empathy-tp-chat.c | 40 ++++++++++++++++++++++++++++++----------
1 files changed, 30 insertions(+), 10 deletions(-)
---
diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c
index a9a63f5..be266e6 100644
--- a/libempathy/empathy-tp-chat.c
+++ b/libempathy/empathy-tp-chat.c
@@ -204,6 +204,23 @@ tp_chat_get_members (EmpathyContactList *list)
}
static void
+check_ready (EmpathyTpChat *chat)
+{
+ EmpathyTpChatPriv *priv = GET_PRIV (chat);
+
+ if (priv->ready)
+ return;
+
+ if (g_queue_get_length (priv->messages_queue) > 0)
+ return;
+
+ DEBUG ("Ready");
+
+ priv->ready = TRUE;
+ g_object_notify (G_OBJECT (chat), "ready");
+}
+
+static void
tp_chat_emit_queued_messages (EmpathyTpChat *chat)
{
EmpathyTpChatPriv *priv = GET_PRIV (chat);
@@ -220,6 +237,8 @@ tp_chat_emit_queued_messages (EmpathyTpChat *chat)
g_queue_push_tail (priv->pending_messages_queue, message);
g_signal_emit (chat, signals[MESSAGE_RECEIVED], 0, message);
}
+
+ check_ready (chat);
}
static void
@@ -495,6 +514,8 @@ tp_chat_list_pending_messages_cb (TpChannel *channel,
acknowledge_messages (chat, empty_non_text_content_ids);
g_array_free (empty_non_text_content_ids, TRUE);
}
+
+ check_ready (chat);
}
static void
@@ -797,7 +818,7 @@ tp_chat_finalize (GObject *object)
}
static void
-tp_chat_check_if_ready (EmpathyTpChat *chat)
+check_almost_ready (EmpathyTpChat *chat)
{
EmpathyTpChatPriv *priv = GET_PRIV (chat);
@@ -817,13 +838,14 @@ tp_chat_check_if_ready (EmpathyTpChat *chat)
priv->remote_contact == NULL)
return;
- DEBUG ("Ready!");
-
tp_cli_channel_type_text_connect_to_received (priv->channel,
tp_chat_received_cb,
NULL, NULL,
G_OBJECT (chat), NULL);
priv->listing_pending_messages = TRUE;
+
+ /* TpChat will be ready once ListPendingMessages returned and all the messages
+ * have been added to the pending messages queue. */
tp_cli_channel_type_text_call_list_pending_messages (priv->channel, -1,
FALSE,
tp_chat_list_pending_messages_cb,
@@ -842,8 +864,6 @@ tp_chat_check_if_ready (EmpathyTpChat *chat)
tp_chat_state_changed_cb,
NULL, NULL,
G_OBJECT (chat), NULL);
- priv->ready = TRUE;
- g_object_notify (G_OBJECT (chat), "ready");
}
static void
@@ -942,7 +962,7 @@ tp_chat_got_added_contacts_cb (TpConnection *connection,
}
tp_chat_update_remote_contact (EMPATHY_TP_CHAT (chat));
- tp_chat_check_if_ready (EMPATHY_TP_CHAT (chat));
+ check_almost_ready (EMPATHY_TP_CHAT (chat));
}
static EmpathyContact *
@@ -1052,7 +1072,7 @@ tp_chat_got_renamed_contacts_cb (TpConnection *connection,
}
tp_chat_update_remote_contact (EMPATHY_TP_CHAT (chat));
- tp_chat_check_if_ready (EMPATHY_TP_CHAT (chat));
+ check_almost_ready (EMPATHY_TP_CHAT (chat));
}
@@ -1148,7 +1168,7 @@ tp_chat_got_remote_contact_cb (TpConnection *connection,
priv->remote_contact = g_object_ref (contact);
g_object_notify (chat, "remote-contact");
- tp_chat_check_if_ready (EMPATHY_TP_CHAT (chat));
+ check_almost_ready (EMPATHY_TP_CHAT (chat));
}
static void
@@ -1168,7 +1188,7 @@ tp_chat_got_self_contact_cb (TpConnection *connection,
priv->user = g_object_ref (contact);
empathy_contact_set_is_user (priv->user, TRUE);
- tp_chat_check_if_ready (EMPATHY_TP_CHAT (chat));
+ check_almost_ready (EMPATHY_TP_CHAT (chat));
}
static void
@@ -1206,7 +1226,7 @@ got_password_flags_cb (TpChannel *proxy,
priv->got_password_flags = TRUE;
priv->password_flags = password_flags;
- tp_chat_check_if_ready (EMPATHY_TP_CHAT (self));
+ check_almost_ready (EMPATHY_TP_CHAT (self));
}
static GObject *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]