[empathy] tp-chat: stop using the contact factory when building message
- From: Guillaume Desmottes <gdesmott src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [empathy] tp-chat: stop using the contact factory when building message
- Date: Tue, 8 May 2012 07:13:34 +0000 (UTC)
commit 50241f767ad46c4433864205a67410452a092c0b
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date: Mon May 7 13:39:21 2012 +0200
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 files changed, 12 insertions(+), 63 deletions(-)
---
diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c
index b35290c..6a8080e 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,59 +239,13 @@ 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,
gboolean incoming)
@@ -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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]