diff options
-rw-r--r-- | filter/ChangeLog | 13 | ||||
-rw-r--r-- | filter/Makefile.am | 6 | ||||
-rw-r--r-- | filter/filter-driver.c | 76 | ||||
-rw-r--r-- | filter/filter-driver.h | 8 | ||||
-rw-r--r-- | filter/vfoldertypes.xml | 60 |
5 files changed, 133 insertions, 30 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog index 9387f72a4e..cb9562d284 100644 --- a/filter/ChangeLog +++ b/filter/ChangeLog @@ -1,3 +1,16 @@ +2000-05-27 Not Zed <NotZed@HelixCode.com> + + * vfoldertypes.xml: New file - lists rules appropriate for + vfolders (no actions, etc). + + * Makefile.am (EXTRA_DIST): Add vfoldertypes.xml + + * filter-driver.c (filter_driver_expand_option): Made public from + expand_filter_option. + (filter_driver_rule_count): find out how many user rules are + defined. + (filter_driver_rule_get): Get a user rule by index. + 2000-05-21 Ettore Perazzoli <ettore@helixcode.com> * filter-druid.c: Don't pass an empty URL to `gtk_html_begin()' diff --git a/filter/Makefile.am b/filter/Makefile.am index 05d56a2ca5..b6369253ac 100644 --- a/filter/Makefile.am +++ b/filter/Makefile.am @@ -28,8 +28,10 @@ libfilter_la_SOURCES = \ filter-driver.c \ filter-driver.h -EXTRA_DIST = blank.xpm check.xpm filtertypes.xml +EXTRA_DIST = blank.xpm check.xpm \ + filtertypes.xml vfoldertypes.xml # basic rules. filterdir = $(prefix)/share/evolution -filter_DATA = filtertypes.xml +filter_DATA = filtertypes.xml vfoldertypes.xml + diff --git a/filter/filter-driver.c b/filter/filter-driver.c index 17ced7412d..e43f543611 100644 --- a/filter/filter-driver.c +++ b/filter/filter-driver.c @@ -301,46 +301,52 @@ expand_variables(GString *out, char *source, GList *args, GHashTable *globals) /* build an expression for the filter */ -static void -expand_filter_option(FilterDriver *d, GString *s, GString *action, struct filter_option *op) +void +filter_driver_expand_option(FilterDriver *d, GString *s, GString *action, struct filter_option *op) { GList *optionl; FilterArg *arg; struct _FilterDriverPrivate *p = _PRIVATE(d); - g_string_append(s, "(and "); - optionl = op->options; - while (optionl) { - struct filter_optionrule *or = optionl->data; - if (or->rule->type == FILTER_XML_MATCH - || or->rule->type == FILTER_XML_EXCEPT) { - if (or->args) { - arg = or->args->data; - if (arg) { - printf("arg = %s\n", arg->name); + if (s) { + g_string_append(s, "(and "); + optionl = op->options; + while (optionl) { + struct filter_optionrule *or = optionl->data; + if (or->rule->type == FILTER_XML_MATCH + || or->rule->type == FILTER_XML_EXCEPT) { + if (or->args) { + arg = or->args->data; + if (arg) { + printf("arg = %s\n", arg->name); + } } + expand_variables(s, or->rule->code, or->args, p->globals); } - expand_variables(s, or->rule->code, or->args, p->globals); + optionl = g_list_next(optionl); } - optionl = g_list_next(optionl); - } - g_string_append(s, ")"); + g_string_append(s, ")"); + } - g_string_append(action, "(begin "); - optionl = op->options; - while (optionl) { - struct filter_optionrule *or = optionl->data; - if (or->rule->type == FILTER_XML_ACTION) { - expand_variables(action, or->rule->code, or->args, p->globals); - g_string_append(action, " "); + if (action) { + g_string_append(action, "(begin "); + optionl = op->options; + while (optionl) { + struct filter_optionrule *or = optionl->data; + if (or->rule->type == FILTER_XML_ACTION) { + expand_variables(action, or->rule->code, or->args, p->globals); + g_string_append(action, " "); + } + optionl = g_list_next(optionl); } - optionl = g_list_next(optionl); + g_string_append(action, ")"); } - g_string_append(action, ")"); - printf("combined rule '%s'\n", s->str); - printf("combined action '%s'\n", action->str); + if (s) + printf("combined rule '%s'\n", s->str); + if (action) + printf("combined action '%s'\n", action->str); } static ESExpResult * @@ -523,6 +529,20 @@ close_folders(FilterDriver *d) } int +filter_driver_rule_count(FilterDriver *d) +{ + struct _FilterDriverPrivate *p = _PRIVATE(d); + return g_list_length(p->options); +} + +struct filter_option * +filter_driver_rule_get(FilterDriver *d, int n) +{ + struct _FilterDriverPrivate *p = _PRIVATE(d); + return g_list_nth_data(p->options, n); +} + +int filter_driver_run(FilterDriver *d, CamelFolder *source, CamelFolder *inbox) { struct _FilterDriverPrivate *p = _PRIVATE(d); @@ -549,7 +569,7 @@ filter_driver_run(FilterDriver *d, CamelFolder *source, CamelFolder *inbox) s = g_string_new(""); a = g_string_new(""); - expand_filter_option(d, s, a, fo); + filter_driver_expand_option(d, s, a, fo); printf("searching expression %s\n", s->str); p->matches = camel_folder_search_by_expression (p->source, s->str, p->ex); diff --git a/filter/filter-driver.h b/filter/filter-driver.h index dc670bc85e..ad9afca53f 100644 --- a/filter/filter-driver.h +++ b/filter/filter-driver.h @@ -25,6 +25,7 @@ #include <gtk/gtk.h> #include <camel/camel-session.h> #include <camel/camel-folder.h> +#include "filter-xml.h" #define FILTER_DRIVER(obj) GTK_CHECK_CAST (obj, filter_driver_get_type (), FilterDriver) #define FILTER_DRIVER_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_driver_get_type (), FilterDriverClass) @@ -55,4 +56,11 @@ void filter_driver_set_global(FilterDriver *, const char *name, const char *valu /* apply rules to a folder, unmatched messages goto inbox, if not NULL */ int filter_driver_run(FilterDriver *d, CamelFolder *source, CamelFolder *inbox); +/* generate the search query/action string for a filter option */ +void filter_driver_expand_option(FilterDriver *d, GString *s, GString *action, struct filter_option *op); + +/* get info about rules (options) */ +int filter_driver_rule_count(FilterDriver *d); +struct filter_option *filter_driver_rule_get(FilterDriver *d, int n); + #endif /* ! _FILTER_DRIVER_H */ diff --git a/filter/vfoldertypes.xml b/filter/vfoldertypes.xml new file mode 100644 index 0000000000..bb12220d31 --- /dev/null +++ b/filter/vfoldertypes.xml @@ -0,0 +1,60 @@ +<?xml version="1.0"?> +<filterdescription> +<ruleset type="match"> +<rule name="from-address"> + <code> + (match-all (header-contains "From" ${sender})) + </code> + <description lang="en">The From address matches <source type="address" name="sender">sender(s)</source>.</description> +</rule> + +<rule name="to-address"> + <code> + (match-all (header-contains "To" ${receipient})) + </code> + <description lang="en">The To address matches <source type="address" name="receipient">receipients</source>.</description> +</rule> + +<rule name="subject-contains"> + <code> + (match-all (header-contains "Subject" ${words})) + </code> + <description lang="en">The Subject contains <source type="folder" name="words">words</source>.</description> +</rule> + +<rule name="cc-address"> + <code> + (match-all (header-contains "CC" ${self-email})) + </code> + <description lang="en">I am in the cc list.</description> +</rule> + +</ruleset> + +<ruleset type="except"> +<rule name="except-me"> + <code> + (match-all (not (header-contains "To" ${self-email}))) + </code> + <description language="en">I am the receipient.</description> +</rule> +</ruleset> + +<optionset> + <option type="match"> + <description language="en">For matching messages.</description> + </option> + <option type="match"> + <description language="en">Messages from a certain person.</description> + <optionrule type="match" rule="from-address"/> + </option> + <option type="match"> + <description language="en">Messages to a certain address.</description> + <optionrule type="match" rule="to-address"/> + </option> + <option type="match"> + <description language="en">Messages with a given subject.</description> + <optionrule type="match" rule="subject-contains"/> + </option> +</optionset> +</filterdescription> |