aboutsummaryrefslogtreecommitdiffstats
path: root/filter/filter-driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'filter/filter-driver.c')
-rw-r--r--filter/filter-driver.c472
1 files changed, 0 insertions, 472 deletions
diff --git a/filter/filter-driver.c b/filter/filter-driver.c
deleted file mode 100644
index c2759fe9d8..0000000000
--- a/filter/filter-driver.c
+++ /dev/null
@@ -1,472 +0,0 @@
-
-#include <glib.h>
-#include <gtk/gtk.h>
-#include <gnome.h>
-#include <gtkhtml/gtkhtml.h>
-
-#include <gnome-xml/tree.h>
-#include <gnome-xml/parser.h>
-
-#include "filter-arg-types.h"
-#include "filter-xml.h"
-#include "filter-sexp.h"
-#include "filter-format.h"
-
-extern int filter_find_arg(FilterArg *a, char *name);
-
-#include "check.xpm"
-#include "blank.xpm"
-
-/*
- splices ${cc} lines into a single string
-*/
-int
-expand_variables(GString *out, char *source, GList *args, GHashTable *globals)
-{
- GList *argl;
- FilterArg *arg;
- char *name= alloca(32);
- char *start, *end, *newstart, *tmp, *val;
- int namelen=32;
- int len=0;
- int ok = 0;
-
- start = source;
- while ( (newstart = strstr(start, "${"))
- && (end = strstr(newstart+2, "}")) ) {
- len = end-newstart-2;
- if (len+1>namelen) {
- namelen = (len+1)*2;
- name = alloca(namelen);
- }
- memcpy(name, newstart+2, len);
- name[len] = 0;
- argl = g_list_find_custom(args, name, (GCompareFunc) filter_find_arg);
- if (argl) {
- int i, count;
-
- tmp = g_strdup_printf("%.*s", newstart-start, start);
- printf("appending: %s\n", tmp);
- g_string_append(out, tmp);
- g_free(tmp);
-
- arg = argl->data;
- count = filter_arg_get_count(arg);
- for (i=0;i<count;i++) {
- printf("appending '%s'\n", filter_arg_get_value_as_string(arg, i));
- g_string_append(out, " \"");
- g_string_append(out, filter_arg_get_value_as_string(arg, i));
- g_string_append(out, "\"");
- }
- } else if ( (val = g_hash_table_lookup(globals, name)) ) {
- tmp = g_strdup_printf("%.*s", newstart-start, start);
- printf("appending: %s\n", tmp);
- g_string_append(out, tmp);
- g_free(tmp);
- g_string_append(out, " \"");
- g_string_append(out, val);
- g_string_append(out, "\"");
- } else {
- ok = 1;
- tmp = g_strdup_printf("%.*s", end-start+1, start);
- printf("appending: %s\n", tmp);
- g_string_append(out, tmp);
- g_free(tmp);
- }
- start = end+1;
- }
- g_string_append(out, start);
-
- return ok;
-}
-
-/*
- build an expression for the filter
-*/
-static void
-expand_filter_option(GString *s, struct filter_option *op)
-{
- GList *optionl;
- FilterArg *arg;
- GHashTable *globals;
-
- globals = g_hash_table_new(g_str_hash, g_str_equal);
-
- g_hash_table_insert(globals, "self-email", "mzucchi@dehaa.sa.gov.au");
-
- 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) {
- expand_variables(s, or->rule->code, or->args, globals);
- }
- optionl = g_list_next(optionl);
- }
-
- g_string_append(s, ")");
-#if 0
- optionl = op->options;
- while (optionl) {
- struct filter_optionrule *or = optionl->data;
- if (or->rule->type == FILTER_XML_ACTION) {
- g_string_append(s, or->rule->code);
- g_string_append(s, " ");
- }
- optionl = g_list_next(optionl);
- }
- g_string_append(s, ")))");
-#endif
- printf("combined rule '%s'\n", s->str);
-}
-
-struct filter_optionrule *
-find_optionrule(struct filter_option *option, char *name)
-{
- GList *optionrulel;
- struct filter_optionrule *or;
-
- optionrulel = option->options;
- while (optionrulel) {
- or = optionrulel->data;
- if (!strcmp(or->rule->name, name)) {
- return or;
- }
- optionrulel = g_list_next(optionrulel);
- }
- return NULL;
-}
-
-static char nooption[] = "<h1>Select option</h1><p>Select an option type from the list above.</p>";
-
-void
-html_write_options(GtkHTML *html, struct filter_option *option)
-{
- GtkHTMLStreamHandle *stream;
- GList *optionrulel;
-
- stream = gtk_html_begin(html, "");
- gtk_html_write(html, stream, "<body bgcolor=white alink=blue>", strlen("<body bgcolor=white alink=blue>"));
- if (option) {
- optionrulel = option->options;
- while (optionrulel) {
- struct filter_optionrule *or = optionrulel->data;
-
- filter_description_html_write(or->rule->description, or->args, html, stream);
- gtk_html_write(html, stream, "<br>", strlen("<br>"));
- optionrulel = g_list_next(optionrulel);
- }
- } else {
- gtk_html_write(html, stream, nooption, strlen(nooption));
- }
- gtk_html_end(html, stream, GTK_HTML_STREAM_OK);
-}
-
-void
-fill_rules(GtkWidget *list, GList *rules, struct filter_option *option, int type)
-{
- GList *optionl, *rulel;
- GtkWidget *listitem, *hbox, *checkbox, *label;
- GList *items = NULL;
-
- rulel = rules;
- while (rulel) {
- struct filter_rule *fr = rulel->data;
- char *labeltext;
-
- if (fr->type == type) {
- int state;
-
- state = find_optionrule(option, fr->name) != NULL;
-
- labeltext = filter_description_text(fr->description, NULL);
-
- hbox = gtk_hbox_new(FALSE, 3);
- checkbox = gnome_pixmap_new_from_xpm_d(state?check_xpm:blank_xpm);
- gtk_box_pack_start(GTK_BOX(hbox), checkbox, FALSE, FALSE, 0);
- label = gtk_label_new(labeltext);
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0);
- listitem = gtk_list_item_new();
- gtk_container_add(GTK_CONTAINER(listitem), hbox);
- gtk_widget_show_all(listitem);
-
- gtk_object_set_data(GTK_OBJECT(listitem), "checkbox", checkbox);
- gtk_object_set_data(GTK_OBJECT(listitem), "checkstate", (void *)state);
- gtk_object_set_data(GTK_OBJECT(listitem), "rule", fr);
-
- items = g_list_append(items, listitem);
- }
- rulel = g_list_next(rulel);
- }
- gtk_list_append_items(GTK_LIST(list), items);
-}
-
-void
-fill_options(GtkWidget *list, GList *options)
-{
- GList *optionl, *rulel, *optionrulel;
- GtkWidget *listitem, *hbox, *checkbox, *label;
- GList *items = NULL;
-
- optionl = options;
- while (optionl) {
- struct filter_option *op = optionl->data;
- char *labeltext;
-
- labeltext = filter_description_text(op->description, NULL);
- listitem = gtk_list_item_new_with_label(labeltext);
- g_free(labeltext);
- gtk_widget_show_all(listitem);
-
- gtk_object_set_data(GTK_OBJECT(listitem), "option", op);
-
- items = g_list_append(items, listitem);
- optionl = g_list_next(optionl);
- }
- gtk_list_append_items(GTK_LIST(list), items);
-}
-
-GtkWidget *list_global, *html_global;
-struct filter_option *option_current;
-
-static void
-select_rule_child(GtkList *list, GtkWidget *child, void *data)
-{
- GtkWidget *w;
- struct filter_rule *fr = gtk_object_get_data(GTK_OBJECT(child), "rule");
- int state;
- struct filter_optionrule *rule;
-
- w = gtk_object_get_data(GTK_OBJECT(child), "checkbox");
- state = !(int) gtk_object_get_data(GTK_OBJECT(child), "checkstate");
-
- gnome_pixmap_load_xpm_d(GNOME_PIXMAP(w), state?check_xpm:blank_xpm);
- gtk_object_set_data(GTK_OBJECT(child), "checkstate", (void *)state);
-
- if (state) {
- printf("adding rule %p\n", fr);
- rule = g_malloc0(sizeof(*rule));
- rule->rule = fr;
- option_current->options = g_list_prepend(option_current->options, rule);
- } else {
- /* FIXME: free optionrule */
- rule = find_optionrule(option_current, fr->name);
- if (rule)
- option_current->options = g_list_remove(option_current->options, rule);
- }
-
- {
- GString *s = g_string_new("");
- expand_filter_option(s, option_current);
- printf("Rules: %s\n", s->str);
- g_string_free(s, TRUE);
- }
-
- html_write_options(html_global, option_current);
-}
-
-static void
-select_option_child(GtkList *list, GtkWidget *child, void *data)
-{
- struct filter_option *op = gtk_object_get_data(GTK_OBJECT(child), "option");
- struct filter_option *new;
- GList *optionsl;
-
- if (option_current) {
- /* free option_current copy */
- optionsl = option_current->options;
- while (optionsl) {
- GList *op = optionsl;
- optionsl = g_list_next(optionsl);
- g_free(op->data);
- }
- g_list_free(option_current->options);
- g_free(option_current);
- option_current = NULL;
- }
-
- /* clone the option */
- new = g_malloc(sizeof(*new));
- new->type = op->type;
- new->description = op->description;
- new->options = NULL;
- optionsl = op->options;
- while (optionsl) {
- struct filter_optionrule *ornew = g_malloc(sizeof(*ornew)),
- *or = optionsl->data;
- ornew->rule = or->rule;
- /* FIXME: must copy args too *sigh* */
- ornew->args = or->args;
- new->options = g_list_append(new->options, ornew);
- optionsl = g_list_next(optionsl);
- }
- option_current = new;
-
- html_write_options(GTK_HTML(html_global), option_current);
-}
-
-static void
-arg_link_clicked(GtkHTML *html, const char *url, void *data)
-{
- printf("url clicked: %s\n", url);
- if (!strncmp(url, "arg:", 4)) {
- FilterArg *arg;
- void *dummy;
-
- if (sscanf(url+4, "%p %p", &dummy, &arg)==2
- && arg) {
- printf("arg = %p\n", arg);
- filter_arg_edit_values(arg);
- /* should have a changed signal which propagates the rewrite */
- html_write_options(GTK_HTML(html_global), option_current);
- }
- }
-}
-
-static void
-dialogue_clicked(GtkWidget *w, int button, void *data)
-{
- GString *s = g_string_new("");
-
- printf("button %d clicked ...\n");
-
- if (option_current)
- expand_filter_option(s, option_current);
-
- g_string_free(s, TRUE);
-}
-
-void create_dialogue(void)
-{
- GtkWidget *dialogue,
- *scrolled_window,
- *list,
- *html,
- *frame;
-
- dialogue = gnome_dialog_new("Filter Rules",
- GNOME_STOCK_BUTTON_PREV , GNOME_STOCK_BUTTON_NEXT,
- "Finish", GNOME_STOCK_BUTTON_CANCEL, 0);
-
- list = gtk_list_new();
- frame = gtk_frame_new("Filter Type");
- scrolled_window = gtk_scrolled_window_new(NULL, NULL);
-
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), list);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_container_set_focus_vadjustment
- (GTK_CONTAINER (list),
- gtk_scrolled_window_get_vadjustment
- (GTK_SCROLLED_WINDOW (scrolled_window)));
- gtk_container_add(GTK_CONTAINER(frame), scrolled_window);
- gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialogue)->vbox), frame, TRUE, TRUE, GNOME_PAD);
-
-#if 0
- gtk_signal_connect(GTK_OBJECT(list), "select_child", select_rule_child, NULL);
- gtk_signal_connect(GTK_OBJECT(list), "unselect_child", select_rule_child, NULL);
-#else
- gtk_signal_connect(GTK_OBJECT(list), "select_child", select_option_child, NULL);
- gtk_signal_connect(GTK_OBJECT(list), "unselect_child", select_option_child, NULL);
-#endif
-
- frame = gtk_frame_new("Filter Description");
- html = gtk_html_new();
- scrolled_window = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_container_add(GTK_CONTAINER(scrolled_window), html);
- gtk_container_add(GTK_CONTAINER(frame), scrolled_window);
- gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialogue)->vbox), frame, TRUE, TRUE, GNOME_PAD);
-
- gtk_signal_connect(GTK_OBJECT(html), "link_clicked", arg_link_clicked, NULL);
- gtk_signal_connect(GTK_OBJECT(dialogue), "clicked", dialogue_clicked, NULL);
-
- list_global = list;
- html_global = html;
-
- gtk_widget_show_all(dialogue);
-}
-
-int main(int argc, char **argv)
-{
- FilterSEXP *f;
- FilterSEXPResult *r;
- GList *rules, *options, *options2;
- xmlDocPtr doc, out, optionset, filteroptions;
- GString *s;
-
- gnome_init("Test", "0.0", argc, argv);
- gdk_rgb_init ();
- gtk_widget_set_default_colormap (gdk_rgb_get_cmap ());
- gtk_widget_set_default_visual (gdk_rgb_get_visual ());
-
- create_dialogue();
-
- doc = xmlParseFile("filterdescription.xml");
- rules = filter_load_ruleset(doc);
- options = filter_load_optionset(doc, rules);
- options2 = options;
- out = xmlParseFile("saveoptions.xml");
- options = filter_load_optionset(out, rules);
-
-#if 0
- option_current = options->data;
- fill_rules(list_global, rules, options->data, FILTER_XML_MATCH);
-#else
- option_current = NULL;
- fill_options(list_global, options2);
-#endif
- gtk_main();
-
- while (options) {
- struct filter_option *fo = options->data;
- GList *optionrulel;
-
- optionrulel = fo->options;
- while (optionrulel) {
- struct filter_optionrule *or = optionrulel->data;
-
- printf("formatting rule: %s\n", or->rule->name);
-
- /*filter_description_text(or->rule->description, or->args);*/
- filter_description_html_write(or->rule->description, or->args, NULL, NULL);
-
- optionrulel = g_list_next(optionrulel);
- }
- options = g_list_next(options);
- }
-
- return 0;
-
- s = g_string_new("");
- expand_filter_option(s, options->data);
- g_string_append(s, "");
-
- printf("total rule = '%s'\n", s->str);
-
- f = filter_sexp_new();
- filter_sexp_add_variable(f, 0, "sender", NULL);
- filter_sexp_add_variable(f, 0, "receipient", NULL);
- filter_sexp_add_variable(f, 0, "folder", NULL);
-
- /* simple functions */
- filter_sexp_add_function(f, 0, "header-get", NULL, NULL);
- filter_sexp_add_function(f, 0, "header-contains", NULL, NULL);
- filter_sexp_add_function(f, 0, "copy-to", NULL, NULL);
-
- filter_sexp_add_ifunction(f, 0, "set", NULL, NULL);
-
- /* control functions */
- filter_sexp_add_ifunction(f, 0, "match-all", NULL, NULL);
- filter_sexp_add_ifunction(f, 0, "match", NULL, NULL);
- filter_sexp_add_ifunction(f, 0, "action", NULL, NULL);
- filter_sexp_add_ifunction(f, 0, "except", NULL, NULL);
-
- filter_sexp_input_text(f, s->str, strlen(s->str));
- filter_sexp_parse(f);
-
-}