static void test_folder_search_sub (CamelFolder *folder, const gchar *expr, gint expected) { GPtrArray *uids; GHashTable *hash; gint i; GError *error = NULL; uids = camel_folder_search_by_expression (folder, expr, NULL, &error); check (uids != NULL); check_msg (uids->len == expected, "search %s expected %d got %d", expr, expected, uids->len); check_msg (error == NULL, "%s", error->message); g_clear_error (&error); /* check the uid's are actually unique, too */ hash = g_hash_table_new (g_str_hash, g_str_equal); for (i = 0; i < uids->len; i++) { check (g_hash_table_lookup (hash, uids->pdata[i]) == NULL); g_hash_table_insert (hash, uids->pdata[i], uids->pdata[i]); } g_hash_table_destroy (hash); camel_folder_search_free (folder, uids); }
static void offline_folder_downsync (CamelOfflineFolder *offline, const char *expression, CamelException *ex) { CamelFolder *folder = (CamelFolder *) offline; CamelMimeMessage *message; GPtrArray *uids; int i; camel_operation_start (NULL, _("Syncing messages in folder '%s' to disk"), folder->full_name); if (expression) uids = camel_folder_search_by_expression (folder, expression, ex); else uids = camel_folder_get_uids (folder); if (!uids) { camel_operation_end (NULL); return; } for (i = 0; i < uids->len; i++) { int pc = i * 100 / uids->len; message = camel_folder_get_message (folder, uids->pdata[i], ex); camel_operation_progress (NULL, pc); if (message == NULL) break; camel_object_unref (message); } if (expression) camel_folder_search_free (folder, uids); else camel_folder_free_uids (folder, uids); camel_operation_end (NULL); }
static gpointer worker (gpointer d) { struct _threadinfo *info = d; gint i, j, id = info->id; gchar *sub, *content; GPtrArray *res; CamelMimeMessage *msg; GError *error = NULL; /* we add a message, search for it, twiddle some flags, delete it */ /* and flat out */ for (i = 0; i < MAX_MESSAGES; i++) { test_add_message (info->folder, id + i); sub = g_strdup_printf ("(match-all (header-contains \"subject\" \"message %08x subject\"))", id + i); push ("searching for message %d\n\tusing: %s", id + i, sub); res = camel_folder_search_by_expression (info->folder, sub, NULL, &error); check_msg (error == NULL, "%s", error->message); check_msg (res->len == 1, "res->len = %d", res->len); g_clear_error (&error); pull (); push ("getting message '%s'", res->pdata[0]); msg = camel_folder_get_message_sync ( info->folder, (gchar *) res->pdata[0], NULL, &error); check_msg (error == NULL, "%s", error->message); g_clear_error (&error); pull (); content = g_strdup_printf ("Test message %08x contents\n\n", id + i); push ("comparing content '%s': '%s'", res->pdata[0], content); test_message_compare_content (camel_medium_get_content ((CamelMedium *) msg), content, strlen (content)); test_free (content); pull (); push ("deleting message, cleanup"); j = (100.0 * rand () / (RAND_MAX + 1.0)); if (j <= 70) { camel_folder_delete_message (info->folder, res->pdata[0]); } camel_folder_search_free (info->folder, res); res = NULL; test_free (sub); check_unref (msg, 1); pull (); /* about 1-in 100 calls will expunge */ j = (200.0 * rand () / (RAND_MAX + 1.0)); if (j <= 2) { push ("expunging folder"); camel_folder_expunge_sync (info->folder, NULL, &error); check_msg (error == NULL, "%s", error->message); pull (); } } return info; }