aboutsummaryrefslogtreecommitdiffstats
path: root/filter/filter-rule.h
blob: 9e30b6e84b03097dc11d48fc214cbdc8f9e4d252 (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
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
 *  Copyright (C) 2000-2002 Ximian Inc.
 *
 *  Authors: Not Zed <notzed@lostzed.mmc.com.au>
 *           Jeffrey Stedfast <fejj@ximian.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 *
 * 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., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#ifndef _FILTER_RULE_H
#define _FILTER_RULE_H

#include <glib.h>
#include <glib-object.h>

#include "filter-part.h"

#define FILTER_TYPE_RULE            (filter_rule_get_type ())
#define FILTER_RULE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), FILTER_TYPE_RULE, FilterRule))
#define FILTER_RULE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), FILTER_TYPE_RULE, FilterRuleClass))
#define IS_FILTER_RULE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FILTER_TYPE_RULE))
#define IS_FILTER_RULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FILTER_TYPE_RULE))
#define FILTER_RULE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), FILTER_TYPE_RULE, FilterRuleClass))

struct _RuleContext;

typedef struct _FilterRule  FilterRule;
typedef struct _FilterRuleClass FilterRuleClass;

enum _filter_grouping_t {
    FILTER_GROUP_ALL,   /* all rules must match */
    FILTER_GROUP_ANY    /* any rule must match */
};

/* threading, if the context supports it */
enum _filter_threading_t {
    FILTER_THREAD_NONE, /* don't add any thread matching */
    FILTER_THREAD_ALL,  /* add all possible threads */
    FILTER_THREAD_REPLIES,  /* add only replies */
    FILTER_THREAD_REPLIES_PARENTS,  /* replies plus parents */
    FILTER_THREAD_SINGLE,   /* messages with no replies or parents */
};

#define FILTER_SOURCE_INCOMING "incoming" /* performed on incoming email */
#define FILTER_SOURCE_DEMAND   "demand"   /* performed on the selected folder
                       * when the user asks for it */
#define FILTER_SOURCE_OUTGOING  "outgoing"/* performed on outgoing mail */
#define FILTER_SOURCE_JUNKTEST  "junktest"/* perform only junktest on incoming mail */

struct _FilterRule {
    GObject parent_object;
    struct _FilterRulePrivate *priv;
    
    char *name;
    char *source;
    
    enum _filter_grouping_t grouping;
    enum _filter_threading_t threading;

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

struct _FilterRuleClass {
    GObjectClass parent_class;
    
    /* virtual methods */
    int (*validate) (FilterRule *);
    int (*eq) (FilterRule *fr, FilterRule *cm);
    
    xmlNodePtr (*xml_encode) (FilterRule *);
    int (*xml_decode) (FilterRule *, xmlNodePtr, struct _RuleContext *);
    
    void (*build_code) (FilterRule *, GString *out);
    
    void (*copy) (FilterRule *dest, FilterRule *src);
    
    GtkWidget *(*get_widget) (FilterRule *fr, struct _RuleContext *f);
    
    /* signals */
    void (*changed) (FilterRule *fr);
};


GType       filter_rule_get_type     (void);
FilterRule *filter_rule_new          (void);

FilterRule *filter_rule_clone        (FilterRule *base);

/* methods */
void        filter_rule_set_name     (FilterRule *fr, const char *name);
void        filter_rule_set_source   (FilterRule *fr, const char *source);

int         filter_rule_validate     (FilterRule *fr);
int         filter_rule_eq           (FilterRule *fr, FilterRule *cm);

xmlNodePtr  filter_rule_xml_encode   (FilterRule *fr);
int         filter_rule_xml_decode   (FilterRule *fr, xmlNodePtr node, struct _RuleContext *f);

void        filter_rule_copy         (FilterRule *dest, FilterRule *src);

void        filter_rule_add_part     (FilterRule *fr, FilterPart *fp);
void        filter_rule_remove_part  (FilterRule *fr, FilterPart *fp);
void        filter_rule_replace_part (FilterRule *fr, FilterPart *fp, FilterPart *new);

GtkWidget  *filter_rule_get_widget   (FilterRule *fr, struct _RuleContext *f);

void        filter_rule_build_code   (FilterRule *fr, GString *out);
/*
void  filter_rule_build_action(FilterRule *fr, GString *out);
*/

void        filter_rule_emit_changed (FilterRule *fr);

/* static functions */
FilterRule *filter_rule_next_list    (GList *l, FilterRule *last, const char *source);
FilterRule *filter_rule_find_list    (GList *l, const char *name, const char *source);


#endif /* ! _FILTER_RULE_H */