/* 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 (); }
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); }