aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filter/ChangeLog18
-rw-r--r--filter/Makefile.am2
-rw-r--r--filter/filter-driver.c23
-rw-r--r--filter/filter-element.c31
-rw-r--r--filter/filter-message-search.c25
-rw-r--r--filter/filter-score.c225
-rw-r--r--filter/filter-score.h57
-rw-r--r--filter/filtertypes.xml37
8 files changed, 398 insertions, 20 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog
index c2af2c0619..5f0aafbe13 100644
--- a/filter/ChangeLog
+++ b/filter/ChangeLog
@@ -1,3 +1,21 @@
+2000-09-08 Jeffrey Stedfast <fejj@helixcode.com>
+
+ * filtertypes.xml: Added scoring xml stuffs
+
+ * Makefile.am: added filter-score.[c,h]
+
+ * filter-score.[c,h]: New functions to handle the "score" filter
+ type.
+
+ * filter-element.c (filter_element_new_type_name): Added support
+ for "score" type.
+
+ * filter-driver.c (do_score): New ESExp callback for filter
+ actions to set the score on a message.
+
+ * filter-message-search.c (get_score): New ESExp callback for
+ getting the score tag as an integer value.
+
2000-09-07 Jeffrey Stedfast <fejj@helixcode.com>
* filter-driver.c (filter_driver_run): Now takes a
diff --git a/filter/Makefile.am b/filter/Makefile.am
index 477666f4b7..d339f625d9 100644
--- a/filter/Makefile.am
+++ b/filter/Makefile.am
@@ -50,6 +50,8 @@ libfilter_la_SOURCES = \
filter-part.h \
filter-rule.c \
filter-rule.h \
+ filter-score.c \
+ filter-score.h \
rule-context.c \
rule-context.h \
score-context.c \
diff --git a/filter/filter-driver.c b/filter/filter-driver.c
index e7c733b6a7..a233b580ad 100644
--- a/filter/filter-driver.c
+++ b/filter/filter-driver.c
@@ -79,6 +79,7 @@ static ESExpResult *mark_forward (struct _ESExp *f, int argc, struct _ESExpResul
static ESExpResult *mark_copy (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *);
static ESExpResult *do_stop (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *);
static ESExpResult *do_colour (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *);
+static ESExpResult *do_score (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *);
/* these are our filter actions - each must have a callback */
static struct {
@@ -92,6 +93,7 @@ static struct {
{ "copy-to", (ESExpFunc *) mark_copy, 0 },
{ "stop", (ESExpFunc *) do_stop, 0 },
{ "set-colour", (ESExpFunc *) do_colour, 0 },
+ { "set-score", (ESExpFunc *) do_score, 0 }
};
static GtkObjectClass *filter_driver_parent;
@@ -303,7 +305,7 @@ do_colour (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver
struct _FilterDriverPrivate *p = _PRIVATE (driver);
if (!p->terminated) {
- d(fprintf (stderr, "setting colour flag\n"));
+ d(fprintf (stderr, "setting colour tag\n"));
if (argc > 0 && argv[0]->type == ESEXP_RES_STRING) {
camel_tag_set (&p->info->user_tags, "colour", argv[0]->value.string);
}
@@ -312,6 +314,25 @@ do_colour (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver
return NULL;
}
+static ESExpResult *
+do_score (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterDriver *driver)
+{
+ struct _FilterDriverPrivate *p = _PRIVATE (driver);
+
+ if (!p->terminated) {
+ d(fprintf (stderr, "setting score tag\n"));
+ if (argc > 0 && argv[0]->type == ESEXP_RES_INT) {
+ char *value;
+
+ value = g_strdup_printf ("%d", argv[0]->value.number);
+ camel_tag_set (&p->info->user_tags, "score", value);
+ g_free (value);
+ }
+ }
+
+ return NULL;
+}
+
static CamelFolder *
open_folder (FilterDriver *driver, const char *folder_url)
{
diff --git a/filter/filter-element.c b/filter/filter-element.c
index e0b896daf2..58e68350a4 100644
--- a/filter/filter-element.c
+++ b/filter/filter-element.c
@@ -27,6 +27,7 @@
#include "filter-code.h"
#include "filter-colour.h"
#include "filter-datespec.h"
+#include "filter-score.h"
#include "filter-folder.h"
static void xml_create(FilterElement *fe, xmlNodePtr node);
@@ -225,21 +226,23 @@ FilterElement *filter_element_new_type_name (const char *type)
if (type == NULL)
return NULL;
- if (!strcmp(type, "string")) {
- return (FilterElement *)filter_input_new();
- } else if (!strcmp(type, "folder")) {
- return (FilterElement *)filter_folder_new();
- } else if (!strcmp(type, "address")) {
+ if (!strcmp (type, "string")) {
+ return (FilterElement *)filter_input_new ();
+ } else if (!strcmp (type, "folder")) {
+ return (FilterElement *)filter_folder_new ();
+ } else if (!strcmp (type, "address")) {
/* FIXME: temporary ... need real address type */
- return (FilterElement *)filter_input_new_type_name(type);
- } else if (!strcmp(type, "code")) {
- return (FilterElement *)filter_code_new();
- } else if (!strcmp(type, "colour")) {
- return (FilterElement *)filter_colour_new();
- } else if (!strcmp(type, "optionlist")) {
- return (FilterElement *)filter_option_new();
- } else if (!strcmp(type, "datespec")) {
- return (FilterElement *)filter_datespec_new();
+ return (FilterElement *)filter_input_new_type_name (type);
+ } else if (!strcmp (type, "code")) {
+ return (FilterElement *)filter_code_new ();
+ } else if (!strcmp (type, "colour")) {
+ return (FilterElement *)filter_colour_new ();
+ } else if (!strcmp (type, "optionlist")) {
+ return (FilterElement *)filter_option_new ();
+ } else if (!strcmp (type, "datespec")) {
+ return (FilterElement *)filter_datespec_new ();
+ } else if (!strcmp (type, "score")) {
+ return (FilterElement *)filter_score_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 4fad81cdf5..9730deb61e 100644
--- a/filter/filter-message-search.c
+++ b/filter/filter-message-search.c
@@ -40,7 +40,7 @@ static ESExpResult *user_tag (struct _ESExp *f, int argc, struct _ESExpResult **
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);
-
+static ESExpResult *get_score (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms);
/* builtin functions */
static struct {
@@ -56,7 +56,8 @@ static struct {
{ "user-flag", (ESExpFunc *) user_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 }
+ { "get-current-date", (ESExpFunc *) get_current_date, 0 },
+ { "get-score", (ESExpFunc *) get_score, 0 }
};
static ESExpResult *
@@ -224,12 +225,26 @@ static ESExpResult *
get_current_date (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms)
{
ESExpResult *r;
- time_t date;
- date = time (NULL);
+ r = e_sexp_result_new (ESEXP_RES_INT);
+ r->value.number = time (NULL);
+
+ return r;
+}
+
+static ESExpResult *
+get_score (struct _ESExp *f, int argc, struct _ESExpResult **argv, FilterMessageSearch *fms)
+{
+ ESExpResult *r;
+ const char *tag;
+
+ tag = camel_tag_get (&fms->info->user_tags, "score");
r = e_sexp_result_new (ESEXP_RES_INT);
- r->value.number = date;
+ if (tag)
+ r->value.number = atoi (tag);
+ else
+ r->value.number = 0;
return r;
}
diff --git a/filter/filter-score.c b/filter/filter-score.c
new file mode 100644
index 0000000000..03e969aa6e
--- /dev/null
+++ b/filter/filter-score.c
@@ -0,0 +1,225 @@
+/* -*- 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 "e-util/e-sexp.h"
+#include "filter-score.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_score_class_init (FilterScoreClass *class);
+static void filter_score_init (FilterScore *gspaper);
+static void filter_score_finalise (GtkObject *obj);
+
+#define _PRIVATE(x) (((FilterScore *)(x))->priv)
+
+struct _FilterScorePrivate {
+};
+
+static FilterElementClass *parent_class;
+
+enum {
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+guint
+filter_score_get_type (void)
+{
+ static guint type = 0;
+
+ if (!type) {
+ GtkTypeInfo type_info = {
+ "FilterScore",
+ sizeof (FilterScore),
+ sizeof (FilterScoreClass),
+ (GtkClassInitFunc) filter_score_class_init,
+ (GtkObjectInitFunc) filter_score_init,
+ (GtkArgSetFunc) NULL,
+ (GtkArgGetFunc) NULL
+ };
+
+ type = gtk_type_unique (filter_element_get_type (), &type_info);
+ }
+
+ return type;
+}
+
+static void
+filter_score_class_init (FilterScoreClass *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_score_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_score_init (FilterScore *o)
+{
+ o->priv = g_malloc0 (sizeof (*o->priv));
+}
+
+static void
+filter_score_finalise(GtkObject *obj)
+{
+ FilterScore *o = (FilterScore *)obj;
+
+ o = o;
+
+ ((GtkObjectClass *)(parent_class))->finalize(obj);
+}
+
+/**
+ * filter_score_new:
+ *
+ * Create a new FilterScore object.
+ *
+ * Return value: A new #FilterScore object.
+ **/
+FilterScore *
+filter_score_new (void)
+{
+ FilterScore *o = (FilterScore *)gtk_type_new(filter_score_get_type ());
+ return o;
+}
+
+static void
+xml_create (FilterElement *fe, xmlNodePtr node)
+{
+ /*FilterScore *fs = (FilterScore *)fe;*/
+
+ /* parent implementation */
+ ((FilterElementClass *)(parent_class))->xml_create(fe, node);
+}
+
+static xmlNodePtr
+xml_encode (FilterElement *fe)
+{
+ xmlNodePtr value;
+ FilterScore *fs = (FilterScore *)fe;
+ char *score;
+
+ d(printf("Encoding score as xml\n"));
+
+ value = xmlNewNode (NULL, "value");
+ xmlSetProp (value, "name", fe->name);
+ xmlSetProp (value, "type", "score");
+
+ score = g_strdup_printf ("%d", fs->score);
+ xmlSetProp (value, "score", score);
+ g_free (score);
+
+ return value;
+}
+
+static int
+xml_decode (FilterElement *fe, xmlNodePtr node)
+{
+ FilterScore *fs = (FilterScore *)fe;
+ char *name;
+ char *score;
+
+ d(printf("Decoding score from xml %p\n", fe));
+
+ name = xmlGetProp (node, "name");
+ d(printf ("Name = %s\n", name));
+ fe->name = name;
+ score = xmlGetProp (node, name);
+ if (score)
+ fs->score = atoi (score);
+ else
+ fs->score = 0;
+
+ return 0;
+}
+
+static void
+spin_changed (GtkWidget *spin, FilterElement *fe)
+{
+ FilterScore *fs = (FilterScore *)fe;
+
+ fs->score = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
+}
+
+static GtkWidget *
+get_widget (FilterElement *fe)
+{
+ GtkWidget *spin;
+ GtkObject *adjustment;
+ FilterScore *fs = (FilterScore *)fe;
+
+ adjustment = gtk_adjustment_new (0.0, -100.0, 100.0, 1.0, 1.0, 1.0);
+ spin = gtk_spin_button_new (GTK_ADJUSTMENT (adjustment), 1.0, 0);
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin), TRUE);
+
+ if (fs->score) {
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), (gfloat) fs->score);
+ }
+
+ gtk_signal_connect (GTK_OBJECT (spin), "changed", spin_changed, fe);
+
+ return spin;
+}
+
+static void
+build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
+{
+ return;
+}
+
+static void
+format_sexp (FilterElement *fe, GString *out)
+{
+ FilterScore *fs = (FilterScore *)fe;
+ char *score;
+
+ score = g_strdup_printf ("%d", fs->score);
+ e_sexp_encode_string (out, score);
+ g_free (score);
+}
diff --git a/filter/filter-score.h b/filter/filter-score.h
new file mode 100644
index 0000000000..126a0fff0b
--- /dev/null
+++ b/filter/filter-score.h
@@ -0,0 +1,57 @@
+/* -*- 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_SCORE_H
+#define _FILTER_SCORE_H
+
+#include <gtk/gtk.h>
+#include "filter-element.h"
+
+#define FILTER_SCORE(obj) GTK_CHECK_CAST (obj, filter_score_get_type (), FilterScore)
+#define FILTER_SCORE_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_score_get_type (), FilterScoreClass)
+#define IS_FILTER_SCORE(obj) GTK_CHECK_TYPE (obj, filter_score_get_type ())
+
+typedef struct _FilterScore FilterScore;
+typedef struct _FilterScoreClass FilterScoreClass;
+
+struct _FilterScore {
+ FilterElement parent;
+ struct _FilterScorePrivate *priv;
+
+ gint32 score;
+};
+
+struct _FilterScoreClass {
+ FilterElementClass parent_class;
+
+ /* virtual methods */
+
+ /* signals */
+};
+
+guint filter_score_get_type (void);
+FilterScore *filter_score_new (void);
+
+/* methods */
+
+#endif /* ! _FILTER_SCORE_H */
+
diff --git a/filter/filtertypes.xml b/filter/filtertypes.xml
index 09daea6de1..791e566a85 100644
--- a/filter/filtertypes.xml
+++ b/filter/filtertypes.xml
@@ -141,6 +141,38 @@
</input>
</part>
+ <part name="score">
+ <title>Message score</title>
+ <input type="optionlist" name="score-type">
+ <option value="less-than">
+ <title>less than</title>
+ <code>
+ (match-all (&lt; (get-score) ${versus}))
+ </code>
+ </option>
+ <option value="less-than-or-equal">
+ <title>less than or equal to</title>
+ <code>
+ (match-all (not (&gt; (get-score) ${versus})))
+ </code>
+ </option>
+ <option value="greater-than">
+ <title>greater than</title>
+ <code>
+ (match-all (&gt; (get-score) ${versus}))
+ </code>
+ </option>
+ <option value="greater-than-or-equal">
+ <title>greater than or equal to</title>
+ <code>
+ (match-all (not (&lt; (get-score) ${versus})))
+ </code>
+ </option>
+ </input>
+ <input type="score" name="versus">
+ </input>
+ </part>
+
</partset>
@@ -168,5 +200,10 @@
<code>(set-colour ${colour})</code>
<input type="colour" name="colour"/>
</part>
+ <part name="score">
+ <title>Assign Score</title>
+ <code>(set-score ${score})</code>
+ <input type="score" name="score"/>
+ </part>
</actionset>
</filterdescription>