summaryrefslogtreecommitdiff
path: root/src/mcd-account-manager.c
diff options
context:
space:
mode:
authorVivek Dasmohapatra <vivek@collabora.co.uk>2010-06-30 12:36:06 +0100
committerVivek Dasmohapatra <vivek@collabora.co.uk>2010-07-01 16:38:44 +0100
commit8560edb3620021e4e69a9e03d26e6753bed13db0 (patch)
tree630dcb50b84ba322ad6c05711f036897af7fdf3e /src/mcd-account-manager.c
parent746ad961203ee9d4ddeccf50d80b8a1f96739153 (diff)
Handle the single changed property signal from storage backends
Diffstat (limited to 'src/mcd-account-manager.c')
-rw-r--r--src/mcd-account-manager.c73
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;