]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-account-manager.c
Updated Basque language
[empathy.git] / libempathy / empathy-account-manager.c
index 83de26c6794e9def1e55eb6a9070ec09951feaf8..f7cb09a87a9e293f04eecb19f8a183f85d03606f 100644 (file)
@@ -183,6 +183,7 @@ emp_account_manager_update_global_presence (EmpathyAccountManager *manager)
 
   if (account == NULL)
     {
+      priv->global_presence = presence;
       priv->global_status = NULL;
       priv->global_status_message = NULL;
       return;
@@ -337,6 +338,15 @@ empathy_account_manager_get_account (EmpathyAccountManager *manager,
   const gchar *path)
 {
   EmpathyAccountManagerPriv *priv = GET_PRIV (manager);
+
+  return g_hash_table_lookup (priv->accounts, path);
+}
+
+EmpathyAccount *
+empathy_account_manager_ensure_account (EmpathyAccountManager *manager,
+  const gchar *path)
+{
+  EmpathyAccountManagerPriv *priv = GET_PRIV (manager);
   EmpathyAccount *account;
 
   account = g_hash_table_lookup (priv->accounts, path);
@@ -352,6 +362,77 @@ empathy_account_manager_get_account (EmpathyAccountManager *manager,
   return account;
 }
 
+
+static void
+account_manager_ensure_all_accounts (EmpathyAccountManager *manager,
+    GPtrArray *accounts)
+{
+  int i, missing_accounts;
+  GHashTableIter iter;
+  EmpathyAccountManagerPriv *priv = GET_PRIV (manager);
+  gpointer value;
+  EmpathyAccount *account;
+  gboolean found = FALSE;
+  const gchar *name;
+
+  /* ensure all accounts coming from MC5 first */
+  for (i = 0; i < accounts->len; i++)
+    {
+      name = g_ptr_array_index (accounts, i);
+
+      account = empathy_account_manager_ensure_account (manager, name);
+      empathy_account_refresh_properties (account);
+    }
+
+  missing_accounts = empathy_account_manager_get_count (manager) -
+    accounts->len;
+
+  if (missing_accounts > 0)
+    {
+      /* look for accounts we have and the Tp AccountManager doesn't,
+       * and remove them from our cache.
+       */
+
+      DEBUG ("%d missing accounts", missing_accounts);
+
+      g_hash_table_iter_init (&iter, priv->accounts);
+
+      while (g_hash_table_iter_next (&iter, NULL, &value) &&
+            missing_accounts > 0)
+        {
+          account = value;
+
+          /* look for this account in the AccountManager provided array */
+          for (i = 0; i < accounts->len; i++)
+            {
+              name = g_ptr_array_index (accounts, i);
+
+              if (!tp_strdiff
+                  (name, empathy_account_get_unique_name (account)))
+                {
+                  found = TRUE;
+                  break;
+                }
+            }
+
+          if (!found)
+            {
+              DEBUG ("Account %s was not found, remove it from the cache",
+                    empathy_account_get_unique_name (account));
+
+             g_object_ref (account);
+             g_hash_table_iter_remove (&iter);
+             g_signal_emit (manager, signals[ACCOUNT_DELETED], 0, account);
+             g_object_unref (account);
+
+              missing_accounts--;
+            }
+
+          found = FALSE;
+        }
+    }
+}
+
 static void
 account_manager_got_all_cb (TpProxy *proxy,
     GHashTable *properties,
@@ -361,7 +442,6 @@ account_manager_got_all_cb (TpProxy *proxy,
 {
   EmpathyAccountManager *manager = EMPATHY_ACCOUNT_MANAGER (weak_object);
   GPtrArray *accounts;
-  int i;
 
   if (error != NULL)
     {
@@ -372,12 +452,8 @@ account_manager_got_all_cb (TpProxy *proxy,
   accounts = tp_asv_get_boxed (properties, "ValidAccounts",
     EMPATHY_ARRAY_TYPE_OBJECT);
 
-  for (i = 0; i < accounts->len; i++)
-    {
-      gchar *name = g_ptr_array_index (accounts, i);
-
-      empathy_account_manager_get_account (manager, name);
-    }
+  if (accounts != NULL)
+    account_manager_ensure_all_accounts (manager, accounts);
 
   empathy_account_manager_check_ready (manager);
 }
@@ -394,7 +470,25 @@ account_validity_changed_cb (TpAccountManager *proxy,
   if (!valid)
     return;
 
-  empathy_account_manager_get_account (manager, path);
+  empathy_account_manager_ensure_account (manager, path);
+}
+
+static void
+account_manager_start_mc5 (TpDBusDaemon *bus)
+{
+  TpProxy *mc5_proxy;
+
+  /* trigger MC5 starting */
+  mc5_proxy = g_object_new (TP_TYPE_PROXY,
+    "dbus-daemon", bus,
+    "dbus-connection", tp_proxy_get_dbus_connection (TP_PROXY (bus)),
+    "bus-name", MC5_BUS_NAME,
+    "object-path", "/",
+    NULL);
+
+  tp_cli_dbus_peer_call_ping (mc5_proxy, -1, NULL, NULL, NULL, NULL);
+
+  g_object_unref (mc5_proxy);
 }
 
 static void
@@ -406,32 +500,45 @@ account_manager_name_owner_cb (TpDBusDaemon *proxy,
   EmpathyAccountManager *manager = EMPATHY_ACCOUNT_MANAGER (user_data);
   EmpathyAccountManagerPriv *priv = GET_PRIV (manager);
 
-  tp_dbus_daemon_cancel_name_owner_watch (proxy, name,
-    account_manager_name_owner_cb, user_data);
+  DEBUG ("Name owner changed for %s, new name: %s", name, new_owner);
 
-  priv->tp_manager = tp_account_manager_new (priv->dbus);
+  if (EMP_STR_EMPTY (new_owner))
+    {
+      /* MC5 quit or crashed for some reason, let's start it again */
+      account_manager_start_mc5 (priv->dbus);
 
-  tp_cli_account_manager_connect_to_account_validity_changed (
-      priv->tp_manager,
-      account_validity_changed_cb,
-      NULL,
-      NULL,
-      G_OBJECT (manager),
-      NULL);
+      if (priv->tp_manager != NULL)
+        g_object_unref (priv->tp_manager);
+
+      priv->tp_manager = NULL;
+      return;
+    }
 
-  tp_cli_dbus_properties_call_get_all (priv->tp_manager, -1,
-    TP_IFACE_ACCOUNT_MANAGER,
-    account_manager_got_all_cb,
-    NULL,
-    NULL,
-    G_OBJECT (manager));
+  if (priv->tp_manager == NULL)
+    {
+      priv->tp_manager = tp_account_manager_new (priv->dbus);
+
+      tp_cli_account_manager_connect_to_account_validity_changed (
+          priv->tp_manager,
+          account_validity_changed_cb,
+          NULL,
+          NULL,
+          G_OBJECT (manager),
+          NULL);
+
+      tp_cli_dbus_properties_call_get_all (priv->tp_manager, -1,
+          TP_IFACE_ACCOUNT_MANAGER,
+          account_manager_got_all_cb,
+          NULL,
+          NULL,
+          G_OBJECT (manager));
+    }
 }
 
 static void
 empathy_account_manager_init (EmpathyAccountManager *manager)
 {
   EmpathyAccountManagerPriv *priv;
-  TpProxy *mc5_proxy;
 
   priv = G_TYPE_INSTANCE_GET_PRIVATE (manager,
       EMPATHY_TYPE_ACCOUNT_MANAGER, EmpathyAccountManagerPriv);
@@ -453,17 +560,7 @@ empathy_account_manager_init (EmpathyAccountManager *manager)
       manager,
       NULL);
 
-  /* trigger MC5 starting */
-  mc5_proxy = g_object_new (TP_TYPE_PROXY,
-    "dbus-daemon", priv->dbus,
-    "dbus-connection", tp_proxy_get_dbus_connection (TP_PROXY (priv->dbus)),
-    "bus-name", MC5_BUS_NAME,
-    "object-path", "/",
-    NULL);
-
-  tp_cli_dbus_peer_call_ping (mc5_proxy, -1, NULL, NULL, NULL, NULL);
-
-  g_object_unref (mc5_proxy);
+  account_manager_start_mc5 (priv->dbus);
 }
 
 static void
@@ -533,9 +630,9 @@ do_constructor (GType type,
 
   if (!manager_singleton)
     {
-      retval = G_OBJECT_CLASS (empathy_account_manager_parent_class)->constructor (type,
-                                                                                   n_construct_params,
-                                                                                   construct_params);
+      retval = G_OBJECT_CLASS
+        (empathy_account_manager_parent_class)->constructor (type,
+            n_construct_params, construct_params);
       manager_singleton = EMPATHY_ACCOUNT_MANAGER (retval);
       g_object_add_weak_pointer (retval, (gpointer) &manager_singleton);
     }
@@ -701,7 +798,8 @@ empathy_account_manager_get_connected_accounts (EmpathyAccountManager *manager)
 }
 
 int
-empathy_account_manager_get_connecting_accounts (EmpathyAccountManager *manager)
+empathy_account_manager_get_connecting_accounts (
+    EmpathyAccountManager *manager)
 {
   EmpathyAccountManagerPriv *priv;
 
@@ -906,7 +1004,7 @@ empathy_account_manager_created_cb (TpAccountManager *proxy,
       return;
     }
 
-  account = empathy_account_manager_get_account (manager, account_path);
+  account = empathy_account_manager_ensure_account (manager, account_path);
 
   g_hash_table_insert (priv->create_results, account, my_res);
 }