aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filter/ChangeLog24
-rw-r--r--filter/Makefile.am2
-rw-r--r--filter/filter-driver.c47
-rw-r--r--filter/filter-element.c3
-rw-r--r--filter/filter-message-search.c17
-rw-r--r--filter/filter-system-flag.c255
-rw-r--r--filter/filter-system-flag.h56
-rw-r--r--filter/filtertypes.xml57
-rw-r--r--filter/libfilter-i18n.h9
-rw-r--r--filter/vfoldertypes.xml20
10 files changed, 415 insertions, 75 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog
index 3429264415..fc9cf27885 100644
--- a/filter/ChangeLog
+++ b/filter/ChangeLog
@@ -1,3 +1,27 @@
+2000-12-01 Jeffrey Stedfast <fejj@helixcode.com>
+
+ * filter-element.c (filter_element_new_type_name): Added support
+ for the system-flag type.
+
+ * Makefile.am: Added filter-system-flag.[c,h].
+
+ * filter-system-flag.[c,h]: New type for system flags.
+
+ * filtertypes.xml: Oops, looks like we were still using integers
+ as arguments to set-flag. Change over to using strings which are
+ safer and also change the name to set-system-flag.
+
+ * filter-driver.c (do_flag): Use strings instead of integers.
+ Instead of set-flag, the callback is now set-system-flag for less
+ confusion. Sorry Ettore, but you'll have to change your filters.
+
+ * filtertypes.xml: Added system-flags stuff.
+
+ * vfoldertypes.xml: And here too.
+
+ * filter-message-search.c (system_flag): New ESExp callback for
+ filtering on system flags.
+
2000-11-30 Jeffrey Stedfast <fejj@helixcode.com>
* filter-driver.c (filter_driver_filter_message): Use
diff --git a/filter/Makefile.am b/filter/Makefile.am
index f062eab3ac..53827fd793 100644
--- a/filter/Makefile.am
+++ b/filter/Makefile.am
@@ -55,6 +55,8 @@ libfilter_la_SOURCES = \
filter-rule.h \
filter-score.c \
filter-score.h \
+ filter-system-flag.c \
+ filter-system-flag.h \
filter-url.c \
filter-url.h \
rule-context.c \
diff --git a/filter/filter-driver.c b/filter/filter-driver.c
index bfb437bb38..e583041825 100644
--- a/filter/filter-driver.c
+++ b/filter/filter-driver.c
@@ -111,14 +111,14 @@ static struct {
int type; /* set to 1 if a function can perform shortcut evaluation, or
doesn't execute everything, 0 otherwise */
} symbols[] = {
- { "delete", (ESExpFunc *) do_delete, 0 },
- { "forward-to", (ESExpFunc *) mark_forward, 0 },
- { "copy-to", (ESExpFunc *) do_copy, 0 },
- { "move-to", (ESExpFunc *) do_move, 0 },
- { "stop", (ESExpFunc *) do_stop, 0 },
- { "set-colour", (ESExpFunc *) do_colour, 0 },
- { "set-score", (ESExpFunc *) do_score, 0 },
- { "set-flag", (ESExpFunc *) do_flag, 0 }
+ { "delete", (ESExpFunc *) do_delete, 0 },
+ { "forward-to", (ESExpFunc *) mark_forward, 0 },
+ { "copy-to", (ESExpFunc *) do_copy, 0 },
+ { "move-to", (ESExpFunc *) do_move, 0 },
+ { "stop", (ESExpFunc *) do_stop, 0 },
+ { "set-colour", (ESExpFunc *) do_colour, 0 },
+ { "set-score", (ESExpFunc *) do_score, 0 },
+ { "set-system-flag", (ESExpFunc *) do_flag, 0 }
};
static GtkObjectClass *filter_driver_parent;
@@ -450,34 +450,9 @@ do_flag (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *d
struct _FilterDriverPrivate *p = _PRIVATE (driver);
d(fprintf (stderr, "setting flag\n"));
- if (argc > 0 && argv[0]->type == ESEXP_RES_INT) {
- char *flag;
-
- switch (argv[0]->value.number) {
- case CAMEL_MESSAGE_ANSWERED:
- p->info->flags |= CAMEL_MESSAGE_ANSWERED;
- flag = "Answered";
- break;
- case CAMEL_MESSAGE_DELETED:
- p->info->flags |= CAMEL_MESSAGE_DELETED;
- flag = "Deleted";
- break;
- case CAMEL_MESSAGE_DRAFT:
- p->info->flags |= CAMEL_MESSAGE_DRAFT;
- flag = "Draft";
- break;
- case CAMEL_MESSAGE_FLAGGED:
- p->info->flags |= CAMEL_MESSAGE_FLAGGED;
- flag = "Flagged";
- break;
- case CAMEL_MESSAGE_SEEN:
- p->info->flags |= CAMEL_MESSAGE_SEEN;
- flag = "Seen";
- break;
- default:
- flag = "Unknown";
- }
- filter_driver_log (driver, FILTER_LOG_ACTION, "Set %s flag", flag);
+ if (argc == 1 && argv[0]->type == ESEXP_RES_STRING) {
+ p->info->flags |= camel_system_flag (argv[0]->value.string);
+ filter_driver_log (driver, FILTER_LOG_ACTION, "Set %s flag", argv[0]->value.string);
}
return NULL;
diff --git a/filter/filter-element.c b/filter/filter-element.c
index 5824eb09f9..0c4e72249c 100644
--- a/filter/filter-element.c
+++ b/filter/filter-element.c
@@ -28,6 +28,7 @@
#include "filter-colour.h"
#include "filter-datespec.h"
#include "filter-score.h"
+#include "filter-system-flag.h"
#include "filter-folder.h"
#include "filter-url.h"
@@ -264,6 +265,8 @@ filter_element_new_type_name (const char *type)
return (FilterElement *)filter_url_new ();
} else if (!strcmp (type, "regex")) {
return (FilterElement *)filter_input_new_type_name (type);
+ } else if (!strcmp (type, "system-flag")) {
+ return (FilterElement *)filter_system_flag_new ();
} else {
g_warning("Unknown filter type '%s'", type);
return 0;
diff --git a/filter/filter-message-search.c b/filter/filter-message-search.c
index d374422dfd..b949fbd372 100644
--- a/filter/filter-message-search.c
+++ b/filter/filter-message-search.c
@@ -47,6 +47,7 @@ static ESExpResult *body_contains (struct _ESExp *f, int argc, struct _ESExpResu
static ESExpResult *body_regex (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
static ESExpResult *user_flag (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
static ESExpResult *user_tag (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
+static ESExpResult *system_flag (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
static ESExpResult *get_sent_date (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
static ESExpResult *get_received_date (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
static ESExpResult *get_current_date (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
@@ -73,6 +74,7 @@ static struct {
{ "header-full-regex", (ESExpFunc *) header_full_regex, 0 },
{ "user-tag", (ESExpFunc *) user_tag, 0 },
{ "user-flag", (ESExpFunc *) user_flag, 0 },
+ { "system-flag", (ESExpFunc *) system_flag, 0 },
{ "get-sent-date", (ESExpFunc *) get_sent_date, 0 },
{ "get-received-date", (ESExpFunc *) get_received_date, 0 },
{ "get-current-date", (ESExpFunc *) get_current_date, 0 },
@@ -664,6 +666,21 @@ user_flag (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessage
}
static ESExpResult *
+system_flag (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms)
+{
+ ESExpResult *r;
+ gboolean truth = FALSE;
+
+ if (argc == 1)
+ truth = camel_system_flag_get (fms->info->flags, argv[0]->value.string);
+
+ r = e_sexp_result_new (ESEXP_RES_BOOL);
+ r->value.bool = truth;
+
+ return r;
+}
+
+static ESExpResult *
user_tag (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms)
{
ESExpResult *r;
diff --git a/filter/filter-system-flag.c b/filter/filter-system-flag.c
new file mode 100644
index 0000000000..abf3739f37
--- /dev/null
+++ b/filter/filter-system-flag.c
@@ -0,0 +1,255 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors: Jeffrey Stedfast <fejj@helixcode.com>
+ *
+ * Copyright 2000 Helix Code, Inc. (www.helixcode.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#include <gtk/gtk.h>
+#include <gnome.h>
+#include <gnome-xml/xmlmemory.h>
+
+#include <gal/widgets/e-unicode.h>
+
+#include "filter-system-flag.h"
+#include "e-util/e-sexp.h"
+
+#define d(x)
+
+static void xml_create (FilterElement *fe, xmlNodePtr node);
+static xmlNodePtr xml_encode (FilterElement *fe);
+static int xml_decode (FilterElement *fe, xmlNodePtr node);
+static GtkWidget *get_widget (FilterElement *fe);
+static void build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
+static void format_sexp (FilterElement *, GString *);
+
+static void filter_system_flag_class_init (FilterSystemFlagClass *class);
+static void filter_system_flag_init (FilterSystemFlag *gspaper);
+static void filter_system_flag_finalise (GtkObject *obj);
+
+#define _PRIVATE(x) (((FilterSystemFlag *)(x))->priv)
+
+struct _FilterSystemFlagPrivate {
+};
+
+static FilterElementClass *parent_class;
+
+enum {
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+struct _system_flag {
+ char *title;
+ char *value;
+} system_flags[] = {
+ { _("Replied to"), "Answered" },
+ { _("Deleted"), "Deleted" },
+ { _("Draft"), "Draft" },
+ { _("Important"), "Flagged" },
+ { _("Read"), "Seen" },
+ { NULL, NULL }
+};
+
+static struct _system_flag *
+find_option (const char *name)
+{
+ struct _system_flag *flag;
+
+ for (flag = system_flags; flag->title; flag++) {
+ if (!g_strcasecmp (name, flag->value))
+ return flag;
+ }
+
+ return NULL;
+}
+
+GtkType
+filter_system_flag_get_type (void)
+{
+ static guint type = 0;
+
+ if (!type) {
+ GtkTypeInfo type_info = {
+ "FilterSystemFlag",
+ sizeof (FilterSystemFlag),
+ sizeof (FilterSystemFlagClass),
+ (GtkClassInitFunc) filter_system_flag_class_init,
+ (GtkObjectInitFunc) filter_system_flag_init,
+ (GtkArgSetFunc) NULL,
+ (GtkArgGetFunc) NULL
+ };
+
+ type = gtk_type_unique (filter_element_get_type (), &type_info);
+ }
+
+ return type;
+}
+
+static void
+filter_system_flag_class_init (FilterSystemFlagClass *class)
+{
+ GtkObjectClass *object_class;
+ FilterElementClass *filter_element = (FilterElementClass *)class;
+
+ object_class = (GtkObjectClass *)class;
+ parent_class = gtk_type_class(filter_element_get_type ());
+
+ object_class->finalize = filter_system_flag_finalise;
+
+ /* override methods */
+ filter_element->xml_create = xml_create;
+ filter_element->xml_encode = xml_encode;
+ filter_element->xml_decode = xml_decode;
+ filter_element->get_widget = get_widget;
+ filter_element->build_code = build_code;
+ filter_element->format_sexp = format_sexp;
+
+ /* signals */
+
+ gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
+}
+
+static void
+filter_system_flag_init (FilterSystemFlag *o)
+{
+ o->priv = g_malloc0 (sizeof (*o->priv));
+}
+
+static void
+filter_system_flag_finalise (GtkObject *obj)
+{
+ FilterSystemFlag *o = (FilterSystemFlag *)obj;
+
+ o = o;
+
+ ((GtkObjectClass *)(parent_class))->finalize (obj);
+}
+
+/**
+ * filter_system_flag_new:
+ *
+ * Create a new FilterSystemFlag object.
+ *
+ * Return value: A new #FilterSystemFlag object.
+ **/
+FilterSystemFlag *
+filter_system_flag_new (void)
+{
+ FilterSystemFlag *o = (FilterSystemFlag *)gtk_type_new (filter_system_flag_get_type ());
+ return o;
+}
+
+static void
+xml_create (FilterElement *fe, xmlNodePtr node)
+{
+ /* parent implementation */
+ ((FilterElementClass *)(parent_class))->xml_create (fe, node);
+}
+
+static xmlNodePtr
+xml_encode (FilterElement *fe)
+{
+ FilterSystemFlag *fsf = (FilterSystemFlag *) fe;
+ xmlNodePtr value;
+
+ d(printf ("Encoding %s as xml\n", type));
+ value = xmlNewNode (NULL, "value");
+ xmlSetProp (value, "name", fe->name);
+ xmlSetProp (value, "type", "system-flag");
+ xmlSetProp (value, "value", fsf->value);
+
+ return value;
+}
+
+static int
+xml_decode (FilterElement *fe, xmlNodePtr node)
+{
+ FilterSystemFlag *fsf = (FilterSystemFlag *) fe;
+ struct _system_flag *flag;
+ char *value;
+
+ fe->name = xmlGetProp (node, "name");
+
+ value = xmlGetProp (node, "value");
+ if (value) {
+ flag = find_option (value);
+ fsf->value = flag ? flag->value : NULL;
+ xmlFree (value);
+ } else {
+ fsf->value = NULL;
+ }
+
+ return 0;
+}
+
+static void
+item_selected (GtkWidget *widget, FilterElement *fe)
+{
+ FilterSystemFlag *fsf = (FilterSystemFlag *) fe;
+ struct _system_flag *flag;
+
+ flag = gtk_object_get_data (GTK_OBJECT (widget), "flag");
+
+ fsf->value = flag->value;
+}
+
+static GtkWidget *
+get_widget (FilterElement *fe)
+{
+ FilterSystemFlag *fsf = (FilterSystemFlag *) fe;
+ GtkWidget *omenu, *menu, *item;
+ struct _system_flag *flag;
+ int index = 0, current = 0;
+
+ fsf->value = system_flags[0].value;
+
+ menu = gtk_menu_new ();
+ for (flag = system_flags; flag->title; flag++) {
+ item = gtk_menu_item_new_with_label (flag->title);
+ gtk_object_set_data (GTK_OBJECT (item), "flag", flag);
+ gtk_signal_connect (GTK_OBJECT (item), "select", item_selected, fe);
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_widget_show (item);
+ if (!g_strcasecmp (fsf->value, flag->value))
+ current = index;
+ index++;
+ }
+
+ omenu = gtk_option_menu_new ();
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
+ gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), current);
+
+ return omenu;
+}
+
+static void
+build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
+{
+ return;
+}
+
+static void
+format_sexp (FilterElement *fe, GString *out)
+{
+ FilterSystemFlag *fsf = (FilterSystemFlag *)fe;
+
+ e_sexp_encode_string (out, fsf->value);
+}
diff --git a/filter/filter-system-flag.h b/filter/filter-system-flag.h
new file mode 100644
index 0000000000..eaf8e9172e
--- /dev/null
+++ b/filter/filter-system-flag.h
@@ -0,0 +1,56 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors: Jeffrey Stedfast <fejj@helixcode.com>
+ *
+ * Copyright 2000 Helix Code, Inc. (www.helixcode.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#ifndef _FILTER_SYSTEM_FLAG_H
+#define _FILTER_SYSTEM_FLAG_H
+
+#include <gtk/gtk.h>
+#include "filter-element.h"
+
+#define FILTER_SYSTEM_FLAG(obj) GTK_CHECK_CAST (obj, filter_system_flag_get_type (), Filtersystemflag)
+#define FILTER_SYSTEM_FLAG_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_system_flag_get_type (), FiltersystemflagClass)
+#define IS_FILTER_SYSTEM_FLAG(obj) GTK_CHECK_TYPE (obj, filter_system_flag_get_type ())
+
+typedef struct _FilterSystemFlag FilterSystemFlag;
+typedef struct _FilterSystemFlagClass FilterSystemFlagClass;
+
+struct _FilterSystemFlag {
+ FilterElement parent;
+ struct _FilterSystemFlagPrivate *priv;
+
+ char *value;
+};
+
+struct _FilterSystemFlagClass {
+ FilterElementClass parent_class;
+
+ /* virtual methods */
+
+ /* signals */
+};
+
+GtkType filter_system_flag_get_type (void);
+FilterSystemFlag *filter_system_flag_new (void);
+
+#endif /* ! _FILTER_SYSTEM_FLAG_H */
+
diff --git a/filter/filtertypes.xml b/filter/filtertypes.xml
index 3014d453df..0eb9ca242d 100644
--- a/filter/filtertypes.xml
+++ b/filter/filtertypes.xml
@@ -414,6 +414,25 @@
<input type="score" name="versus"/>
</part>
+ <part name="status">
+ <title>Status</title>
+ <input type="optionlist" name="match-type">
+ <option value="is">
+ <title>is</title>
+ <code>
+ (match-all (system-flag ${flag}))
+ </code>
+ </option>
+ <option value="is-not">
+ <title>is not</title>
+ <code>
+ (match-all (not (system-flag ${flag})))
+ </code>
+ </option>
+ </input>
+ <input type="system-flag" name="flag"/>
+ </part>
+
<part name="regex">
<title>Regex Match</title>
<input type="optionlist" name="match-type">
@@ -490,40 +509,10 @@
<code>(set-score ${score})</code>
<input type="score" name="score"/>
</part>
- <part name="flag">
- <title>Set Flag</title>
- <input type="optionlist" name="flag-type">
- <option value="answered">
- <title>Answered</title>
- <code>
- (set-flag 1)
- </code>
- </option>
- <option value="deleted">
- <title>Deleted</title>
- <code>
- (set-flag 2)
- </code>
- </option>
- <option value="draft">
- <title>Draft</title>
- <code>
- (set-flag 4)
- </code>
- </option>
- <option value="flagged">
- <title>Flagged</title>
- <code>
- (set-flag 8)
- </code>
- </option>
- <option value="seen">
- <title>Seen</title>
- <code>
- (set-flag 16)
- </code>
- </option>
- </input>
+ <part name="set-status">
+ <title>Set Status</title>
+ <code>(set-system-flag ${flag})</code>
+ <input type="system-flag" name="flag"/>
</part>
</actionset>
</filterdescription>
diff --git a/filter/libfilter-i18n.h b/filter/libfilter-i18n.h
index a74bcadd31..b7b7fda3f4 100644
--- a/filter/libfilter-i18n.h
+++ b/filter/libfilter-i18n.h
@@ -1,13 +1,10 @@
/* Automatically generated. Do not edit. */
-char *s = N_("Answered");
char *s = N_("Assign Colour");
char *s = N_("Assign Score");
char *s = N_("Copy to Folder");
char *s = N_("Date received");
char *s = N_("Date sent");
char *s = N_("Delete");
-char *s = N_("Deleted");
-char *s = N_("Draft");
char *s = N_("Expression");
char *s = N_("Flagged");
char *s = N_("Forward to Address");
@@ -17,13 +14,15 @@ char *s = N_("Message was received");
char *s = N_("Message was sent");
char *s = N_("Move to Folder");
char *s = N_("Priority");
+char *s = N_("Read");
char *s = N_("Recipients");
char *s = N_("Regex Match");
-char *s = N_("Seen");
+char *s = N_("Replied to");
char *s = N_("Sender");
-char *s = N_("Set Flag");
+char *s = N_("Set Status");
char *s = N_("Source");
char *s = N_("Specific header");
+char *s = N_("Status");
char *s = N_("Stop Processing");
char *s = N_("Subject");
char *s = N_("after");
diff --git a/filter/vfoldertypes.xml b/filter/vfoldertypes.xml
index 52c2c0e8ca..84d06964c4 100644
--- a/filter/vfoldertypes.xml
+++ b/filter/vfoldertypes.xml
@@ -140,5 +140,25 @@
<input type="datespec" name="versus">
</input>
</part>
+
+ <part name="status">
+ <title>Status</title>
+ <input type="optionlist" name="match-type">
+ <option value="is">
+ <title>is</title>
+ <code>
+ (match-all (system-flag ${flag}))
+ </code>
+ </option>
+ <option value="is-not">
+ <title>is not</title>
+ <code>
+ (match-all (not (system-flag ${flag})))
+ </code>
+ </option>
+ </input>
+ <input type="system-flag" name="flag"/>
+ </part>
+
</partset>
</filterdescription>