+static guint signals[LAST_SIGNAL] = {0};
+
+
+static GSList *
+delete_account_from_list (GSList *list, const gchar *name)
+{
+ GSList *iter, *result;
+
+ iter = list;
+ result = list;
+ while (iter) {
+ if (!strcmp (name, iter->data)) {
+ result = g_slist_delete_link (list, iter);
+ break;
+ }
+
+ iter = g_slist_next (iter);
+ }
+ return result;
+}
+
+static GSList *
+find_account_in_list (GSList *list, const gchar *name)
+{
+ GSList *iter, *result;
+
+ iter = list;
+ result = list;
+ while (iter) {
+ if (!strcmp (name, iter->data)) {
+ return iter;
+ break;
+ }
+
+ iter = g_slist_next (iter);
+ }
+ return NULL;
+}
+
+/* Map configuration changes to account changes.
+ * Doing this here makes sure all changes are available and external changes
+ * are covered as well. */
+
+static void
+modest_account_mgr_check_change (ModestConf *conf, const gchar *key,
+ const gchar *new_value, gpointer user_data)
+{
+ ModestAccountMgr *amgr = user_data;
+ ModestAccountMgrPrivate *priv = MODEST_ACCOUNT_MGR_GET_PRIVATE (amgr);
+
+ if ((strlen (key) > strlen (MODEST_SERVER_ACCOUNT_NAMESPACE "/")
+ && g_str_has_prefix (key, MODEST_SERVER_ACCOUNT_NAMESPACE))) {
+ gchar *subkey = g_strdup(key + strlen (MODEST_SERVER_ACCOUNT_NAMESPACE "/"));
+
+ if (! strstr (subkey, "/")) { /* no more '/' means an account was modified */
+ if (!new_value) {
+ priv->current_accounts =
+ delete_account_from_list (priv->current_accounts, subkey);
+
+ g_signal_emit (amgr, signals[ACCOUNT_REMOVE_SIGNAL], 0, subkey);
+ }
+ }
+ else {
+ gchar *param;
+
+ param = strstr (subkey, "/");
+ param [0] = 0;
+ param++;
+
+ /* that's the second case for a new account */
+ if (!find_account_in_list (priv->current_accounts, subkey) && strstr (param, MODEST_ACCOUNT_PROTO)) {
+ priv->current_accounts =
+ g_slist_prepend (priv->current_accounts, g_strdup (subkey));
+ g_signal_emit (amgr, signals[ACCOUNT_ADD_SIGNAL], 0, subkey);
+ }
+
+ g_signal_emit (amgr, signals[ACCOUNT_CHANGE_SIGNAL], 0, subkey, param, new_value);
+ }
+
+ g_free (subkey);
+ }
+}
+