]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-contact-manager.c
Merge branch 'sasl'
[empathy.git] / libempathy / empathy-contact-manager.c
index b02b00a84b0266b875b0c3938f8163a226e7aa35..a900fa610fdd42155726f98f481cdcbeb2e135ee 100644 (file)
@@ -31,7 +31,6 @@
 #include <extensions/extensions.h>
 
 #include "empathy-contact-manager.h"
-#include "empathy-contact-monitor.h"
 #include "empathy-contact-list.h"
 #include "empathy-utils.h"
 
 
 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyContactManager)
 typedef struct {
+       /* Owned (TpConnection *) => Owned (TpContactList *)
+          The contact list associated with each connected connection */
        GHashTable     *lists;
        TpAccountManager *account_manager;
-       EmpathyContactMonitor *contact_monitor;
        TpProxy *logger;
+       /* account object path (gchar *) => GHashTable containing favorite contacts
+        * (contact ID (gchar *) => TRUE) */
        GHashTable *favourites;
        TpProxySignalConnection *favourite_contacts_changed_signal;
 } EmpathyContactManagerPriv;
@@ -189,9 +191,9 @@ contact_manager_validity_changed_cb (TpAccountManager *account_manager,
                                     EmpathyContactManager *manager)
 {
        if (valid) {
-               empathy_signal_connect_weak (account, "status-changed",
+               tp_g_signal_connect_object (account, "status-changed",
                            G_CALLBACK (contact_manager_status_changed_cb),
-                           G_OBJECT (manager));
+                           manager, 0);
        }
 }
 
@@ -223,6 +225,16 @@ contact_manager_is_favourite (EmpathyContactList *manager,
        return FALSE;
 }
 
+static void
+add_favourite_contact_cb (TpProxy *proxy,
+                         const GError *error,
+                         gpointer user_data,
+                         GObject *weak_object)
+{
+       if (error != NULL)
+               DEBUG ("AddFavouriteContact failed: %s", error->message);
+}
+
 static void
 contact_manager_add_favourite (EmpathyContactList *manager,
                               EmpathyContact *contact)
@@ -242,7 +254,17 @@ contact_manager_add_favourite (EmpathyContactList *manager,
        emp_cli_logger_call_add_favourite_contact (priv->logger, -1,
                                                   account_name,
                                                   empathy_contact_get_id (contact),
-                                                  NULL, NULL, NULL, NULL);
+                                                  add_favourite_contact_cb, NULL, NULL, G_OBJECT (manager));
+}
+
+static void
+remove_favourite_contact_cb (TpProxy *proxy,
+                            const GError *error,
+                            gpointer user_data,
+                            GObject *weak_object)
+{
+       if (error != NULL)
+               DEBUG ("RemoveFavouriteContact failed: %s", error->message);
 }
 
 static void
@@ -264,46 +286,47 @@ contact_manager_remove_favourite (EmpathyContactList *manager,
        emp_cli_logger_call_remove_favourite_contact (priv->logger, -1,
                                                      account_name,
                                                      empathy_contact_get_id (contact),
-                                                     NULL, NULL, NULL, NULL);
+                                                     remove_favourite_contact_cb, NULL, NULL, G_OBJECT (manager));
+}
+
+static void
+add_contacts_to_favourites (EmpathyContactManager *self,
+                           const gchar *account,
+                           const gchar **contacts)
+{
+       EmpathyContactManagerPriv *priv = GET_PRIV (self);
+       guint j;
+       GHashTable *contact_hash;
+
+       contact_hash = g_hash_table_lookup (priv->favourites, account);
+       if (contact_hash == NULL) {
+               contact_hash = g_hash_table_new_full (g_str_hash,
+                                                     g_str_equal,
+                                                     g_free, NULL);
+
+               g_hash_table_insert (priv->favourites,
+                                    g_strdup (account),
+                                    contact_hash);
+       }
+
+       for (j = 0; contacts && contacts[j] != NULL; j++) {
+               g_hash_table_insert (contact_hash,
+                                    g_strdup (contacts[j]),
+                                    GINT_TO_POINTER (1));
+       }
 }
 
 static void
 logger_favourite_contacts_add_from_value_array (GValueArray           *va,
                                                EmpathyContactManager *manager)
 {
-       EmpathyContactManagerPriv *priv = GET_PRIV (manager);
-       guint i;
-
-       for (i = 0; i < va->n_values; i++) {
-               GValue *account_value;
-               const gchar *account;
-               GValue *contacts_value;
-               gchar **contacts;
-               guint j;
-               GHashTable *contact_hash;
-
-               account_value = g_value_array_get_nth (va, 0);
-               contacts_value = g_value_array_get_nth (va, 1);
-
-               account = g_value_get_boxed (account_value);
-               contacts = g_value_get_boxed (contacts_value);
-
-               contact_hash = g_hash_table_lookup (priv->favourites, account);
-               if (contact_hash == NULL) {
-                       contact_hash = g_hash_table_new_full (g_str_hash,
-                                                             g_str_equal,
-                                                             g_free, NULL);
-                       g_hash_table_insert (priv->favourites,
-                                            g_strdup (account),
-                                            g_hash_table_ref (contact_hash));
-               }
+       const gchar *account;
+       const gchar **contacts;
 
-               for (j = 0; contacts && contacts[j] != NULL; j++) {
-                       g_hash_table_insert (contact_hash,
-                                            g_strdup (contacts[j]),
-                                            GINT_TO_POINTER (1));
-               }
-       }
+       account = g_value_get_boxed (g_value_array_get_nth (va, 0));
+       contacts = g_value_get_boxed (g_value_array_get_nth (va, 1));
+
+       add_contacts_to_favourites (manager, account, contacts);
 }
 
 static void
