aboutsummaryrefslogtreecommitdiffstats
path: root/filter/e-filter-rule.h
blob: c84cdefb0e130d7513d9ede1a453ee5678634ae5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) version 3.
 *
 * 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with the program; if not, see <http://www.gnu.org/licenses/>
 *
 *
 * Authors:
 *      Not Zed <notzed@lostzed.mmc.com.au>
 *      Jeffrey Stedfast <fejj@ximian.com>
 *
 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
 *
 */

#ifndef E_FILTER_RULE_H
#define E_FILTER_RULE_H

#include <glib-object.h>

#include "e-filter-part.h"

/* Standard GObject macros */
#define E_TYPE_FILTER_RULE \
    (e_filter_rule_get_type ())
#define E_FILTER_RULE(obj) \
    (G_TYPE_CHECK_INSTANCE_CAST \
    ((obj), E_TYPE_FILTER_RULE, EFilterRule))
#define E_FILTER_RULE_CLASS(cls) \
    (G_TYPE_CHECK_CLASS_CAST \
    ((cls), E_TYPE_FILTER_RULE, EFilterRuleClass))
#define E_IS_FILTER_RULE(obj) \
    (G_TYPE_CHECK_INSTANCE_TYPE \
    ((obj), E_TYPE_FILTER_RULE))
#define E_IS_FILTER_RULE_CLASS(cls) \
    (G_TYPE_CHECK_CLASS_TYPE \
    ((cls), E_TYPE_FILTER_RULE))
#define E_FILTER_RULE_GET_CLASS(obj) \
    (G_TYPE_INSTANCE_GET_CLASS \
    ((obj), E_TYPE_FILTER_RULE, EFilterRuleClass))

G_BEGIN_DECLS

struct _RuleContext;

typedef struct _EFilterRule EFilterRule;
typedef struct _EFilterRuleClass EFilterRuleClass;
typedef struct _EFilterRulePrivate EFilterRulePrivate;

enum _filter_grouping_t {
    E_FILTER_GROUP_ALL, /* all rules must match */
    E_FILTER_GROUP_ANY  /* any rule must match */
};

/* threading, if the context supports it */
enum _filter_threading_t {
    E_FILTER_THREAD_NONE,   /* don't add any thread matching */
    E_FILTER_THREAD_ALL,    /* add all possible threads */
    E_FILTER_THREAD_REPLIES,    /* add only replies */
    E_FILTER_THREAD_REPLIES_PARENTS,    /* replies plus parents */
    E_FILTER_THREAD_SINGLE  /* messages with no replies or parents */
};

#define E_FILTER_SOURCE_INCOMING "incoming" /* performed on incoming email */
#define E_FILTER_SOURCE_DEMAND   "demand"   /* performed on the selected folder
                         * when the user asks for it */
#define E_FILTER_SOURCE_OUTGOING  "outgoing"/* performed on outgoing mail */
#define E_FILTER_SOURCE_JUNKTEST  "junktest"/* perform only junktest on incoming mail */

struct _EFilterRule {
    GObject parent_object;
    EFilterRulePrivate *priv;

    gchar *name;
    gchar *source;

    enum _filter_grouping_t grouping;
    enum _filter_threading_t threading;

    guint system:1; /* this is a system rule, cannot be edited/deleted */
    GList *parts;

    gboolean enabled;
};

struct _EFilterRuleClass {
    GObjectClass parent_class;

    /* virtual methods */
    gint        (*validate)     (EFilterRule *rule,
                         GtkWindow *error_parent);
    gint        (*eq)           (EFilterRule *rule_a,
                         EFilterRule *rule_b);

    xmlNodePtr  (*xml_encode)       (EFilterRule *rule);
    gint        (*xml_decode)       (EFilterRule *rule,
                         xmlNodePtr node,
                         struct _ERuleContext *context);

    void        (*build_code)       (EFilterRule *rule,
                         GString *out);

    void        (*copy)         (EFilterRule *dst_rule,
                         EFilterRule *src_rule);

    GtkWidget * (*get_widget)       (EFilterRule *rule,
                         struct _ERuleContext *context);

    /* signals */
    void        (*changed)      (EFilterRule *rule);
};

GType       e_filter_rule_get_type      (void);
EFilterRule *   e_filter_rule_new       (void);
EFilterRule *   e_filter_rule_clone     (EFilterRule *rule);
void        e_filter_rule_set_name      (EFilterRule *rule,
                         const gchar *name);
void        e_filter_rule_set_source    (EFilterRule *rule,
                         const gchar *source);
gint        e_filter_rule_validate      (EFilterRule *rule,
                         GtkWindow *error_parent);
gint        e_filter_rule_eq        (EFilterRule *rule_a,
                         EFilterRule *rule_b);
xmlNodePtr  e_filter_rule_xml_encode    (EFilterRule *rule);
gint        e_filter_rule_xml_decode    (EFilterRule *rule,
                         xmlNodePtr node,
                         struct _ERuleContext *context);
void        e_filter_rule_copy      (EFilterRule *dst_rule,
                         EFilterRule *src_rule);
void        e_filter_rule_add_part      (EFilterRule *rule,
                         EFilterPart *part);
void        e_filter_rule_remove_part   (EFilterRule *rule,
                         EFilterPart *part);
void        e_filter_rule_replace_part  (EFilterRule *rule,
                         EFilterPart *old_part,
                         EFilterPart *new_part);
GtkWidget * e_filter_rule_get_widget    (EFilterRule *rule,
                         struct _ERuleContext *context);
void        e_filter_rule_build_code    (EFilterRule *rule,
                         GString *out);
void        e_filter_rule_emit_changed  (EFilterRule *rule);

/* static functions */
EFilterRule *   e_filter_rule_next_list     (GList *list,
                         EFilterRule *last,
                         const gchar *source);
EFilterRule *   e_filter_rule_find_list     (GList *list,
                         const gchar *name,
                         const gchar *source);

G_END_DECLS

#endif /* E_FILTER_RULE_H */