]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-chatroom-manager.c
individual-menu: remove link-contacts-activated signal
[empathy.git] / libempathy / empathy-chatroom-manager.c
index 7872bbb194fc42975468ceb7296115b5ac602876..9a9a7b25013163e0a066187c4e2c9d2f7c9cbd0e 100644 (file)
@@ -35,6 +35,7 @@
 #include <telepathy-glib/simple-observer.h>
 #include <telepathy-glib/util.h>
 
+#include "empathy-client-factory.h"
 #include "empathy-tp-chat.h"
 #include "empathy-chatroom-manager.h"
 #include "empathy-utils.h"
@@ -209,8 +210,7 @@ static void
 chatroom_manager_parse_chatroom (EmpathyChatroomManager *manager,
     xmlNodePtr node)
 {
-  EmpathyChatroomManagerPriv *priv;
-  EmpathyChatroom *chatroom;
+  EmpathyChatroom *chatroom = NULL;
   TpAccount *account;
   xmlNodePtr child;
   gchar *str;
@@ -219,8 +219,8 @@ chatroom_manager_parse_chatroom (EmpathyChatroomManager *manager,
   gchar *account_id;
   gboolean auto_connect;
   gboolean always_urgent;
-
-  priv = GET_PRIV (manager);
+  EmpathyClientFactory *factory;
+  GError *error = NULL;
 
   /* default values. */
   name = NULL;
@@ -269,10 +269,22 @@ chatroom_manager_parse_chatroom (EmpathyChatroomManager *manager,
       xmlFree (str);
     }
 
-  account = tp_account_manager_ensure_account (priv->account_manager,
-    account_id);
+  /* account has to be a valid Account object path */
+  if (!tp_dbus_check_valid_object_path (account_id, NULL) ||
+      !g_str_has_prefix (account_id, TP_ACCOUNT_OBJECT_PATH_BASE))
+    goto out;
+
+  factory = empathy_client_factory_dup ();
+
+  account = tp_simple_client_factory_ensure_account (
+          TP_SIMPLE_CLIENT_FACTORY (factory), account_id, NULL, &error);
+  g_object_unref (factory);
+
   if (account == NULL)
     {
+      DEBUG ("Failed to create account: %s", error->message);
+      g_error_free (error);
+
       g_free (name);
       g_free (room);
       g_free (account_id);
@@ -285,10 +297,11 @@ chatroom_manager_parse_chatroom (EmpathyChatroomManager *manager,
   add_chatroom (manager, chatroom);
   g_signal_emit (manager, signals[CHATROOM_ADDED], 0, chatroom);
 
+out:
   g_free (name);
   g_free (room);
   g_free (account_id);
-  g_object_unref (chatroom);
+  tp_clear_object (&chatroom);
 }
 
 static gboolean
@@ -423,9 +436,17 @@ static void
 clear_chatrooms (EmpathyChatroomManager *self)
 {
   EmpathyChatroomManagerPriv *priv = GET_PRIV (self);
-  GList *l;
+  GList *l, *tmp;
+
+  tmp = priv->chatrooms;
+
+  /* Unreffing the chatroom may result in destroying the underlying
+   * EmpathyTpChat which will fire the invalidated signal and so make us
+   * re-call this function. We already set priv->chatrooms to NULL so we won't
+   * try to destroy twice the same objects. */
+  priv->chatrooms = NULL;
 
-  for (l = priv->chatrooms; l != NULL; l = g_list_next (l))
+  for (l = tmp; l != NULL; l = g_list_next (l))
     {
       EmpathyChatroom *chatroom = l->data;
 
@@ -436,8 +457,7 @@ clear_chatrooms (EmpathyChatroomManager *self)
       g_object_unref (chatroom);
     }
 
-  g_list_free (priv->chatrooms);
-  priv->chatrooms = NULL;
+  g_list_free (tmp);
 }
 
 static void
@@ -498,7 +518,7 @@ account_manager_ready_cb (GObject *source_object,
   GError *error = NULL;
   GFile *file = NULL;
 
-  if (!tp_account_manager_prepare_finish (manager, result, &error))
+  if (!tp_proxy_prepare_finish (manager, result, &error))
     {
       DEBUG ("Failed to prepare account manager: %s", error->message);
       g_error_free (error);
@@ -537,7 +557,6 @@ empathy_chatroom_manager_constructor (GType type,
   EmpathyChatroomManager *self;
   EmpathyChatroomManagerPriv *priv;
   GError *error = NULL;
-  TpDBusDaemon *dbus;
 
   if (chatroom_manager_singleton != NULL)
     return g_object_ref (chatroom_manager_singleton);
@@ -556,7 +575,7 @@ empathy_chatroom_manager_constructor (GType type,
 
   priv->account_manager = tp_account_manager_dup ();
 
-  tp_account_manager_prepare_async (priv->account_manager, NULL,
+  tp_proxy_prepare_async (priv->account_manager, NULL,
       account_manager_ready_cb, g_object_ref (self));
 
   if (priv->file == NULL)
@@ -572,21 +591,10 @@ empathy_chatroom_manager_constructor (GType type,
       g_free (dir);
     }
 
-  dbus = tp_dbus_daemon_dup (&error);
-  if (dbus == NULL)
-    {
-      g_warning ("Failed to get TpDBusDaemon: %s", error->message);
-
-      g_error_free (error);
-      return obj;
-    }
-
   /* Setup a room observer */
-  priv->observer = tp_simple_observer_new (dbus, TRUE,
+  priv->observer = tp_simple_observer_new_with_am (priv->account_manager, TRUE,
       "Empathy.ChatroomManager", TRUE, observe_channels_cb, self, NULL);
 
-  g_object_unref (dbus);
-
   tp_base_client_take_observer_filter (priv->observer, tp_asv_new (
       TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING,
         TP_IFACE_CHANNEL_TYPE_TEXT,
@@ -594,9 +602,6 @@ empathy_chatroom_manager_constructor (GType type,
         TP_HANDLE_TYPE_ROOM,
       NULL));
 
-  tp_base_client_add_connection_features_varargs (priv->observer,
-      TP_CONNECTION_FEATURE_CAPABILITIES, NULL);
-
   if (!tp_base_client_register (priv->observer, &error))
     {
       g_critical ("Failed to register Observer: %s", error->message);
@@ -643,7 +648,7 @@ empathy_chatroom_manager_class_init (EmpathyChatroomManagerClass *klass)
       G_TYPE_FROM_CLASS (klass),
       G_SIGNAL_RUN_LAST,
       0, NULL, NULL,
-      g_cclosure_marshal_VOID__OBJECT,
+      g_cclosure_marshal_generic,
       G_TYPE_NONE,
       1, EMPATHY_TYPE_CHATROOM);
 
@@ -651,7 +656,7 @@ empathy_chatroom_manager_class_init (EmpathyChatroomManagerClass *klass)
       G_TYPE_FROM_CLASS (klass),
       G_SIGNAL_RUN_LAST,
       0, NULL, NULL,
-      g_cclosure_marshal_VOID__OBJECT,
+      g_cclosure_marshal_generic,
       G_TYPE_NONE,
       1, EMPATHY_TYPE_CHATROOM);
 
@@ -832,7 +837,10 @@ empathy_chatroom_manager_get_chatrooms (EmpathyChatroomManager *manager,
 }
 
 static void
-chatroom_manager_chat_destroyed_cb (EmpathyTpChat *chat,
+chatroom_manager_chat_invalidated_cb (EmpathyTpChat *chat,
+  guint domain,
+  gint code,
+  gchar *message,
   gpointer manager)
 {
   EmpathyChatroomManagerPriv *priv = GET_PRIV (manager);
@@ -874,18 +882,16 @@ observe_channels_cb (TpSimpleObserver *observer,
 
   for (l = channels; l != NULL; l = g_list_next (l))
     {
-      TpChannel *channel = l->data;
-      EmpathyTpChat *tp_chat;
+      EmpathyTpChat *tp_chat = l->data;
       const gchar *roomname;
       EmpathyChatroom *chatroom;
 
-      if (tp_proxy_get_invalidated (channel) != NULL)
+      if (tp_proxy_get_invalidated ((TpChannel *) tp_chat) != NULL)
         continue;
 
-      if (!TP_IS_TEXT_CHANNEL (channel))
+      if (!EMPATHY_IS_TP_CHAT (tp_chat))
         continue;
 
-      tp_chat = empathy_tp_chat_new (account, channel);
       roomname = empathy_tp_chat_get_id (tp_chat);
       chatroom = empathy_chatroom_manager_find (self, account, roomname);
 
@@ -898,12 +904,9 @@ observe_channels_cb (TpSimpleObserver *observer,
         }
 
       empathy_chatroom_set_tp_chat (chatroom, tp_chat);
-      g_object_unref (tp_chat);
 
-      /* A TpChat is always destroyed as it only gets unreffed after the channel
-       * has been invalidated in the dispatcher..  */
-      g_signal_connect (tp_chat, "destroy",
-        G_CALLBACK (chatroom_manager_chat_destroyed_cb),
+      g_signal_connect (tp_chat, "invalidated",
+        G_CALLBACK (chatroom_manager_chat_invalidated_cb),
         self);
     }