diff options
Diffstat (limited to 'src/mcd-account-manager.c')
-rw-r--r-- | src/mcd-account-manager.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/mcd-account-manager.c b/src/mcd-account-manager.c index 022cd0cc..4e791c75 100644 --- a/src/mcd-account-manager.c +++ b/src/mcd-account-manager.c @@ -139,6 +139,12 @@ typedef struct GError *error; } McdCreateAccountData; +typedef struct +{ + McdAccount *account; + gchar *property; +} McdAlterAccountData; + enum { PROP_0, @@ -233,6 +239,71 @@ altered_cb (GObject *storage, const gchar *name, gpointer data) } } +static void +async_altered_one_manager_cb (McdManager *cm, + const GError *error, + gpointer data) +{ + McdAlterAccountData *altered = data; + const gchar *name = NULL; + + if (cm != NULL) + name = mcd_manager_get_name (cm); + + if (error != NULL) + DEBUG ("manager %s not ready: %s", name, error->message); + else + DEBUG ("manager %s is ready", name); + + /* this triggers the final parameter check which results in dbus signals * + * being fired and (potentially) the account going online automatically */ + mcd_account_property_changed (altered->account, altered->property); + + g_object_unref (cm); + g_object_unref (altered->account); + g_free (altered->property); + g_slice_free (McdAlterAccountData, altered); +} + + +static void +altered_one_cb (GObject *storage, + const gchar *account_name, + const gchar *key, + gpointer data) +{ + McdAccountManager *am = MCD_ACCOUNT_MANAGER (data); + McdMaster *master = mcd_master_get_default (); + McdAccount *account = NULL; + McdManager *cm = NULL; + const gchar *cm_name = NULL; + + account = mcd_account_manager_lookup_account (am, account_name); + + if (G_UNLIKELY (!account)) + { + g_warning ("%s: account %s does not exist", G_STRFUNC, account_name); + return; + } + + /* in theory, the CM is already ready by this point, but make sure: */ + cm_name = mcd_account_get_manager_name (account); + + if (cm_name != NULL) + cm = _mcd_master_lookup_manager (master, cm_name); + + if (cm != NULL) + { + McdAlterAccountData *altered = g_slice_new0 (McdAlterAccountData); + + g_object_ref (cm); + altered->account = g_object_ref (account); + altered->property = g_strdup (key); + + mcd_manager_call_when_ready (cm, async_altered_one_manager_cb, altered); + } +} + /* callbacks for the various stages in an backend-driven account creation */ static void async_created_validity_cb (McdAccount *account, gboolean valid, gpointer data) @@ -459,6 +530,8 @@ sort_and_cache_plugins (McdAccountManager *self) g_signal_connect (plugin, "altered", G_CALLBACK (altered_cb), self); g_signal_connect (plugin, "toggled", G_CALLBACK (toggled_cb), self); g_signal_connect (plugin, "deleted", G_CALLBACK (deleted_cb), self); + g_signal_connect (plugin, "altered-one", G_CALLBACK (altered_one_cb), + self); } plugins_cached = TRUE; |