@@ -313,7 +336,7 @@ logger_favourite_contacts_get_cb (TpProxy         *proxy,
                                  gpointer         user_data,
                                  GObject         *weak_object)
 {
-       EmpathyContactManager *manager = EMPATHY_CONTACT_MANAGER (user_data);
+       EmpathyContactManager *manager = EMPATHY_CONTACT_MANAGER (weak_object);
 
        if (error == NULL) {
                g_ptr_array_foreach ((GPtrArray *) result,
@@ -332,7 +355,7 @@ logger_favourite_contacts_setup (EmpathyContactManager *manager)
        EmpathyContactManagerPriv *priv = GET_PRIV (manager);
 
        emp_cli_logger_call_get_favourite_contacts (priv->logger, -1,
-                       logger_favourite_contacts_get_cb, manager, NULL,
+                       logger_favourite_contacts_get_cb, NULL, NULL,
                        G_OBJECT (manager));
 }
 
@@ -343,7 +366,8 @@ contact_manager_finalize (GObject *object)
 
        tp_proxy_signal_connection_disconnect (priv->favourite_contacts_changed_signal);
 
-       g_object_unref (priv->logger);
+       if (priv->logger != NULL)
+               g_object_unref (priv->logger);
 
        g_hash_table_foreach (priv->lists,
                              contact_manager_disconnect_foreach,
@@ -352,10 +376,6 @@ contact_manager_finalize (GObject *object)
        g_hash_table_destroy (priv->favourites);
 
        g_object_unref (priv->account_manager);
-
-       if (priv->contact_monitor) {
-               g_object_unref (priv->contact_monitor);
-       }
 }
 
 static GObject *
@@ -433,15 +453,15 @@ account_manager_prepared_cb (GObject *source_object,
                                                           NULL, NULL, manager);
                }
 
-               empathy_signal_connect_weak (account, "status-changed",
+               tp_g_signal_connect_object (account, "status-changed",
                    G_CALLBACK (contact_manager_status_changed_cb),
-                   G_OBJECT (manager));
+                   manager, 0);
        }
        g_list_free (accounts);
 
-       empathy_signal_connect_weak (account_manager, "account-validity-changed",
+       tp_g_signal_connect_object (account_manager, "account-validity-changed",
                             G_CALLBACK (contact_manager_validity_changed_cb),
-                            G_OBJECT (manager));
+                            manager, 0);
 }
 
 static EmpathyContact *
@@ -468,8 +488,9 @@ contact_manager_lookup_contact (EmpathyContactManager *manager,
                if (!tp_strdiff (contact_id, id_cur) &&
                        !tp_strdiff (account_name, name_cur)) {
                        retval = contact;
-                       break;
                }
+
+               g_object_unref (contact);
        }
 
        g_list_free (members);
@@ -499,19 +520,9 @@ logger_favourite_contacts_changed_cb (TpProxy      *proxy,
         * exactly one contact amongst added and removed, so the linear lookup
         * of each contact isn't as painful as it appears */
 
-       for (i = 0; added && added[i]; i++) {
-               if (contact_hash == NULL) {
-                       contact_hash = g_hash_table_new_full (g_str_hash,
-                                                             g_str_equal,
-                                                             g_free, NULL);
-                       g_hash_table_insert (priv->favourites,
-                                            g_strdup (account_name),
-                                            g_hash_table_ref (contact_hash));
-               }
-
-               g_hash_table_insert (contact_hash, g_strdup (added[i]),
-                                    GINT_TO_POINTER (1));
+       add_contacts_to_favourites (manager, account_name, added);
 
+       for (i = 0; added && added[i]; i++) {
                contact = contact_manager_lookup_contact (manager, account_name,
                                                          added[i]);
                if (contact != NULL)
@@ -566,7 +577,6 @@ empathy_contact_manager_init (EmpathyContactManager *manager)
                                                  g_hash_table_unref);
 
        priv->account_manager = tp_account_manager_dup ();
-       priv->contact_monitor = NULL;
 
        tp_account_manager_prepare_async (priv->account_manager, NULL,
            account_manager_prepared_cb, manager);
@@ -681,18 +691,6 @@ contact_manager_get_members (EmpathyContactList *manager)
        return contacts;
 }
 
-static EmpathyContactMonitor *
-contact_manager_get_monitor (EmpathyContactList *manager)
-{
-       EmpathyContactManagerPriv *priv = GET_PRIV (manager);
-
-       if (priv->contact_monitor == NULL) {
-               priv->contact_monitor = empathy_contact_monitor_new_for_iface (manager);
-       }
-
-       return priv->contact_monitor;
-}
-
 static void
 contact_manager_get_pendings_foreach (TpConnection          *connection,
                                      EmpathyTpContactList  *list,
@@ -872,7 +870,6 @@ contact_manager_iface_init (EmpathyContactListIface *iface)
        iface->add               = contact_manager_add;
        iface->remove            = contact_manager_remove;
        iface->get_members       = contact_manager_get_members;
-       iface->get_monitor       = contact_manager_get_monitor;
        iface->get_pendings      = contact_manager_get_pendings;
        iface->get_all_groups    = contact_manager_get_all_groups;
        iface->get_groups        = contact_manager_get_groups;