Statistics
| Branch: | Tag: | Revision:

root / lib / filter-manager.c @ c6867d94

History | View | Annotate | Download (2.9 kB)

1 4012ec30 Hiroyuki Yamamoto
2 4012ec30 Hiroyuki Yamamoto
#include <glib.h>
3 4012ec30 Hiroyuki Yamamoto
4 4012ec30 Hiroyuki Yamamoto
#include "filter.h"
5 4012ec30 Hiroyuki Yamamoto
#include "filter-manager.h"
6 4012ec30 Hiroyuki Yamamoto
#include "filter-private.h"
7 4012ec30 Hiroyuki Yamamoto
8 4012ec30 Hiroyuki Yamamoto
9 4012ec30 Hiroyuki Yamamoto
XFilterManager *xfilter_manager_new(void)
10 4012ec30 Hiroyuki Yamamoto
{
11 4012ec30 Hiroyuki Yamamoto
        XFilterManager *mgr;
12 4012ec30 Hiroyuki Yamamoto
13 4012ec30 Hiroyuki Yamamoto
        mgr = g_new0(XFilterManager, 1);
14 4012ec30 Hiroyuki Yamamoto
        return mgr;
15 4012ec30 Hiroyuki Yamamoto
}
16 4012ec30 Hiroyuki Yamamoto
17 4012ec30 Hiroyuki Yamamoto
void xfilter_manager_free(XFilterManager *mgr)
18 4012ec30 Hiroyuki Yamamoto
{
19 4012ec30 Hiroyuki Yamamoto
        XFilter *list;
20 4012ec30 Hiroyuki Yamamoto
        XFilter *next;
21 4012ec30 Hiroyuki Yamamoto
22 4012ec30 Hiroyuki Yamamoto
        if (!mgr)
23 4012ec30 Hiroyuki Yamamoto
                return;
24 4012ec30 Hiroyuki Yamamoto
25 4012ec30 Hiroyuki Yamamoto
        for (list = mgr->filter_list; list != NULL; list = next) {
26 4012ec30 Hiroyuki Yamamoto
                next = list->next;
27 4012ec30 Hiroyuki Yamamoto
                xfilter_free(list);
28 4012ec30 Hiroyuki Yamamoto
        }
29 4012ec30 Hiroyuki Yamamoto
        g_free(mgr->original_encoding);
30 4012ec30 Hiroyuki Yamamoto
        g_free(mgr->sender);
31 4012ec30 Hiroyuki Yamamoto
        g_free(mgr->recipient);
32 4012ec30 Hiroyuki Yamamoto
        g_free(mgr->subject);
33 4012ec30 Hiroyuki Yamamoto
34 4012ec30 Hiroyuki Yamamoto
        g_free(mgr);
35 4012ec30 Hiroyuki Yamamoto
}
36 4012ec30 Hiroyuki Yamamoto
37 4012ec30 Hiroyuki Yamamoto
void xfilter_manager_filter_add(XFilterManager *mgr, XFilter *filter)
38 4012ec30 Hiroyuki Yamamoto
{
39 4012ec30 Hiroyuki Yamamoto
        XFilter *list;
40 4012ec30 Hiroyuki Yamamoto
41 4012ec30 Hiroyuki Yamamoto
        g_return_if_fail(mgr != NULL);
42 4012ec30 Hiroyuki Yamamoto
        g_return_if_fail(filter != NULL);
43 4012ec30 Hiroyuki Yamamoto
44 4012ec30 Hiroyuki Yamamoto
        list = mgr->filter_list;
45 4012ec30 Hiroyuki Yamamoto
        if (list) {
46 4012ec30 Hiroyuki Yamamoto
                while (list->next) {
47 4012ec30 Hiroyuki Yamamoto
                        list = list->next;
48 4012ec30 Hiroyuki Yamamoto
                }
49 4012ec30 Hiroyuki Yamamoto
                list->next = filter;
50 4012ec30 Hiroyuki Yamamoto
        } else {
51 4012ec30 Hiroyuki Yamamoto
                mgr->filter_list = filter;
52 4012ec30 Hiroyuki Yamamoto
        }
53 4012ec30 Hiroyuki Yamamoto
54 4012ec30 Hiroyuki Yamamoto
        filter->manager = mgr;
55 4012ec30 Hiroyuki Yamamoto
}
56 4012ec30 Hiroyuki Yamamoto
57 4012ec30 Hiroyuki Yamamoto
void xfilter_manager_filter_remove(XFilterManager *mgr, XFilter *filter)
58 4012ec30 Hiroyuki Yamamoto
{
59 4012ec30 Hiroyuki Yamamoto
        XFilter *list;
60 4012ec30 Hiroyuki Yamamoto
        XFilter *prev = NULL;
61 4012ec30 Hiroyuki Yamamoto
62 4012ec30 Hiroyuki Yamamoto
        g_return_if_fail(mgr != NULL);
63 4012ec30 Hiroyuki Yamamoto
        g_return_if_fail(filter != NULL);
64 4012ec30 Hiroyuki Yamamoto
65 4012ec30 Hiroyuki Yamamoto
        for (list = mgr->filter_list; list != NULL; list = list->next) {
66 4012ec30 Hiroyuki Yamamoto
                if (list == filter) {
67 4012ec30 Hiroyuki Yamamoto
                        if (prev)
68 4012ec30 Hiroyuki Yamamoto
                                prev->next = list->next;
69 4012ec30 Hiroyuki Yamamoto
                        list->next = NULL;
70 4012ec30 Hiroyuki Yamamoto
                        filter->manager = NULL;
71 4012ec30 Hiroyuki Yamamoto
                        break;
72 4012ec30 Hiroyuki Yamamoto
                }
73 4012ec30 Hiroyuki Yamamoto
                prev = list;
74 4012ec30 Hiroyuki Yamamoto
        }
75 4012ec30 Hiroyuki Yamamoto
}
76 4012ec30 Hiroyuki Yamamoto
77 56393467 Hiroyuki Yamamoto
int xfilter_manager_add_filters(XFilterManager *mgr, XFilterConstructorFunc ctors[])
78 56393467 Hiroyuki Yamamoto
{
79 56393467 Hiroyuki Yamamoto
        XFilter *filter;
80 56393467 Hiroyuki Yamamoto
        int i;
81 56393467 Hiroyuki Yamamoto
82 56393467 Hiroyuki Yamamoto
        for (i = 0; ctors[i] != NULL; i++) {
83 56393467 Hiroyuki Yamamoto
                filter = ctors[i]();
84 56393467 Hiroyuki Yamamoto
                if (!filter)
85 56393467 Hiroyuki Yamamoto
                        return -1;
86 56393467 Hiroyuki Yamamoto
                xfilter_manager_filter_add(mgr, filter);
87 56393467 Hiroyuki Yamamoto
        }
88 56393467 Hiroyuki Yamamoto
89 56393467 Hiroyuki Yamamoto
        return 0;
90 56393467 Hiroyuki Yamamoto
}
91 56393467 Hiroyuki Yamamoto
92 4012ec30 Hiroyuki Yamamoto
void xfilter_manager_done(XFilterManager *mgr)
93 4012ec30 Hiroyuki Yamamoto
{
94 4012ec30 Hiroyuki Yamamoto
        g_return_if_fail(mgr != NULL);
95 4012ec30 Hiroyuki Yamamoto
96 4012ec30 Hiroyuki Yamamoto
        g_free(mgr->original_encoding);
97 4012ec30 Hiroyuki Yamamoto
        mgr->original_encoding = NULL;
98 4012ec30 Hiroyuki Yamamoto
        g_free(mgr->sender);
99 4012ec30 Hiroyuki Yamamoto
        mgr->sender = NULL;
100 4012ec30 Hiroyuki Yamamoto
        g_free(mgr->recipient);
101 4012ec30 Hiroyuki Yamamoto
        mgr->recipient = NULL;
102 4012ec30 Hiroyuki Yamamoto
        g_free(mgr->subject);
103 4012ec30 Hiroyuki Yamamoto
        mgr->subject = NULL;
104 4012ec30 Hiroyuki Yamamoto
}
105 4012ec30 Hiroyuki Yamamoto
106 4012ec30 Hiroyuki Yamamoto
XFilterResult *xfilter_manager_run(XFilterManager *mgr, XMessageData *msgdata)
107 4012ec30 Hiroyuki Yamamoto
{
108 4012ec30 Hiroyuki Yamamoto
        XFilter *list;
109 4012ec30 Hiroyuki Yamamoto
        const XMessageData *curdata;
110 4012ec30 Hiroyuki Yamamoto
        XFilterResult *res;
111 4012ec30 Hiroyuki Yamamoto
        XFilterStatus status;
112 4012ec30 Hiroyuki Yamamoto
113 4012ec30 Hiroyuki Yamamoto
        g_return_val_if_fail(mgr != NULL, NULL);
114 4012ec30 Hiroyuki Yamamoto
115 4012ec30 Hiroyuki Yamamoto
        xfilter_debug_print("%s: %s: run filter chain\n", __FILE__, G_STRFUNC);
116 4012ec30 Hiroyuki Yamamoto
117 4012ec30 Hiroyuki Yamamoto
        res = xfilter_result_new();
118 4012ec30 Hiroyuki Yamamoto
119 4012ec30 Hiroyuki Yamamoto
        curdata = msgdata;
120 4012ec30 Hiroyuki Yamamoto
121 4012ec30 Hiroyuki Yamamoto
        for (list = mgr->filter_list; list != NULL; list = list->next) {
122 4012ec30 Hiroyuki Yamamoto
                xfilter_debug_print("exec filter: %s [%s] in data type: %s\n", xfilter_get_name(list), xfilter_get_type(list) == XF_CONTENT ? "content filter" : "test filter", xfilter_message_data_get_mime_type(curdata));
123 28703c7f Hiroyuki Yamamoto
124 28703c7f Hiroyuki Yamamoto
                status = xfilter_exec(list, curdata, res);
125 28703c7f Hiroyuki Yamamoto
                if (res->msgdata)
126 28703c7f Hiroyuki Yamamoto
                        curdata = res->msgdata;
127 28703c7f Hiroyuki Yamamoto
128 4012ec30 Hiroyuki Yamamoto
                xfilter_debug_print("exec filter: %s: status %d: out data type: %s\n", xfilter_get_name(list), status, xfilter_message_data_get_mime_type(curdata));
129 28703c7f Hiroyuki Yamamoto
130 4012ec30 Hiroyuki Yamamoto
                if (status == XF_JUNK) {
131 4012ec30 Hiroyuki Yamamoto
                        xfilter_debug_print("filter returned XF_JUNK, end filter chain\n");
132 4012ec30 Hiroyuki Yamamoto
                        break;
133 4012ec30 Hiroyuki Yamamoto
                }
134 4012ec30 Hiroyuki Yamamoto
                if (status == XF_UNSUPPORTED_TYPE || status == XF_ERROR) {
135 4012ec30 Hiroyuki Yamamoto
                        xfilter_debug_print("filter returned error, end filter chain\n");
136 4012ec30 Hiroyuki Yamamoto
                        break;
137 4012ec30 Hiroyuki Yamamoto
                }
138 4012ec30 Hiroyuki Yamamoto
        }
139 4012ec30 Hiroyuki Yamamoto
140 4012ec30 Hiroyuki Yamamoto
        xfilter_manager_done(mgr);
141 4012ec30 Hiroyuki Yamamoto
142 4012ec30 Hiroyuki Yamamoto
        return res;
143 4012ec30 Hiroyuki Yamamoto
}