[empathy] Ensure all accounts when getting all properties
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [empathy] Ensure all accounts when getting all properties
- Date: Wed, 26 Aug 2009 13:54:57 +0000 (UTC)
commit cb4361a992c348f7c57ec75afb1c642fba20fb15
Author: Cosimo Cecchi <cosimoc gnome org>
Date: Wed Aug 26 13:00:24 2009 +0200
Ensure all accounts when getting all properties
This introduces a check on the number of accounts, as MC5 could come
back advertising less accounts than we have. In that case, we find the
one which have gone and remove them from our cache.
libempathy/empathy-account-manager.c | 80 ++++++++++++++++++++++++++++++----
1 files changed, 71 insertions(+), 9 deletions(-)
---
diff --git a/libempathy/empathy-account-manager.c b/libempathy/empathy-account-manager.c
index 365f39e..5548a90 100644
--- a/libempathy/empathy-account-manager.c
+++ b/libempathy/empathy-account-manager.c
@@ -364,6 +364,76 @@ empathy_account_manager_ensure_account (EmpathyAccountManager *manager,
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,
const GError *error,
@@ -372,7 +442,6 @@ account_manager_got_all_cb (TpProxy *proxy,
{
EmpathyAccountManager *manager = EMPATHY_ACCOUNT_MANAGER (weak_object);
GPtrArray *accounts;
- int i;
if (error != NULL)
{
@@ -384,14 +453,7 @@ account_manager_got_all_cb (TpProxy *proxy,
EMPATHY_ARRAY_TYPE_OBJECT);
if (accounts != NULL)
- {
- for (i = 0; i < accounts->len; i++)
- {
- gchar *name = g_ptr_array_index (accounts, i);
-
- empathy_account_manager_ensure_account (manager, name);
- }
- }
+ account_manager_ensure_all_accounts (manager, accounts);
empathy_account_manager_check_ready (manager);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]