Index: ChangeLog =================================================================== RCS file: /cvs/gnome/evolution/camel/ChangeLog,v retrieving revision 1.684 diff -r1.684 ChangeLog 0a1,34 > 2001-01-17 Not Zed <NotZed@Ximian.com> > > * camel-folder.c (free_summary): Call > camel_folder_summary_array_free() to do the work. > (get_summary): Use camel_folder_summary_array() to get the array > atomically. These fixes allow folder/test8 to work again, and fix > a sort of race where the summary size can change while we were > making a copy of it. > > * camel-folder-summary.c (camel_folder_summary_array): Get the > summary array atomically, so it can't contain empty records. > (camel_folder_summary_array_free): And free it. > > * tests/lib/camel-test.c (die): If we are verbose & in threads, > then goto sleep so we can debug. > > * tests/folder/test8.c (worker): Add a missing pull() for > comnparing content. > > * camel-filter-search.c: Fix the symbol table, so match-all is an > immediate function, as it should be. > > * tests/folder/test9.c (main): New test, tests some filtering > things. > > * tests/message/test3.c (main): Dont use a boundary string with > spaces in it. Folding can corrupt it. Maybe the folding isn't > working entirely right, but anyway. > > * camel-session.c: Debug out the debug. > > * camel-filter-driver.c (camel_filter_driver_filter_folder): Plug > a messageinfo leak. > 1a36,94 > > * camel-filter-search.c (header_exists): Changed to support > multiple args (or'd together). > (header_contains): Cleaned up to match the search code. Why did > fejj change it? I'll never know. > (header_matches): > (header_starts_with): > (header_ends_with): Big cleanup of fejj's "i'm the cut & paste > king" code. Also properly handle or'ing of additional args to > match what the folder-search code should do. > (check_match): New function which does the annoying matching > stuff (for header matches). > (check_header): Similarly, handles or'ing of the matches together. > (header_contains): > (header_matches): > (header_starts_with): > (header_ends_with): Call check_header to do the actual work. > (header_soundex): And here too. > (match_all): Yeah like match-all isn't passed expression results, > its passed expression terms. Fix this so match-all works like it > should, by executing the contained expression. > (message_body_contains): Copied directly from > camel-folder-search.c, a more robust/faster/simpler body search > code. > (mime_part_matches): Removed entirely. > (handle_multipart): Removed entirely. > (build_match_regex): Copied from camel-folder-search. Builds a > set of simple strings into a regex pattern that matches any of > them (for faster & simpler matching). Expanded to accept regex > patterns itself, so it can merge them together. > (body_contains): Use build match/match message to match using a > built regex. > (body_regex): Likewise, this time we tell it we're building a > regex though. > (header_full_regex): Use build_match_regex to take the drudgery > out of it, and expand it to handle multiple regex's at once. > (get_full_header): slightly cleaner (well i dunno, the sprintf > stuff just got to me). > (header_regex): Cleaned up to use build_match_Regex too, and to > properly check types. > (filter_message_search): Just allocate 'fms' on the stack. > > * camel-filter-driver.c (camel_filter_driver_finalise): > (camel_filter_driver_init): > (camel_filter_driver_class_init): > (camel_filter_driver_get_type): Changed from gtk object to camel > object. > (camel_filter_driver_add_rule): New function to add a rule to be > processed in sexp form. > (camel_filter_driver_init): Init the rules list. > (camel_filter_driver_finalise): Clear the rules/rules list. > (camel_filter_driver_filter_message): Scan rules list directly > rather than creating on the fly. > > * Makefile.am (libcamelinclude_HEADERS): Added camel-filter-driver.h > (libcamel_la_SOURCES): Added camel-filter-driver.c, code taken > from filter-driver, which can drive, uh, filters based on sexp's. > (libcamelinclude_HEADERS): > (libcamel_la_SOURCES): Added camel-filter-search.[ch] svn path=/trunk/; revision=7560
177 lines
5.0 KiB
C
177 lines
5.0 KiB
C
/* folder/index testing */
|
|
|
|
#include "camel-test.h"
|
|
#include "messages.h"
|
|
#include "folders.h"
|
|
|
|
#include "camel/camel-exception.h"
|
|
#include "camel/camel-service.h"
|
|
#include "camel/camel-session.h"
|
|
#include "camel/camel-store.h"
|
|
|
|
#include "camel/camel-folder.h"
|
|
#include "camel/camel-folder-summary.h"
|
|
#include "camel/camel-mime-message.h"
|
|
#include "camel/camel-filter-driver.h"
|
|
#include "camel/camel-stream-fs.h"
|
|
|
|
#define ARRAY_LEN(x) (sizeof(x)/sizeof(x[0]))
|
|
|
|
|
|
/* god, who designed this horrid interface */
|
|
static char *auth_callback(CamelAuthCallbackMode mode,
|
|
char *data, gboolean secret,
|
|
CamelService *service, char *item,
|
|
CamelException *ex)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
struct {
|
|
char *name;
|
|
CamelFolder *folder;
|
|
} mailboxes[] = {
|
|
{ "INBOX", NULL },
|
|
{ "folder1", NULL },
|
|
{ "folder2", NULL },
|
|
{ "folder3", NULL },
|
|
{ "folder4", NULL },
|
|
};
|
|
|
|
struct {
|
|
char *name, *match, *action;
|
|
} rules[] = {
|
|
{ "empty1", "(match-all (header-contains \"Frobnitz\"))", "(copy-to \"folder1\")" },
|
|
{ "empty2", "(header-contains \"Frobnitz\")", "(copy-to \"folder2\")" },
|
|
{ "count11", "(and (header-contains \"subject\" \"Test1\") (header-contains \"subject\" \"subject\"))", "(move-to \"folder3\")" },
|
|
{ "empty3", "(and (header-contains \"subject\" \"Test1\") (header-contains \"subject\" \"subject\"))", "(move-to \"folder4\")" },
|
|
{ "count1", "(body-contains \"data50\")", "(copy-to \"folder1\")" },
|
|
{ "stop", "(body-contains \"data2\")", "(stop)" },
|
|
{ "notreached1", "(body-contains \"data2\")", "(move-to \"folder2\")" },
|
|
{ "count1", "(body-contains \"data3\")", "(move-to \"folder2\")" },
|
|
};
|
|
|
|
|
|
static CamelFolder *get_folder(CamelFilterDriver *d, const char *uri, void *data)
|
|
{
|
|
int i;
|
|
|
|
for (i=0;i<ARRAY_LEN(mailboxes);i++)
|
|
if (!strcmp(mailboxes[i].name, uri)) {
|
|
camel_object_ref((CamelObject *)mailboxes[i].folder);
|
|
return mailboxes[i].folder;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
CamelSession *session;
|
|
CamelStore *store;
|
|
CamelException *ex;
|
|
CamelFolder *folder;
|
|
CamelMimeMessage *msg;
|
|
int i, j;
|
|
CamelStream *mbox;
|
|
CamelFilterDriver *driver;
|
|
|
|
gtk_init(&argc, &argv);
|
|
|
|
camel_test_init(argc, argv);
|
|
|
|
ex = camel_exception_new();
|
|
|
|
/* clear out any camel-test data */
|
|
system("/bin/rm -rf /tmp/camel-test");
|
|
|
|
camel_test_start("Simple filtering of mbox");
|
|
|
|
session = camel_session_new("/tmp/camel-test", auth_callback, NULL, NULL);
|
|
|
|
/* todo: cross-check everything with folder_info checks as well */
|
|
/* todo: work out how to do imap/pop/nntp tests */
|
|
|
|
push("getting store");
|
|
store = camel_session_get_store(session, "mbox:///tmp/camel-test/mbox", ex);
|
|
check_msg(!camel_exception_is_set(ex), "getting store: %s", camel_exception_get_description(ex));
|
|
check(store != NULL);
|
|
pull();
|
|
|
|
push("Creating output folders");
|
|
for (i=0;i<ARRAY_LEN(mailboxes);i++) {
|
|
push("creating %s", mailboxes[i].name);
|
|
mailboxes[i].folder = folder = camel_store_get_folder(store, mailboxes[i].name, CAMEL_STORE_FOLDER_CREATE, ex);
|
|
check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
|
|
check(folder != NULL);
|
|
|
|
/* we need an empty folder for this to work */
|
|
test_folder_counts(folder, 0, 0);
|
|
pull();
|
|
}
|
|
pull();
|
|
|
|
/* append a bunch of messages with specific content */
|
|
push("creating 100 test message mbox");
|
|
mbox = camel_stream_fs_new_with_name("/tmp/camel-test/inbox", O_WRONLY|O_CREAT|O_EXCL, 0600);
|
|
for (j=0;j<100;j++) {
|
|
char *content, *subject;
|
|
|
|
push("creating test message");
|
|
msg = test_message_create_simple();
|
|
content = g_strdup_printf("data%d content\n", j);
|
|
test_message_set_content_simple((CamelMimePart *)msg, 0, "text/plain",
|
|
content, strlen(content));
|
|
test_free(content);
|
|
subject = g_strdup_printf("Test%d message%d subject", j, 100-j);
|
|
camel_mime_message_set_subject(msg, subject);
|
|
|
|
camel_mime_message_set_date(msg, j*60*24, 0);
|
|
pull();
|
|
|
|
camel_stream_printf(mbox, "From \n");
|
|
check(camel_data_wrapper_write_to_stream((CamelDataWrapper *)msg, mbox) != -1);
|
|
#if 0
|
|
push("appending simple message %d", j);
|
|
camel_folder_append_message(folder, msg, NULL, ex);
|
|
check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
|
|
pull();
|
|
#endif
|
|
test_free(subject);
|
|
|
|
check_unref(msg, 1);
|
|
}
|
|
check(camel_stream_close(mbox) != -1);
|
|
check_unref(mbox, 1);
|
|
pull();
|
|
|
|
push("Building filters");
|
|
driver = camel_filter_driver_new(get_folder, NULL);
|
|
for (i=0;i<ARRAY_LEN(rules);i++) {
|
|
camel_filter_driver_add_rule(driver, rules[i].name, rules[i].match, rules[i].action);
|
|
}
|
|
pull();
|
|
|
|
push("Executing filters");
|
|
camel_filter_driver_set_default_folder(driver, mailboxes[0].folder);
|
|
camel_filter_driver_filter_mbox(driver, "/tmp/camel-test/inbox", "", ex);
|
|
check_msg(!camel_exception_is_set(ex), "%s", camel_exception_get_description(ex));
|
|
|
|
/* now need to check the folder counts/etc */
|
|
|
|
check_unref(driver, 1);
|
|
pull();
|
|
|
|
for (i=0;i<ARRAY_LEN(mailboxes);i++) {
|
|
check_unref(mailboxes[i].folder, 1);
|
|
}
|
|
|
|
check_unref(store, 1);
|
|
|
|
check_unref(session, 1);
|
|
camel_exception_free(ex);
|
|
|
|
camel_test_end();
|
|
|
|
return 0;
|
|
}
|