]> git.0d.be Git - empathy.git/commitdiff
Act as an observer
authorSjoerd Simons <sjoerd.simons@collabora.co.uk>
Fri, 9 Jan 2009 16:13:15 +0000 (16:13 +0000)
committerXavier Claessens <xclaesse@src.gnome.org>
Fri, 9 Jan 2009 16:13:15 +0000 (16:13 +0000)
Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
svn path=/trunk/; revision=2148

libempathy/empathy-chatroom-manager.c
libempathy/empathy-chatroom-manager.h

index 3c2eb66bb553c9e26537b9594ca3a22546c9c052..4bda3813683d02045f7be0674e21caaaf477553a 100644 (file)
@@ -31,6 +31,7 @@
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 
+#include "empathy-tp-chat.h"
 #include "empathy-chatroom-manager.h"
 #include "empathy-utils.h"
 
@@ -652,3 +653,90 @@ chatroom_manager_file_save (EmpathyChatroomManager *manager)
 
        return TRUE;
 }
+
+static void
+empathy_chatroom_manager_chat_destroyed_cb (EmpathyTpChat *chat,
+  gpointer user_data)
+{
+  EmpathyChatroomManager *manager = EMPATHY_CHATROOM_MANAGER (user_data);
+  McAccount *account = empathy_tp_chat_get_account (chat);
+  EmpathyChatroom *chatroom;
+  const gchar *roomname;
+  gboolean favorite;
+
+  roomname = empathy_tp_chat_get_id (chat);
+  chatroom = empathy_chatroom_manager_find (manager, account, roomname);
+
+  if (chatroom == NULL)
+    return;
+
+  g_object_get (chatroom, "favorite", &favorite, NULL);
+
+  if (!favorite)
+    {
+      /* Remove the chatroom from the list, unless it's in the list of
+       * favourites.. (seems strange to handle this at such a low level.. */
+      empathy_chatroom_manager_remove (manager, chatroom);
+    }
+}
+
+static void
+empathy_chatroom_manager_observe_channel_cb (EmpathyDispatcher *dispatcher,
+  EmpathyDispatchOperation *operation, gpointer user_data)
+{
+  EmpathyChatroomManager *manager = EMPATHY_CHATROOM_MANAGER (user_data);
+  EmpathyChatroom *chatroom;
+  TpChannel *channel;
+  EmpathyTpChat *chat;
+  const gchar *roomname;
+  GQuark channel_type;
+  TpHandleType handle_type;
+  McAccount *account;
+
+  channel_type = empathy_dispatch_operation_get_channel_type_id (operation);
+
+  /* Observe Text channels to rooms only */
+  if (channel_type != TP_IFACE_QUARK_CHANNEL_TYPE_TEXT)
+    return;
+
+  channel = empathy_dispatch_operation_get_channel (operation);
+  tp_channel_get_handle (channel, &handle_type);
+
+  if (handle_type != TP_HANDLE_TYPE_ROOM)
+    goto out;
+
+  chat = EMPATHY_TP_CHAT (
+    empathy_dispatch_operation_get_channel_wrapper (operation));
+  account = empathy_tp_chat_get_account (chat);
+
+  roomname = empathy_tp_chat_get_id (chat);
+
+  chatroom = empathy_chatroom_manager_find (manager, account, roomname);
+
+  if (chatroom == NULL)
+    {
+      chatroom = empathy_chatroom_new_full (account, roomname, roomname,
+        FALSE);
+      empathy_chatroom_manager_add (manager, chatroom);
+      g_object_unref (chatroom);
+    }
+
+  /* A TpChat is always destroyed as it only gets unreffed after the channel
+   * has been invalidated in the dispatcher..  */
+  g_signal_connect (chat, "destroy",
+    G_CALLBACK (empathy_chatroom_manager_chat_destroyed_cb),
+    manager);
+
+  g_object_unref (account);
+  g_object_unref (chat);
+out:
+  g_object_unref (channel);
+}
+
+void
+empathy_chatroom_manager_observe (EmpathyChatroomManager *manager,
+  EmpathyDispatcher *dispatcher)
+{
+  g_signal_connect (dispatcher, "observe",
+    G_CALLBACK (empathy_chatroom_manager_observe_channel_cb), manager);
+}
index c070005ab704089fcd3e470c372412c124d4a54a..b8e739ad4dafee1ecc10eaa14ca31876d71b3566 100644 (file)
@@ -30,6 +30,7 @@
 #include <libmissioncontrol/mc-account.h>
 
 #include "empathy-chatroom.h"
+#include "empathy-dispatcher.h"
 
 G_BEGIN_DECLS
 
@@ -65,6 +66,8 @@ GList *                empathy_chatroom_manager_get_chatrooms (EmpathyChatroomMa
                                                              McAccount             *account);
 guint                  empathy_chatroom_manager_get_count     (EmpathyChatroomManager *manager,
                                                              McAccount             *account);
+void                   empathy_chatroom_manager_observe       (EmpathyChatroomManager *manager,
+                                                             EmpathyDispatcher *dispatcher);
 
 G_END_DECLS