aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2012-05-07 19:39:21 +0800
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2012-05-08 15:13:07 +0800
commit50241f767ad46c4433864205a67410452a092c0b (patch)
tree7485246a38a82f6ae64fac8ecbf6a17ad584b7f6 /libempathy
parent5673bdb1c772ec6bb3b8c1257afbca0d06762681 (diff)
downloadgsoc2013-empathy-50241f767ad46c4433864205a67410452a092c0b.tar
gsoc2013-empathy-50241f767ad46c4433864205a67410452a092c0b.tar.gz
gsoc2013-empathy-50241f767ad46c4433864205a67410452a092c0b.tar.bz2
gsoc2013-empathy-50241f767ad46c4433864205a67410452a092c0b.tar.lz
gsoc2013-empathy-50241f767ad46c4433864205a67410452a092c0b.tar.xz
gsoc2013-empathy-50241f767ad46c4433864205a67410452a092c0b.tar.zst
gsoc2013-empathy-50241f767ad46c4433864205a67410452a092c0b.zip
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
Diffstat (limited to 'libempathy')
-rw-r--r--libempathy/empathy-tp-chat.c75
1 files changed, 12 insertions, 63 deletions
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,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);