void
remove_google_contacts_source_group (void)
{
	ESourceList  *source_list;
	ESourceGroup *group;
	const gchar *key;

	key = "/apps/evolution/addressbook/sources";
	source_list = e_source_list_new_for_gconf_default (key);

	if (source_list == NULL)
		return;

	group = e_source_list_peek_group_by_base_uri (source_list, "google://");

	if (group) {
		GSList *sources;

		sources = e_source_group_peek_sources (group);

		if (NULL == sources) {
			e_source_list_remove_group (source_list, group);
			e_source_list_sync (source_list, NULL);
		}
	}
	g_object_unref (source_list);
}
示例#2
0
static void
add_planner_file (const gchar *conf_key,
		  const gchar *uri)
{
	ESourceList  *source_list;
	ESourceGroup *group;
	ESource      *source;
	char         *group_name;

	source_list = e_source_list_new_for_gconf (conf_client, conf_key);

	group_name = g_strdup_printf ("Projects");
	group = e_source_group_new (group_name, "planner://");
	e_source_list_add_group (source_list, group, -1);

	g_free (group_name);
	group_name = g_strdup_printf ("%s", uri);
	source = e_source_new ("Calendar", group_name);
	e_source_group_add_source (group, source, -1);

	e_source_list_sync (source_list, NULL);

	g_free (group_name);
	g_object_unref (source);
	g_object_unref (group);
	g_object_unref (source_list);
}
示例#3
0
gboolean
e_memo_shell_backend_migrate (EShellBackend *shell_backend,
                              gint major,
                              gint minor,
                              gint revision,
                              GError **error)
{
	ESourceGroup *on_this_computer = NULL;
	ESourceGroup *on_the_web = NULL;
	ESource *personal_source = NULL;
	ESourceList *source_list = NULL;
	gboolean retval = FALSE;

	g_object_get (shell_backend, "source-list", &source_list, NULL);

	/* we call this unconditionally now - create_groups either
	 * creates the groups/sources or it finds the necessary
	 * groups/sources. */
	create_memo_sources (
		shell_backend, source_list, &on_this_computer,
		&on_the_web, &personal_source);

	e_source_list_sync (source_list, NULL);
	retval = TRUE;

	if (on_this_computer)
		g_object_unref (on_this_computer);
	if (on_the_web)
		g_object_unref (on_the_web);
	if (personal_source)
		g_object_unref (personal_source);

	return retval;
}
static void
action_address_book_delete_cb (GtkAction *action,
                               EBookShellView *book_shell_view)
{
	EShellView *shell_view;
	EShellWindow *shell_window;
	EBookShellBackend *book_shell_backend;
	EBookShellSidebar *book_shell_sidebar;
	ESource *source;
	ESourceSelector *selector;
	ESourceGroup *source_group;
	ESourceList *source_list;
	EBookClient *book;
	gint response;
	GError *error = NULL;

	shell_view = E_SHELL_VIEW (book_shell_view);
	shell_window = e_shell_view_get_shell_window (shell_view);

	book_shell_backend = book_shell_view->priv->book_shell_backend;
	source_list = e_book_shell_backend_get_source_list (book_shell_backend);

	book_shell_sidebar = book_shell_view->priv->book_shell_sidebar;
	selector = e_book_shell_sidebar_get_selector (book_shell_sidebar);
	source = e_source_selector_get_primary_selection (selector);
	g_return_if_fail (source != NULL);

	response = e_alert_run_dialog_for_args (
		GTK_WINDOW (shell_window),
		"addressbook:ask-delete-addressbook",
		e_source_peek_name (source), NULL);

	if (response != GTK_RESPONSE_YES)
		return;

	book = e_book_client_new (source, &error);
	if (error != NULL) {
		g_warning ("Error removing addressbook: %s", error->message);
		g_error_free (error);
		return;
	}

	if (!e_client_remove_sync (E_CLIENT (book), NULL, NULL)) {
		e_alert_run_dialog_for_args (
			GTK_WINDOW (shell_window),
			"addressbook:remove-addressbook", NULL);
		g_object_unref (book);
		return;
	}

	if (e_source_selector_source_is_selected (selector, source))
		e_source_selector_unselect_source (selector, source);

	source_group = e_source_peek_group (source);
	e_source_group_remove_source (source_group, source);

	e_source_list_sync (source_list, NULL);

	g_object_unref (book);
}
示例#5
0
/* takes ownership of source */
void eee_accounts_manager_add_source(EeeAccountsManager *self, const char *group_name, ESource *source)
{
    char *real_group_name;
    ESourceGroup *group;

    g_return_if_fail(IS_EEE_ACCOUNTS_MANAGER(self));
    g_return_if_fail(group_name != NULL);
    g_return_if_fail(source != NULL);
    g_return_if_fail(e_source_is_3e(source));

    real_group_name = g_strdup_printf("3e: %s", group_name);
#if EVOLUTION_VERSION >= 232
    group = e_source_list_peek_group_by_properties(self->priv->eslist, "name", real_group_name, NULL);
#else
    group = e_source_list_peek_group_by_name(self->priv->eslist, real_group_name);
#endif /* EVOLUTION_VERSION >= 232 */
    if (group == NULL)
    {
        group = e_source_group_new(real_group_name, EEE_URI_PREFIX);
        e_source_list_add_group(self->priv->eslist, group, -1);
        g_object_unref(group);
    }
    g_free(real_group_name);

    e_source_group_add_source(group, source, -1);
    g_object_unref(source);

    e_source_list_sync(self->priv->eslist, NULL);
}
static void
add_account (const char *conf_key, const char *hostname, const char *username, const char *password)
{
    ESourceList *source_list;
    ESourceGroup *group;
    ESource *source;
    char *group_name;

    source_list = e_source_list_new_for_gconf (conf_client, conf_key);

    group_name = g_strdup_printf ("%s@%s:7181/soap", username, hostname);
    group = e_source_group_new ("Groupwise", "groupwise://");
    e_source_list_add_group (source_list, group, -1);

    if (password && *password) {
        g_free (group_name);
        group_name = g_strdup_printf ("%s:%s@%s/soap/", username, password, hostname);
    }
    source = e_source_new ("Frequent Contacts", group_name);
    e_source_set_property (source, "auth", "ldap/simple-binddn");
    e_source_set_property(source, "binddn", "user1");
    e_source_group_add_source (group, source, -1);
    /*
    	source = e_source_new ("Test User1", group_name);
    	e_source_set_property (source, "auth", "ldap/simple-binddn");
    	e_source_set_property(source, "binddn", "user1");
    	e_source_group_add_source (group, source, -1);
    	source = e_source_new ("mybook1", group_name);
    	e_source_set_property (source, "auth", "ldap/simple-binddn");
    	e_source_set_property(source, "binddn", "user1");
    	e_source_group_add_source (group, source, -1);*/
    e_source_list_sync (source_list, NULL);

    g_free (group_name);
    g_object_unref (source);
    g_object_unref (group);
    g_object_unref (source_list);
}
static void
remove_couchdb_contacts_source_group (void)
{
	ESourceList *source_list;

	source_list = e_source_list_new_for_gconf_default("/apps/evolution/addressbook/sources");
	if (source_list) {
		ESourceGroup *group;

		group = e_source_list_peek_group_by_base_uri (source_list, COUCHDB_BASE_URI);
		if (group) {
			GSList *sources;

			sources = e_source_group_peek_sources (group);
			if (sources == NULL) {
				e_source_list_remove_group (source_list, group);
				e_source_list_sync (source_list, NULL);
			}
		}

		g_object_unref (G_OBJECT (source_list));
	}
}
ESourceGroup *
e_source_list_ensure_group (ESourceList *list, const gchar *name, const gchar *base_uri, gboolean ret_it)
{
        ESourceGroup *group;

        g_return_val_if_fail (E_IS_SOURCE_LIST (list), NULL);
        g_return_val_if_fail (name != NULL, NULL);
        g_return_val_if_fail (base_uri != NULL, NULL);

        group = e_source_list_peek_group_by_base_uri (list, base_uri);
        if (group) {
                e_source_group_set_name (group, name);
                if (ret_it)
                        g_object_ref (group);
                else
                        group = NULL;
        } else {
                group = e_source_group_new (name, base_uri);

                if (!e_source_list_add_group (list, group, -1)) {
                        g_warning ("Could not add source group %s with base uri %s to a source list", name, base_uri);
                        g_object_unref (group);
                        group = NULL;
                } else {
                        /* save it now */
                        e_source_list_sync (list, NULL);

                        if (!ret_it) {
                                g_object_unref (group);
                                group = NULL;
                        }
                }
        }

        return group;
}
static void
synch_done (struct account_synch_msg *m)
{

    g_print ("SxAS: Emitting finished signal (%d) [%p]\n",
             m->success, g_thread_self ());

    /* Workaround for broken e_source_list and/or gconf */
    if (m->success) {
        ESourceList *slist;
        ESourceGroup *group;
        const char *group_uid;
        gboolean changed;
        ScalixAccountSynchPrivate *priv;

        changed = FALSE;
        slist = NULL;
        e_cal_get_sources (&slist, E_CAL_SOURCE_TYPE_EVENT, NULL);

        group_uid = e_source_group_peek_uid (m->esg_cals);
        group = e_source_list_peek_group_by_uid (slist, group_uid);

        g_print ("Cal: %s %p\n", group_uid, group);

        if (group == NULL) {
            e_source_list_add_group (slist, m->esg_cals, -1);
        } else {
            char *xml;

            xml = e_source_group_to_xml (m->esg_cals);
            g_print ("Xml: %s\n", xml);
            e_source_group_update_from_xml (group, xml, &changed);
            g_free (xml);
        }

        e_source_list_sync (slist, NULL);
        g_object_unref (slist);

        slist = NULL;
        changed = FALSE;
        e_book_get_addressbooks (&slist, NULL);

        group_uid = e_source_group_peek_uid (m->esg_cnts);
        group = e_source_list_peek_group_by_uid (slist, group_uid);
        g_print ("Cnt: %s %p\n", group_uid, group);

        if (group == NULL) {
            e_source_list_add_group (slist, m->esg_cnts, -1);
        } else {
            char *xml;

            xml = e_source_group_to_xml (m->esg_cnts);
            g_print ("Xml: %s\n", xml);
            e_source_group_update_from_xml (group, xml, &changed);
            g_free (xml);
        }

        e_source_list_sync (slist, NULL);
        g_object_unref (slist);

        priv = SCALIX_ACCOUNT_SYNCH_GET_PRIVATE (m->sxas);

        g_print ("SV: %s\n", m->sversion);

        scalix_account_prefs_set_sversion (priv->account, m->sversion, NULL);

    }

    g_signal_emit (m->sxas, sxas_signals[SAS_SIGNAL_FINISHED], 0, m->success);

    g_print ("SxAS: Emitting done\n");

}
示例#10
0
static void
ensure_sources (MemosComponent *component)
{
	GSList *groups;
	ESourceList *source_list;
	ESourceGroup *group;
	ESourceGroup *on_this_computer;
	ESourceGroup *on_the_web;
	ESource *personal_source;
	char *base_uri, *base_uri_proto;
	const gchar *base_dir;

	on_this_computer = NULL;
	on_the_web = NULL;
	personal_source = NULL;

	if (!e_cal_get_sources (&source_list, E_CAL_SOURCE_TYPE_JOURNAL, NULL)) {
		g_warning ("Could not get memo source list from GConf!");
		return;
	}

	base_dir = memos_component_peek_base_directory (component);
	base_uri = g_build_filename (base_dir, "local", NULL);

	base_uri_proto = g_filename_to_uri (base_uri, NULL, NULL);

	groups = e_source_list_peek_groups (source_list);
	if (groups) {
		/* groups are already there, we need to search for things... */
		GSList *g;

		for (g = groups; g; g = g->next) {

			group = E_SOURCE_GROUP (g->data);

			/* compare only file:// part. If user home dir name changes we do not want to create
			   one more group  */

			if (!on_this_computer && !strncmp (base_uri_proto, e_source_group_peek_base_uri (group), 7))
				on_this_computer = group;
			else if (!on_the_web && !strcmp (WEB_BASE_URI, e_source_group_peek_base_uri (group)))
				on_the_web = group;
		}
	}

	if (on_this_computer) {
		/* make sure "Personal" shows up as a source under
		   this group */
		GSList *sources = e_source_group_peek_sources (on_this_computer);
		GSList *s;
		for (s = sources; s; s = s->next) {
			ESource *source = E_SOURCE (s->data);
			const gchar *relative_uri;

			relative_uri = e_source_peek_relative_uri (source);
			if (relative_uri == NULL)
				continue;
			if (!strcmp (PERSONAL_RELATIVE_URI, relative_uri)) {
				personal_source = source;
				break;
			}
		}
		/* Make sure we have the correct base uri. This can change when user's
		   homedir name changes */
		if (strcmp (base_uri_proto, e_source_group_peek_base_uri (on_this_computer))) {
		    e_source_group_set_base_uri (on_this_computer, base_uri_proto);

		    /* *sigh* . We shouldn't  need this sync call here as set_base_uri
		       call results in synching to gconf, but that happens in idle loop
		       and too late to prevent user seeing "Can not Open ... because of invalid uri" error.*/
		    e_source_list_sync (source_list,NULL);
		}
	}
	else {
		/* create the local source group */
		group = e_source_group_new (_("On This Computer"), base_uri_proto);
		e_source_list_add_group (source_list, group, -1);

		on_this_computer = group;
	}

	if (!personal_source) {
		GSList *memos_selected;
		/* Create the default Person addressbook */
		ESource *source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI);
		e_source_group_add_source (on_this_computer, source, -1);

		memos_selected = calendar_config_get_memos_selected ();

		if (!calendar_config_get_primary_memos () && !memos_selected) {
			GSList selected;

			calendar_config_set_primary_memos (e_source_peek_uid (source));

			selected.data = (gpointer)e_source_peek_uid (source);
			selected.next = NULL;
			calendar_config_set_memos_selected (&selected);
		}

		if (memos_selected) {
			g_slist_foreach (memos_selected, (GFunc) g_free, NULL);
			g_slist_free (memos_selected);
		}

		e_source_set_color_spec (source, "#BECEDD");
		personal_source = source;
	}

	if (!on_the_web) {
		/* Create the LDAP source group */
		group = e_source_group_new (_("On The Web"), WEB_BASE_URI);
		e_source_list_add_group (source_list, group, -1);

		on_the_web = group;
	}

	component->priv->source_list = source_list;
	g_free (base_uri_proto);
	g_free (base_uri);
}
示例#11
0
static gint
on_idle_do_stuff (gpointer unused_data)
{
	GConfClient *client = gconf_client_get_default ();
	ESourceGroup *new_group = NULL;
	ESource *new_source = NULL;

	list = e_source_list_new_for_gconf (client, key_arg);
	g_object_unref (client);

	if (add_group_arg != NULL) {
		if (group_arg != NULL) {
			fprintf (stderr, "--add-group and --group cannot be used at the same time.\n");
			exit (1);
		}
		if (set_base_uri_arg == NULL) {
			fprintf (stderr, "When using --add-group, you need to specify a base URI using --set-base-uri.\n");
			exit (1);
		}

		new_group = e_source_group_new (add_group_arg, set_base_uri_arg);
		e_source_list_add_group (list, new_group, -1);
		g_object_unref (new_group);

		e_source_list_sync (list, NULL);
	}

	if (remove_group_arg != NULL) {
		ESourceGroup *group;

		group = e_source_list_peek_group_by_uid (list, remove_group_arg);
		if (group == NULL) {
			fprintf (stderr, "No such group \"%s\".\n", remove_group_arg);
			exit (1);
		}

		e_source_list_remove_group (list, group);
		e_source_list_sync (list, NULL);
	}

	if (add_source_arg != NULL) {
		ESourceGroup *group;

		if (group_arg == NULL && new_group == NULL) {
			fprintf (stderr,
				 "When using --add-source, you need to specify a group using either --group\n"
				 "or --add-group.\n");
			exit (1);
		}
		if (set_relative_uri_arg == NULL) {
			fprintf (stderr,
				 "When using --add-source, you need to specify a relative URI using\n"
				 "--set-relative-uri.\n");
			exit (1);
		}

		if (group_arg == NULL) {
			group = new_group;
		} else {
			group = e_source_list_peek_group_by_uid (list, group_arg);
			if (group == NULL) {
				fprintf (stderr, "No such group \"%s\".\n", group_arg == NULL ? add_group_arg : group_arg);
				exit (1);
			}
		}

		new_source = e_source_new (add_source_arg, set_relative_uri_arg);
		e_source_group_add_source (group, new_source, -1);
		e_source_list_sync (list, NULL);
	}

	if (remove_source_arg != NULL) {
		ESource *source;

		source = e_source_list_peek_source_by_uid (list, remove_source_arg);
		if (source == NULL) {
			fprintf (stderr, "No such source \"%s\".\n", remove_source_arg);
			exit (1);
		}

		e_source_list_remove_source_by_uid (list, remove_source_arg);
		e_source_list_sync (list, NULL);
	}

	if (set_name_arg != NULL) {
		if (group_arg == NULL && source_arg == NULL) {
			fprintf (stderr,
				 "When using --set-name, you need to specify a source (using --source"
				 "alone) or a group (using --group alone).\n");
			exit (1);
		}

		if (source_arg != NULL) {
			ESource *source = e_source_list_peek_source_by_uid (list, source_arg);

			if (source != NULL) {
				e_source_set_name (source, set_name_arg);
			} else {
				fprintf (stderr, "No such source \"%s\".\n", source_arg);
				exit (1);
			}
		} else {
			ESourceGroup *group = e_source_list_peek_group_by_uid (list, group_arg);

			if (group != NULL) {
				e_source_group_set_name (group, set_name_arg);
			} else {
				fprintf (stderr, "No such group \"%s\".\n", group_arg);
				exit (1);
			}
		}

		e_source_list_sync (list, NULL);
	}

	if (set_relative_uri_arg != NULL && add_source_arg == NULL) {
		ESource *source;

		if (source_arg == NULL) {
			fprintf (stderr,
				 "When using --set-relative-uri, you need to specify a source using "
				 "--source.\n");
			exit (1);
		}

		source = e_source_list_peek_source_by_uid (list, source_arg);
		e_source_set_relative_uri (source, set_relative_uri_arg);
		e_source_list_sync (list, NULL);
	}

	if (set_color_arg != NULL) {
		ESource *source;

		if (add_source_arg == NULL && source_arg == NULL) {
			fprintf (stderr,
				 "When using --set-color, you need to specify a source using --source\n");
			exit (1);
		}

		if (add_source_arg != NULL)
			source = new_source;
		else
			source = e_source_list_peek_source_by_uid (list, source_arg);

		e_source_set_color_spec (source, set_color_arg);
		e_source_list_sync (list, NULL);
	}

	if (unset_color) {
		ESource *source;

		if (add_source_arg == NULL && source_arg == NULL) {
			fprintf (stderr,
				 "When using --unset-color, you need to specify a source using --source\n");
			exit (1);
		}

		if (add_source_arg != NULL)
			source = new_source;
		else
			source = e_source_list_peek_source_by_uid (list, source_arg);

		e_source_set_color_spec (source, NULL);
		e_source_list_sync (list, NULL);
	}

	if (set_base_uri_arg != NULL && add_group_arg == NULL) {
		ESourceGroup *group;

		if (group_arg == NULL) {
			fprintf (stderr,
				 "When using --set-base-uri, you need to specify a group using --group.\n");
			exit (1);
		}

		group = e_source_list_peek_group_by_uid (list, group_arg);
		e_source_group_set_base_uri (group, set_base_uri_arg);
		e_source_list_sync (list, NULL);
	}

	if (set_value_arg != NULL) {
		ESource *source;

		if (add_source_arg == NULL && source_arg == NULL) {
			fprintf (stderr,
				 "When using --set-value, you need to specify a source using --source\n");
			exit (1);
		}

		if (property_arg == NULL) {
			fprintf (stderr,
				 "When using --set-value, you need to specify a property using --property\n");
			exit (1);
		}

		if (add_source_arg != NULL)
			source = new_source;
		else
			source = e_source_list_peek_source_by_uid (list, source_arg);

		e_source_set_property (source, property_arg, set_value_arg);
		e_source_list_sync (list, NULL);
	}

	if (unset_value) {
		ESource *source;

		if (add_source_arg == NULL && source_arg == NULL) {
			fprintf (stderr,
				 "When using --unset-value, you need to specify a source using --source\n");
			exit (1);
		}

		if (property_arg == NULL) {
			fprintf (stderr,
				 "When using --unset-value, you need to specify a property using --property\n");
			exit (1);
		}

		if (add_source_arg != NULL)
			source = new_source;
		else
			source = e_source_list_peek_source_by_uid (list, source_arg);

		e_source_set_property (source, property_arg, NULL);
		e_source_list_sync (list, NULL);
	}

	connect_list ();

	if (dump)
		dump_list ();

	if (!listen)
		g_main_loop_quit (main_loop);

	return FALSE;
}
示例#12
0
void eee_accounts_manager_activate_accounts(EeeAccountsManager *self)
{
    GSList *iter, *iter2, *iter2_next, *iter_next;

    g_return_if_fail(IS_EEE_ACCOUNTS_MANAGER(self));

    // for each accessible account
    for (iter = self->priv->access_accounts; iter; iter = iter->next)
    {
        EeeAccount *account;
        ESourceGroup *group;
        char *name = iter->data;
        char *group_name = g_strdup_printf("3e: %s", name);

        // find ESourceGroup and EeeAccount
#if EVOLUTION_VERSION >= 232
        group = e_source_list_peek_group_by_properties(self->priv->eslist, "name", group_name, NULL);
#else
        group = e_source_list_peek_group_by_name(self->priv->eslist, group_name);
#endif /* EVOLUTION_VERSION >= 232 */
        account = eee_accounts_manager_find_account_by_name(self, name);

        // create account if it does not exist
        if (account == NULL)
        {
            account = eee_account_new(name);
            eee_account_set_state(account, EEE_ACCOUNT_STATE_NOTAVAIL);
            eee_accounts_manager_add_account(self, account);
        }

        // create group if it does not exist
        if (group == NULL)
        {
            group = e_source_group_new(group_name, EEE_URI_PREFIX);
            e_source_list_add_group(self->priv->eslist, group, -1);
            g_object_unref(group);
        }
        else
        {
            // check group sources
            for (iter2 = e_source_group_peek_sources(group); iter2 != NULL; iter2 = iter2_next)
            {
                // we may be removing sources so ensure that we have valid next pointer
                iter2_next = iter2->next;
                ESource *source = iter2->data;

                if (e_source_is_3e(source))
                {
                    const char *calname = e_source_get_property(source, "eee-calname");
                    e_source_set_3e_properties(source, calname, account->name, account, NULL, NULL, 0);
                }
                else
                {
                    // ESource without calname is useless, drop it
                    e_source_group_remove_source(group, source);
                }
            }
            g_free(group_name);
        }

        g_object_set_data(G_OBJECT(group), "accessible", (gpointer)TRUE);
    }

    // for each ESourceGroup that does not represent accessible account
    for (iter = e_source_list_peek_groups(self->priv->eslist); iter; iter = iter_next)
    {
        iter_next = iter->next;
        ESourceGroup *group = iter->data;
        gboolean contains_source = FALSE;

        // skip non-3E groups and accessible groups initialized above
        if (!e_source_group_is_3e(group) || g_object_get_data(G_OBJECT(group), "accessible"))
        {
            continue;
        }

        for (iter2 = e_source_group_peek_sources(group); iter2 != NULL; iter2 = iter2_next)
        {
            // we may be removing sources so ensure that we have valid next pointer
            iter2_next = iter2->next;
            ESource *source = iter2->data;

            // these ESources are probably for shared calendars, if we can't find
            // account for them, remove them
            if (eee_accounts_manager_find_account_by_source(self, source))
            {
                contains_source = TRUE;
            }
            else
            {
                e_source_group_remove_source(group, source);
            }
        }

        if (!contains_source)
        {
            e_source_list_remove_group(self->priv->eslist, group);
        }
    }

    e_source_list_sync(self->priv->eslist, NULL);
}
示例#13
0
/* sync finish phase */
static gboolean eee_accounts_manager_sync_phase2(EeeAccountsManager *self)
{
    GSList *iter, *iter2, *iter_next, *iter2_next;

    g_return_val_if_fail(IS_EEE_ACCOUNTS_MANAGER(self), FALSE);

    // unmark groups/sources
    for (iter = e_source_list_peek_groups(self->priv->eslist); iter; iter = iter->next)
    {
        ESourceGroup *group = E_SOURCE_GROUP(iter->data);

        if (!e_source_group_is_3e(group))
        {
            continue;
        }

        g_object_set_data(G_OBJECT(group), "synced", (gpointer)FALSE);
        for (iter2 = e_source_group_peek_sources(group); iter2; iter2 = iter2->next)
        {
            ESource *source = E_SOURCE(iter2->data);
            g_object_set_data(G_OBJECT(source), "synced", (gpointer)FALSE);
        }
    }

    // go through synced account description structures and update ESourceList
    // accordingly
    for (iter = self->priv->sync_accounts; iter; iter = iter->next)
    {
        EeeAccount *account = iter->data;
        EeeAccount *current_account;
        ESourceGroup *group;
        char *group_name = g_strdup_printf("3e: %s", account->name);

        // find ESourceGroup and EeeAccount
#if EVOLUTION_VERSION >= 232
        group = e_source_list_peek_group_by_properties(self->priv->eslist, "name", group_name, NULL);
#else
        group = e_source_list_peek_group_by_name(self->priv->eslist, group_name);
#endif /* EVOLUTION_VERSION >= 232 */
        current_account = eee_accounts_manager_find_account_by_name(self, account->name);

        if (account->state == EEE_ACCOUNT_STATE_DISABLED)
        {
            if (current_account)
            {
                eee_accounts_manager_remove_account(self, current_account);
            }
            if (group)
            {
                e_source_list_remove_group(self->priv->eslist, group);
            }
            g_object_unref(account);
            continue;
        }

        // create account if it does not exist
        if (current_account == NULL)
        {
            eee_accounts_manager_add_account(self, g_object_ref(account));
        }
        else
        {
            eee_account_copy(current_account, account);
        }

        // create group if it does not exist
        if (group == NULL)
        {
            group = e_source_group_new(group_name, EEE_URI_PREFIX);
            e_source_list_add_group(self->priv->eslist, group, -1);
            g_object_unref(group);
        }
        g_free(group_name);

        // check group sources if account is available, otherwise just mark them as
        // synced
        if (account->state == EEE_ACCOUNT_STATE_NOTAVAIL)
        {
            GSList *iter_grp, *iter_src;
            for (iter_grp = e_source_list_peek_groups(self->priv->eslist); iter_grp; iter_grp = iter_grp->next)
            {
                ESourceGroup *group = iter_grp->data;
                for (iter_src = e_source_group_peek_sources(group); iter_src; iter_src = iter_src->next)
                {
                    ESource *source = iter_src->data;
                    const char *account_name = e_source_get_property(source, "eee-account");
                    if (account_name && !strcmp(account_name, account->name))
                    {
                        g_object_set_data(G_OBJECT(source), "synced", (gpointer)TRUE);
                        g_object_set_data(G_OBJECT(group), "synced", (gpointer)TRUE);
                    }
                }
            }
        }
        else
        {
            GArray * cals = eee_account_peek_calendars (account);
            guint i;
            for (i = 0; i < cals->len; i++)
            {
                ESCalendarInfo *cal = g_array_index (cals, ESCalendarInfo *, i);
                ESource *source;

                if (!strcmp(cal->owner, account->name))
                {
                    // calendar owned by owner of account that represents current group
                    source = e_source_group_peek_source_by_calname(group, cal->name);
                    if (source == NULL)
                    {
                        source = e_source_new_3e_with_attrs(cal->name, cal->owner, account, cal->perm, cal->attrs);
                        e_source_group_add_source(group, source, -1);
                        g_object_unref(source);
                    }
                    else
                    {
                        e_source_set_3e_properties_with_attrs(source, cal->name, cal->owner, account, cal->perm, cal->attrs);
                    }
                }
                else
                {
                    char *owner_group_name = g_strdup_printf("3e: %s", cal->owner);
                    // shared calendar, it should be put into another group
#if EVOLUTION_VERSION >= 232
                    ESourceGroup *owner_group = e_source_list_peek_group_by_properties(self->priv->eslist, "name", owner_group_name, NULL);
#else
                    ESourceGroup *owner_group = e_source_list_peek_group_by_name(self->priv->eslist, owner_group_name);
#endif /* EVOLUTION_VERSION >= 232 */
                    if (owner_group == NULL)
                    {
                        owner_group = e_source_group_new(owner_group_name, EEE_URI_PREFIX);
                        e_source_list_add_group(self->priv->eslist, owner_group, -1);
                        g_object_unref(owner_group);
                    }
                    g_object_set_data(G_OBJECT(owner_group), "synced", (gpointer)TRUE);

                    source = e_source_group_peek_source_by_calname(owner_group, cal->name);
                    if (source == NULL)
                    {
                        source = e_source_new_3e_with_attrs(cal->name, cal->owner, account, cal->perm, cal->attrs);
                        e_source_group_add_source(owner_group, source, -1);
                        g_object_unref(source);
                    }
                    else
                    {
                        e_source_set_3e_properties_with_attrs(source, cal->name, cal->owner, account, cal->perm, cal->attrs);
                    }
                }
                g_object_set_data(G_OBJECT(source), "synced", (gpointer)TRUE);
            }
        }

        g_object_set_data(G_OBJECT(group), "synced", (gpointer)TRUE);
        g_object_unref(account);
    }

    g_slist_free(self->priv->sync_accounts);
    self->priv->sync_accounts = NULL;

    // remove non-marked sources/groups
    for (iter = e_source_list_peek_groups(self->priv->eslist); iter; iter = iter_next)
    {
        ESourceGroup *group = E_SOURCE_GROUP(iter->data);
        iter_next = iter->next;

        if (!e_source_group_is_3e(group))
        {
            continue;
        }

        if (g_object_get_data(G_OBJECT(group), "synced"))
        {
            for (iter2 = e_source_group_peek_sources(group); iter2; iter2 = iter2_next)
            {
                ESource *source = E_SOURCE(iter2->data);
                iter2_next = iter2->next;

                if (!g_object_get_data(G_OBJECT(source), "synced"))
                {
                    e_source_group_remove_source(group, source);
                }
            }
        }
        else
        {
            e_source_list_remove_group(self->priv->eslist, group);
        }
    }

    e_source_list_sync(self->priv->eslist, NULL);

    return TRUE;
}