[telepathy-glib/master] account-manager: rename created and deleted signals to divert less from the D-Bus API
Jonny Lamb
jonny.lamb at collabora.co.uk
Mon Sep 28 03:31:39 PDT 2009
account-created becomes account-validity-changed, and account-deleted
becomes account-removed, and they work exactly like the D-Bus signals.
Additionally, when an account becomes invalid, remove it from the
accounts hash table so it's not returned in _get_valid_accounts.
Signed-off-by: Jonny Lamb <jonny.lamb at collabora.co.uk>
---
telepathy-glib/account-manager.c | 144 +++++++++++++++++++++++------------
telepathy-glib/signals-marshal.list | 1 +
2 files changed, 97 insertions(+), 48 deletions(-)
diff --git a/telepathy-glib/account-manager.c b/telepathy-glib/account-manager.c
index 21f4424..8d1e3a3 100644
--- a/telepathy-glib/account-manager.c
+++ b/telepathy-glib/account-manager.c
@@ -105,8 +105,8 @@ typedef struct {
#define MC5_BUS_NAME "org.freedesktop.Telepathy.MissionControl5"
enum {
- ACCOUNT_CREATED,
- ACCOUNT_DELETED,
+ ACCOUNT_VALIDITY_CHANGED,
+ ACCOUNT_REMOVED,
ACCOUNT_ENABLED,
ACCOUNT_DISABLED,
MOST_AVAILABLE_PRESENCE_CHANGED,
@@ -325,27 +325,59 @@ _tp_account_manager_name_owner_cb (TpDBusDaemon *proxy,
}
static void
+_tp_account_manager_validity_changed_cb (TpAccountManager *proxy,
+ const gchar *path,
+ gboolean valid,
+ gpointer user_data,
+ GObject *weak_object)
+{
+ TpAccountManager *manager = TP_ACCOUNT_MANAGER (weak_object);
+ TpAccountManagerPrivate *priv = manager->priv;
+ TpAccount *account;
+
+ if (!valid)
+ {
+ account = g_hash_table_lookup (priv->accounts, path);
+
+ if (account != NULL)
+ {
+ g_object_ref (account);
+ g_hash_table_remove (priv->accounts, account);
+ g_signal_emit (manager, signals[ACCOUNT_VALIDITY_CHANGED], 0,
+ account, valid);
+ g_object_unref (account);
+ }
+ }
+ else
+ {
+ tp_account_manager_ensure_account (manager, path);
+ }
+}
+
+static void
_tp_account_manager_ensure_all_accounts (TpAccountManager *manager,
- GPtrArray *accounts)
+ GPtrArray *valid_accounts,
+ GPtrArray *invalid_accounts)
{
guint i, missing_accounts;
GHashTableIter iter;
TpAccountManagerPrivate *priv = manager->priv;
gpointer value;
TpAccount *account;
- gboolean found = FALSE;
+ gboolean found_in_valid = FALSE;
+ gboolean found_in_invalid = FALSE;
const gchar *name;
/* ensure all accounts coming from MC5 first */
- for (i = 0; i < accounts->len; i++)
+ for (i = 0; i < valid_accounts->len; i++)
{
- name = g_ptr_array_index (accounts, i);
+ name = g_ptr_array_index (valid_accounts, i);
account = tp_account_manager_ensure_account (manager, name);
_tp_account_refresh_properties (account);
}
- missing_accounts = g_hash_table_size (priv->accounts) - accounts->len;
+ missing_accounts = g_hash_table_size (priv->accounts) - valid_accounts->len;
if (missing_accounts > 0)
{
@@ -360,32 +392,57 @@ _tp_account_manager_ensure_all_accounts (TpAccountManager *manager,
{
account = value;
- /* look for this account in the AccountManager provided array */
- for (i = 0; i < accounts->len; i++)
+ /* look for this account in the valid accounts array */
+ for (i = 0; i < valid_accounts->len; i++)
{
- name = g_ptr_array_index (accounts, i);
+ name = g_ptr_array_index (valid_accounts, i);
if (!tp_strdiff (name, tp_proxy_get_object_path (account)))
{
- found = TRUE;
+ found_in_valid = TRUE;
break;
}
}
- if (!found)
+ if (!found_in_valid)
{
- DEBUG ("Account %s was not found, remove it from the cache",
- tp_proxy_get_object_path (account));
+ /* look for this account in the invalid accounts array */
+ for (i = 0; i < invalid_accounts->len; i++)
+ {
+ name = g_ptr_array_index (invalid_accounts, i);
- g_object_ref (account);
- g_hash_table_iter_remove (&iter);
- g_signal_emit (manager, signals[ACCOUNT_DELETED], 0, account);
- g_object_unref (account);
+ if (!tp_strdiff (name, tp_proxy_get_object_path (account)))
+ {
+ found_in_invalid = TRUE;
+ break;
+ }
+ }
+
+ if (found_in_invalid)
+ {
+ DEBUG ("Account %s's validity changed",
+ tp_proxy_get_object_path (account));
+
+ _tp_account_manager_validity_changed_cb (manager,
+ tp_proxy_get_object_path (account), FALSE, NULL,
+ G_OBJECT (manager));
+ }
+ else
+ {
+ DEBUG ("Account %s was not found, remove it from the cache",
+ tp_proxy_get_object_path (account));
+
+ g_object_ref (account);
+ g_hash_table_iter_remove (&iter);
+ g_signal_emit (manager, signals[ACCOUNT_REMOVED], 0, account);
+ g_object_unref (account);
+ }
missing_accounts--;
}
- found = FALSE;
+ found_in_valid = FALSE;
+ found_in_invalid = FALSE;
}
}
}
@@ -479,7 +536,8 @@ _tp_account_manager_got_all_cb (TpProxy *proxy,
GObject *weak_object)
{
TpAccountManager *manager = TP_ACCOUNT_MANAGER (weak_object);
- GPtrArray *accounts;
+ GPtrArray *valid_accounts;
+ GPtrArray *invalid_accounts;
if (error != NULL)
{
@@ -487,28 +545,17 @@ _tp_account_manager_got_all_cb (TpProxy *proxy,
return;
}
- accounts = tp_asv_get_boxed (properties, "ValidAccounts",
+ valid_accounts = tp_asv_get_boxed (properties, "ValidAccounts",
TP_ARRAY_TYPE_OBJECT_PATH_LIST);
- if (accounts != NULL)
- _tp_account_manager_ensure_all_accounts (manager, accounts);
-
- _tp_account_manager_check_core_ready (manager);
-}
-
-static void
-_tp_account_manager_validity_changed_cb (TpAccountManager *proxy,
- const gchar *path,
- gboolean valid,
- gpointer user_data,
- GObject *weak_object)
-{
- TpAccountManager *manager = TP_ACCOUNT_MANAGER (weak_object);
+ invalid_accounts = tp_asv_get_boxed (properties, "InvalidAccounts",
+ TP_ARRAY_TYPE_OBJECT_PATH_LIST);
- if (!valid)
- return;
+ if (valid_accounts != NULL && invalid_accounts != NULL)
+ _tp_account_manager_ensure_all_accounts (manager, valid_accounts,
+ invalid_accounts);
- tp_account_manager_ensure_account (manager, path);
+ _tp_account_manager_check_core_ready (manager);
}
static void
@@ -636,33 +683,34 @@ tp_account_manager_class_init (TpAccountManagerClass *klass)
tp_account_manager_init_known_interfaces ();
/**
- * TpAccountManager::account-created:
+ * TpAccountManager::account-validity-changed:
* @manager: a #TpAccountManager
* @account: a #TpAccount
+ * @valid: %TRUE if the account is now valid
*
- * Emitted when an account is created on @manager.
+ * Emitted when the validity on @account changes.
*
* Since: 0.7.UNRELEASED
*/
- signals[ACCOUNT_CREATED] = g_signal_new ("account-created",
+ signals[ACCOUNT_VALIDITY_CHANGED] = g_signal_new ("account-validity-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
+ _tp_marshal_VOID__OBJECT_BOOLEAN,
G_TYPE_NONE,
- 1, TP_TYPE_ACCOUNT);
+ 2, TP_TYPE_ACCOUNT, G_TYPE_BOOLEAN);
/**
- * TpAccountManager::account-deleted:
+ * TpAccountManager::account-removed:
* @manager: a #TpAccountManager
* @account: a #TpAccount
*
- * Emitted when an account is deleted from @manager.
+ * Emitted when an account is removed from @manager.
*
* Since: 0.7.UNRELEASED
*/
- signals[ACCOUNT_DELETED] = g_signal_new ("account-deleted",
+ signals[ACCOUNT_REMOVED] = g_signal_new ("account-removed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
@@ -904,7 +952,7 @@ _tp_account_manager_account_invalidated_cb (TpProxy *proxy,
g_hash_table_remove (priv->accounts,
tp_proxy_get_object_path (account));
- g_signal_emit (manager, signals[ACCOUNT_DELETED], 0, account);
+ g_signal_emit (manager, signals[ACCOUNT_REMOVED], 0, account);
g_object_unref (account);
}
@@ -934,7 +982,7 @@ _tp_account_manager_account_ready_cb (GObject *source_object,
g_object_unref (result);
}
- g_signal_emit (manager, signals[ACCOUNT_CREATED], 0, account);
+ g_signal_emit (manager, signals[ACCOUNT_VALIDITY_CHANGED], 0, account, TRUE);
g_signal_connect (account, "notify::enabled",
G_CALLBACK (_tp_account_manager_account_enabled_cb), manager);
diff --git a/telepathy-glib/signals-marshal.list b/telepathy-glib/signals-marshal.list
index cf1dcf7..b157c9a 100644
--- a/telepathy-glib/signals-marshal.list
+++ b/telepathy-glib/signals-marshal.list
@@ -8,3 +8,4 @@ VOID:UINT,INT,STRING
VOID:UINT,OBJECT
VOID:UINT,STRING,STRING
VOID:UINT,UINT,UINT,STRING,POINTER
+VOID:OBJECT,BOOLEAN
--
1.5.6.5
More information about the telepathy-commits
mailing list