[telepathy-glib/master] fd.o#24257: tp_account_manager_prepare: fail if invalidated
David Laban
david.laban at collabora.co.uk
Thu Nov 5 11:23:25 PST 2009
AccountManager now also contains an invalidated callback,
which makes all prepare callbacks fail.
See previous commits.
---
telepathy-glib/account-manager.c | 39 +++++++++++++++++++++++++++++++++++++-
1 files changed, 38 insertions(+), 1 deletions(-)
diff --git a/telepathy-glib/account-manager.c b/telepathy-glib/account-manager.c
index 9f2ca9f..6f8317b 100644
--- a/telepathy-glib/account-manager.c
+++ b/telepathy-glib/account-manager.c
@@ -273,6 +273,31 @@ _tp_account_manager_become_ready (TpAccountManager *self,
}
static void
+_tp_account_manager_invalidated_cb (TpAccountManager *self,
+ guint domain,
+ guint code,
+ gchar *message)
+{
+ TpAccountManagerPrivate *priv = self->priv;
+ GList *l;
+
+ /* Make all currently pending callbacks fail. */
+ for (l = priv->callbacks; l != NULL; l = l->next)
+ {
+ TpAccountManagerFeatureCallback *cb = l->data;
+
+ g_simple_async_result_set_error (cb->result,
+ domain, code, "%s", message);
+ g_simple_async_result_complete (cb->result);
+ g_object_unref (cb->result);
+ g_slice_free (TpAccountManagerFeatureCallback, cb);
+ }
+
+ g_list_free (priv->callbacks);
+ priv->callbacks = NULL;
+}
+
+static void
tp_account_manager_init (TpAccountManager *self)
{
TpAccountManagerPrivate *priv;
@@ -288,6 +313,9 @@ tp_account_manager_init (TpAccountManager *self)
g_free, (GDestroyNotify) g_object_unref);
priv->create_results = g_hash_table_new (g_direct_hash, g_direct_equal);
+
+ g_signal_connect (self, "invalidated",
+ G_CALLBACK (_tp_account_manager_invalidated_cb), NULL);
}
static void
@@ -536,6 +564,7 @@ _tp_account_manager_got_all_cb (TpProxy *proxy,
if (error != NULL)
{
DEBUG ("Failed to get account manager properties: %s", error->message);
+ tp_proxy_invalidate (proxy, error);
return;
}
@@ -1358,6 +1387,7 @@ tp_account_manager_prepare_async (TpAccountManager *manager,
TpAccountManagerPrivate *priv;
GSimpleAsyncResult *result;
const GQuark *f;
+ const GError *error;
g_return_if_fail (TP_IS_ACCOUNT_MANAGER (manager));
@@ -1381,7 +1411,14 @@ tp_account_manager_prepare_async (TpAccountManager *manager,
result = g_simple_async_result_new (G_OBJECT (manager),
callback, user_data, tp_account_manager_prepare_finish);
- if (_tp_account_manager_check_features (manager, features))
+ error = tp_proxy_get_invalidated (manager);
+ if (error != NULL)
+ {
+ g_simple_async_result_set_from_error (result, error);
+ g_simple_async_result_complete_in_idle (result);
+ g_object_unref (result);
+ }
+ else if (_tp_account_manager_check_features (manager, features))
{
g_simple_async_result_complete_in_idle (result);
g_object_unref (result);
--
1.5.6.5
More information about the telepathy-commits
mailing list