From: Sjoerd Simons Date: Wed, 15 Jul 2009 17:19:31 +0000 (+0100) Subject: Add a concept of ready to the account manager X-Git-Url: https://git.0d.be/?p=empathy.git;a=commitdiff_plain;h=7cded0b0190dac119d3e7bb6882b2a2a93293db8 Add a concept of ready to the account manager --- diff --git a/libempathy/empathy-account-manager.c b/libempathy/empathy-account-manager.c index dc15651c..ed24e062 100644 --- a/libempathy/empathy-account-manager.c +++ b/libempathy/empathy-account-manager.c @@ -44,6 +44,7 @@ typedef struct { int connected; int connecting; gboolean dispose_run; + gboolean ready; TpProxySignalConnection *proxy_signal; TpAccountManager *tp_manager; TpDBusDaemon *dbus; @@ -68,6 +69,10 @@ enum { LAST_SIGNAL }; +enum { + PROP_READY = 1, +}; + static guint signals[LAST_SIGNAL]; static EmpathyAccountManager *manager_singleton = NULL; @@ -215,6 +220,32 @@ signal: priv->global_presence, priv->global_status, priv->global_status_message); } +static void +empathy_account_manager_check_ready (EmpathyAccountManager *manager) +{ + EmpathyAccountManagerPriv *priv = GET_PRIV (manager); + GHashTableIter iter; + gpointer value; + + if (priv->ready) + return; + + g_hash_table_iter_init (&iter, priv->accounts); + while (g_hash_table_iter_next (&iter, NULL, &value)) + { + EmpathyAccount *account = EMPATHY_ACCOUNT (value); + gboolean ready; + + g_object_get (account, "ready", &ready, NULL); + + if (!ready) + return; + } + + priv->ready = TRUE; + g_object_notify (G_OBJECT (manager), "ready"); +} + static void emp_account_ready_cb (GObject *obj, GParamSpec *spec, gpointer user_data) { @@ -240,6 +271,8 @@ emp_account_ready_cb (GObject *obj, GParamSpec *spec, gpointer user_data) g_signal_connect (account, "presence-changed", G_CALLBACK (emp_account_presence_changed_cb), manager); + + empathy_account_manager_check_ready (manager); } static void @@ -263,7 +296,6 @@ 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++) { EmpathyAccount *account; @@ -275,6 +307,8 @@ account_manager_got_all_cb (TpProxy *proxy, g_signal_connect (account, "notify::ready", G_CALLBACK (emp_account_ready_cb), manager); } + + empathy_account_manager_check_ready (manager); } static void @@ -391,6 +425,26 @@ do_constructor (GType type, return retval; } +static void +do_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + EmpathyAccountManager *manager = EMPATHY_ACCOUNT_MANAGER (object); + EmpathyAccountManagerPriv *priv = GET_PRIV (manager); + + switch (prop_id) + { + case PROP_READY: + g_value_set_boolean (value, priv->ready); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + static void empathy_account_manager_class_init (EmpathyAccountManagerClass *klass) { @@ -399,6 +453,14 @@ empathy_account_manager_class_init (EmpathyAccountManagerClass *klass) oclass->finalize = do_finalize; oclass->dispose = do_dispose; oclass->constructor = do_constructor; + oclass->get_property = do_get_property; + + g_object_class_install_property (oclass, PROP_READY, + g_param_spec_boolean ("ready", + "Ready", + "Whether the initial state dump from the account manager is finished", + FALSE, + G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); signals[ACCOUNT_CREATED] = g_signal_new ("account-created", @@ -506,6 +568,15 @@ empathy_account_manager_create (EmpathyAccountManager *manager, return NULL; } + +gboolean +empathy_account_manager_is_ready (EmpathyAccountManager *manager) +{ + EmpathyAccountManagerPriv *priv = GET_PRIV (manager); + + return priv->ready; +} + int empathy_account_manager_get_connected_accounts (EmpathyAccountManager *manager) { @@ -689,4 +760,3 @@ empathy_account_manager_get_global_presence ( return priv->global_presence; } - diff --git a/libempathy/empathy-account-manager.h b/libempathy/empathy-account-manager.h index bbf09199..e77f5017 100644 --- a/libempathy/empathy-account-manager.h +++ b/libempathy/empathy-account-manager.h @@ -58,6 +58,8 @@ EmpathyAccount * empathy_account_manager_create ( const gchar *protocol, const gchar *display_name); +gboolean empathy_account_manager_is_ready (EmpathyAccountManager *manager); + int empathy_account_manager_get_connected_accounts (EmpathyAccountManager *manager); int empathy_account_manager_get_connecting_accounts