From 50241f767ad46c4433864205a67410452a092c0b Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 7 May 2012 13:39:21 +0200 Subject: tp-chat: stop using the contact factory when building message Messages are now synchronously proccessed so we don't have to keep an internal queue of messages being prepared. We also need to complete the preparation of the EmpathyTpChat feature in idle as it's now prepared synchronously as well. https://bugzilla.gnome.org/show_bug.cgi?id=675597 --- libempathy/empathy-tp-chat.c | 75 +++++++------------------------------------- 1 file changed, 12 insertions(+), 63 deletions(-) (limited to 'libempathy') diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c index b35290cde..6a8080e9d 100644 --- a/libempathy/empathy-tp-chat.c +++ b/libempathy/empathy-tp-chat.c @@ -41,8 +41,6 @@ struct _EmpathyTpChatPrivate EmpathyContact *user; EmpathyContact *remote_contact; GList *members; - /* Queue of messages not signalled yet */ - GQueue *messages_queue; /* Queue of messages signalled but not acked yet */ GQueue *pending_messages_queue; @@ -241,58 +239,12 @@ check_ready (EmpathyTpChat *self) if (self->priv->ready_result == NULL) return; - if (g_queue_get_length (self->priv->messages_queue) > 0) - return; - DEBUG ("Ready"); - g_simple_async_result_complete (self->priv->ready_result); + g_simple_async_result_complete_in_idle (self->priv->ready_result); tp_clear_object (&self->priv->ready_result); } -static void -tp_chat_emit_queued_messages (EmpathyTpChat *self) -{ - EmpathyMessage *message; - - /* Check if we can now emit some queued messages */ - while ((message = g_queue_peek_head (self->priv->messages_queue)) != NULL) - { - if (empathy_message_get_sender (message) == NULL) - break; - - DEBUG ("Queued message ready"); - g_queue_pop_head (self->priv->messages_queue); - g_queue_push_tail (self->priv->pending_messages_queue, message); - g_signal_emit (self, signals[MESSAGE_RECEIVED], 0, message); - } - - check_ready (self); -} - -static void -tp_chat_got_sender_cb (TpConnection *connection, - EmpathyContact *contact, - const GError *error, - gpointer message, - GObject *chat) -{ - EmpathyTpChat *self = (EmpathyTpChat *) chat; - - if (error) - { - DEBUG ("Error: %s", error->message); - /* Do not block the message queue, just drop this message */ - g_queue_remove (self->priv->messages_queue, message); - } - else - { - empathy_message_set_sender (message, contact); - } - - tp_chat_emit_queued_messages (EMPATHY_TP_CHAT (self)); -} - static void tp_chat_build_message (EmpathyTpChat *self, TpMessage *msg, @@ -305,26 +257,26 @@ tp_chat_build_message (EmpathyTpChat *self, /* FIXME: this is actually a lie for incoming messages. */ empathy_message_set_receiver (message, self->priv->user); - g_queue_push_tail (self->priv->messages_queue, message); - sender = tp_signalled_message_get_sender (msg); g_assert (sender != NULL); if (tp_contact_get_handle (sender) == 0) { empathy_message_set_sender (message, self->priv->user); - tp_chat_emit_queued_messages (self); } else { - TpConnection *connection = tp_channel_borrow_connection ( - (TpChannel *) self); + EmpathyContact *contact; + + contact = empathy_contact_dup_from_tp_contact (sender); - empathy_tp_contact_factory_get_from_handle (connection, - tp_contact_get_handle (sender), - tp_chat_got_sender_cb, - message, NULL, G_OBJECT (self)); + empathy_message_set_sender (message, contact); + + g_object_unref (contact); } + + g_queue_push_tail (self->priv->pending_messages_queue, message); + g_signal_emit (self, signals[MESSAGE_RECEIVED], 0, message); } static void @@ -755,9 +707,6 @@ tp_chat_dispose (GObject *object) tp_clear_object (&self->priv->remote_contact); tp_clear_object (&self->priv->user); - g_queue_foreach (self->priv->messages_queue, (GFunc) g_object_unref, NULL); - g_queue_clear (self->priv->messages_queue); - g_queue_foreach (self->priv->pending_messages_queue, (GFunc) g_object_unref, NULL); g_queue_clear (self->priv->pending_messages_queue); @@ -775,7 +724,6 @@ tp_chat_finalize (GObject *object) DEBUG ("Finalize: %p", object); - g_queue_free (self->priv->messages_queue); g_queue_free (self->priv->pending_messages_queue); g_hash_table_unref (self->priv->messages_being_sent); @@ -817,6 +765,8 @@ check_almost_ready (EmpathyTpChat *self) tp_g_signal_connect_object (self, "message-sent", G_CALLBACK (message_sent_cb), self, 0); + /* TODO: use the TpContact signal once it's released + * (fdo #49215) */ tp_g_signal_connect_object (self, "chat-state-changed", G_CALLBACK (tp_chat_state_changed_cb), self, 0); @@ -1196,7 +1146,6 @@ empathy_tp_chat_init (EmpathyTpChat *self) self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_TP_CHAT, EmpathyTpChatPrivate); - self->priv->messages_queue = g_queue_new (); self->priv->pending_messages_queue = g_queue_new (); self->priv->messages_being_sent = g_hash_table_new_full ( g_str_hash, g_str_equal, g_free, NULL); -- cgit v1.2.3