[empathy] chat-manager: add API to track the number of handled chats



commit f116e5268165cce8c67d6876b6819790ba29c683
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date:   Tue Oct 19 16:11:11 2010 +0200

    chat-manager: add API to track the number of handled chats

 src/empathy-chat-manager.c |   61 ++++++++++++++++++++++++++++++++++++++++++++
 src/empathy-chat-manager.h |    2 +
 2 files changed, 63 insertions(+), 0 deletions(-)
---
diff --git a/src/empathy-chat-manager.c b/src/empathy-chat-manager.c
index 2a0fe10..7ec0882 100644
--- a/src/empathy-chat-manager.c
+++ b/src/empathy-chat-manager.c
@@ -32,6 +32,7 @@
 
 enum {
   CLOSED_CHATS_CHANGED,
+  HANDLED_CHATS_CHANGED,
   LAST_SIGNAL
 };
 
@@ -47,6 +48,8 @@ struct _EmpathyChatManagerPriv
   /* Queue of (ChatData *) representing the closed chats */
   GQueue *closed_queue;
 
+  guint num_handled_channels;
+
   TpBaseClient *handler;
 };
 
@@ -202,6 +205,24 @@ tp_chat_ready_cb (GObject *object,
 }
 
 static void
+channel_invalidated (TpChannel *channel,
+    guint domain,
+    gint code,
+    gchar *message,
+    EmpathyChatManager *self)
+{
+  EmpathyChatManagerPriv *priv = GET_PRIV (self);
+
+  priv->num_handled_channels--;
+
+  DEBUG ("Channel closed; we are now handling %u text channels",
+      priv->num_handled_channels);
+
+  g_signal_emit (self, signals[HANDLED_CHATS_CHANGED], 0,
+      priv->num_handled_channels);
+}
+
+static void
 handle_channels (TpSimpleHandler *handler,
     TpAccount *account,
     TpConnection *connection,
@@ -211,13 +232,21 @@ handle_channels (TpSimpleHandler *handler,
     TpHandleChannelsContext *context,
     gpointer user_data)
 {
+  EmpathyChatManager *self = (EmpathyChatManager *) user_data;
+  EmpathyChatManagerPriv *priv = GET_PRIV (self);
   GList *l;
+  gboolean handling = FALSE;
 
   for (l = channels; l != NULL; l = g_list_next (l))
     {
       TpChannel *channel = l->data;
       EmpathyTpChat *tp_chat;
 
+      if (tp_proxy_get_invalidated (channel) != NULL)
+        continue;
+
+      handling = TRUE;
+
       tp_chat = empathy_tp_chat_new (account, channel);
 
       if (empathy_tp_chat_is_ready (tp_chat))
@@ -232,9 +261,23 @@ handle_channels (TpSimpleHandler *handler,
           ctx->sig_id = g_signal_connect (tp_chat, "notify::ready",
               G_CALLBACK (tp_chat_ready_cb), ctx);
         }
+
+      priv->num_handled_channels++;
+
+      g_signal_connect (channel, "invalidated",
+          G_CALLBACK (channel_invalidated), self);
     }
 
   tp_handle_channels_context_accept (context);
+
+  if (handling)
+    {
+      DEBUG ("Channels handled; we are now handling %u text channels",
+          priv->num_handled_channels);
+
+      g_signal_emit (self, signals[HANDLED_CHATS_CHANGED], 0,
+          priv->num_handled_channels);
+    }
 }
 
 static void
@@ -346,6 +389,16 @@ empathy_chat_manager_class_init (
         G_TYPE_NONE,
         1, G_TYPE_UINT, NULL);
 
+  signals[HANDLED_CHATS_CHANGED] =
+    g_signal_new ("handled-chats-changed",
+        G_TYPE_FROM_CLASS (object_class),
+        G_SIGNAL_RUN_LAST,
+        0,
+        NULL, NULL,
+        g_cclosure_marshal_VOID__UINT,
+        G_TYPE_NONE,
+        1, G_TYPE_UINT, NULL);
+
   g_type_class_add_private (empathy_chat_manager_class,
     sizeof (EmpathyChatManagerPriv));
 }
@@ -408,3 +461,11 @@ empathy_chat_manager_get_num_closed_chats (EmpathyChatManager *self)
 
   return g_queue_get_length (priv->closed_queue);
 }
+
+guint
+empathy_chat_manager_get_num_handled_chats (EmpathyChatManager *self)
+{
+  EmpathyChatManagerPriv *priv = GET_PRIV (self);
+
+  return priv->num_handled_channels;
+}
diff --git a/src/empathy-chat-manager.h b/src/empathy-chat-manager.h
index 6d249b3..ee43857 100644
--- a/src/empathy-chat-manager.h
+++ b/src/empathy-chat-manager.h
@@ -65,6 +65,8 @@ void empathy_chat_manager_closed_chat (EmpathyChatManager *self,
 void empathy_chat_manager_undo_closed_chat (EmpathyChatManager *self);
 guint empathy_chat_manager_get_num_closed_chats (EmpathyChatManager *self);
 
+guint empathy_chat_manager_get_num_handled_chats (EmpathyChatManager *self);
+
 G_END_DECLS
 
 #endif /* #ifndef __EMPATHY_CHAT_MANAGER_H__*/



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]