Exemplo n.º 1
0
/* TODO: Add subscription stuff */
void
test_folder_basic (CamelSession *session,
                   const gchar *storename,
                   gint local,
                   gint spool)
{
	CamelStore *store;
	CamelFolder *folder;
	CamelService *service;
	gchar *what = g_strdup_printf ("testing store: %s", storename);
	GError *error = NULL;

	camel_test_start (what);
	test_free (what);

	push ("getting store");
	service = camel_session_add_service (
		session, storename, storename, CAMEL_PROVIDER_STORE, &error);
	check_msg (error == NULL, "adding store: %s", error->message);
	check (CAMEL_IS_STORE (service));
	store = CAMEL_STORE (service);
	pull ();

	/* local providers == no inbox */
	push ("getting inbox folder");
	folder = camel_store_get_inbox_folder_sync (store, NULL, &error);
	if (local) {
		/* Well, maildir can have an inbox */
		if (folder) {
			check (error == NULL);
			check_unref (folder, 1);
		} else {
			check (error != NULL);
		}
	} else {
		check_msg (error == NULL, "%s", error->message);
		check (folder != NULL);
		check_unref (folder, 2);
	}
	g_clear_error (&error);
	pull ();

	push ("getting a non-existant folder, no create");
	folder = camel_store_get_folder_sync (
		store, "unknown", 0, NULL, &error);
	check (error != NULL);
	check (folder == NULL);
	g_clear_error (&error);
	pull ();

	if (!spool) {
		push ("getting a non-existant folder, with create");
		folder = camel_store_get_folder_sync (
			store, "testbox", CAMEL_STORE_FOLDER_CREATE,
			NULL, &error);
		check_msg (error == NULL, "%s", error->message);
		check (folder != NULL);
		if (local)
			check_unref (folder, 1);
		else
			check_unref (folder, 2);
		g_clear_error (&error);
		pull ();

		push ("getting an existing folder");
		folder = camel_store_get_folder_sync (
			store, "testbox", 0, NULL, &error);
		check_msg (error == NULL, "%s", error->message);
		check (folder != NULL);
		if (local)
			check_unref (folder, 1);
		else
			check_unref (folder, 2);
		g_clear_error (&error);
		pull ();

		push ("renaming a non-existant folder");
		camel_store_rename_folder_sync (
			store, "unknown1", "unknown2", NULL, &error);
		check (error != NULL);
		g_clear_error (&error);
		pull ();

		push ("renaming an existing folder");
		camel_store_rename_folder_sync (
			store, "testbox", "testbox2", NULL, &error);
		check_msg (error == NULL, "%s", error->message);
		g_clear_error (&error);
		pull ();

		push ("opening the old name of a renamed folder");
		folder = camel_store_get_folder_sync (
			store, "testbox", 0, NULL, &error);
		check (error != NULL);
		check (folder == NULL);
		g_clear_error (&error);
		pull ();

		push ("opening the new name of a renamed folder");
		folder = camel_store_get_folder_sync (
			store, "testbox2", 0, NULL, &error);
		check_msg (error == NULL, "%s", error->message);
		check (folder != NULL);
		if (local)
			check_unref (folder, 1);
		else
			check_unref (folder, 2);
		pull ();
	}

	push ("deleting a non-existant folder");
	camel_store_delete_folder_sync (store, "unknown", NULL, &error);
	check (error != NULL);
	g_clear_error (&error);
	pull ();

	if (!spool) {
		push ("deleting an existing folder");
		camel_store_delete_folder_sync (
			store, "testbox2", NULL, &error);
		check_msg (error == NULL, "%s", error->message);
		g_clear_error (&error);
		pull ();
	}

	push ("opening a folder that has been deleted");
	folder = camel_store_get_folder_sync (
		store, "testbox2", 0, NULL, &error);
	check (error != NULL);
	check (folder == NULL);
	g_clear_error (&error);
	pull ();

	check_unref (store, 1);

	camel_test_end ();
}
Exemplo n.º 2
0
static void
rule_changed (EFilterRule *rule,
              CamelFolder *folder)
{
	EMailBackend *backend;
	EMailSession *session;
	GList *sources_uri = NULL, *sources_folder = NULL;
	GString *query;
	const gchar *full_name;

	full_name = camel_folder_get_full_name (folder);
	backend = em_vfolder_rule_get_backend (EM_VFOLDER_RULE (rule));
	session = e_mail_backend_get_session (backend);

	/* if the folder has changed name, then add it, then remove the old manually */
	if (strcmp (full_name, rule->name) != 0) {
		gchar *oldname;

		gpointer key;
		gpointer oldfolder;

		G_LOCK (vfolder);
		d(printf("Changing folder name in hash table to '%s'\n", rule->name));
		if (g_hash_table_lookup_extended (vfolder_hash, full_name, &key, &oldfolder)) {
			g_hash_table_remove (vfolder_hash, key);
			g_free (key);
			g_hash_table_insert (vfolder_hash, g_strdup (rule->name), folder);
			G_UNLOCK (vfolder);
		} else {
			G_UNLOCK (vfolder);
			g_warning("couldn't find a vfolder rule in our table? %s", full_name);
		}

		oldname = g_strdup (full_name);
		/* FIXME Not passing a GCancellable or GError. */
		camel_store_rename_folder_sync (
			vfolder_store, oldname, rule->name, NULL, NULL);
		g_free (oldname);
	}

	d(printf("Filter rule changed? for folder '%s'!!\n", folder->name));

	/* find any (currently available) folders, and add them to the ones to open */
	rule_add_sources (
		session, &((EMVFolderRule *) rule)->sources,
		&sources_folder, &sources_uri);

	G_LOCK (vfolder);
	if (((EMVFolderRule *) rule)->with ==
			EM_VFOLDER_RULE_WITH_LOCAL ||
			((EMVFolderRule *) rule)->with ==
			EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE)
		rule_add_sources (
			session, &source_folders_local,
			&sources_folder, &sources_uri);
	if (((EMVFolderRule *) rule)->with ==
			EM_VFOLDER_RULE_WITH_REMOTE_ACTIVE ||
			((EMVFolderRule *) rule)->with ==
			EM_VFOLDER_RULE_WITH_LOCAL_REMOTE_ACTIVE)
		rule_add_sources (
			session, &source_folders_remote,
			&sources_folder, &sources_uri);
	G_UNLOCK (vfolder);

	query = g_string_new("");
	e_filter_rule_build_code (rule, query);

	vfolder_setup (session, folder, query->str, sources_uri, sources_folder);

	g_string_free (query, TRUE);
}