empathy r2148 - trunk/libempathy



Author: xclaesse
Date: Fri Jan  9 16:13:15 2009
New Revision: 2148
URL: http://svn.gnome.org/viewvc/empathy?rev=2148&view=rev

Log:
Act as an observer

Signed-off-by: Sjoerd Simons <sjoerd simons collabora co uk>

Modified:
   trunk/libempathy/empathy-chatroom-manager.c
   trunk/libempathy/empathy-chatroom-manager.h

Modified: trunk/libempathy/empathy-chatroom-manager.c
==============================================================================
--- trunk/libempathy/empathy-chatroom-manager.c	(original)
+++ trunk/libempathy/empathy-chatroom-manager.c	Fri Jan  9 16:13:15 2009
@@ -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 @@
 
 	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);
+}

Modified: trunk/libempathy/empathy-chatroom-manager.h
==============================================================================
--- trunk/libempathy/empathy-chatroom-manager.h	(original)
+++ trunk/libempathy/empathy-chatroom-manager.h	Fri Jan  9 16:13:15 2009
@@ -30,6 +30,7 @@
 #include <libmissioncontrol/mc-account.h>
 
 #include "empathy-chatroom.h"
+#include "empathy-dispatcher.h"
 
 G_BEGIN_DECLS
 
@@ -65,6 +66,8 @@
 							      McAccount             *account);
 guint                  empathy_chatroom_manager_get_count     (EmpathyChatroomManager *manager,
 							      McAccount             *account);
+void                   empathy_chatroom_manager_observe       (EmpathyChatroomManager *manager,
+							      EmpathyDispatcher *dispatcher);
 
 G_END_DECLS
 



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