Statistics
| Branch: | Tag: | Revision:

root / lib / filter.c @ 28703c7f

History | View | Annotate | Download (4.6 kB)

1
#include <stdio.h>
2
#include <glib.h>
3
4
#include "filter.h"
5
#include "filter-private.h"
6
#include "filter-utils.h"
7
8
9
static int xfilter_debug_mode = 1;
10
11
12
int xfilter_init(void)
13
{
14
        return 0;
15
}
16
17
void xfilter_done(void)
18
{
19
}
20
21
XFilter *xfilter_new(XFilterType type, const char *name)
22
{
23
        XFilter *filter;
24
25
        if (type == XF_CONTENT) {
26
                filter = XFILTER(g_new0(XContentFilter, 1));
27
        } else {
28
                filter = XFILTER(g_new0(XTestFilter, 1));
29
        }
30
31
        filter->type = type;
32
        filter->name = g_strdup(name);
33
34
        return filter;
35
}
36
37
void xfilter_free(XFilter *filter)
38
{
39
        if (!filter)
40
                return;
41
        g_free(filter->name);
42
        g_free(filter);
43
}
44
45
XFilterType xfilter_get_type(XFilter *filter)
46
{
47
        g_return_val_if_fail(filter != NULL, -1);
48
49
        return filter->type;
50
}
51
52
const char *xfilter_get_name(XFilter *filter)
53
{
54
        g_return_val_if_fail(filter != NULL, NULL);
55
56
        return filter->name;
57
}
58
59
void xfilter_set_input_mime_types(XFilter *filter, const char **types)
60
{
61
}
62
63
void xfilter_set_output_mime_type(XFilter *filter, const char *type)
64
{
65
}
66
67
XMessageData *xfilter_message_data_new(const char *src, const char *mime_type)
68
{
69
        XMessageData *data;
70
71
        g_return_val_if_fail(mime_type != NULL, NULL);
72
73
        data = g_new0(XMessageData, 1);
74
        data->content = g_strdup(src);
75
        data->mime_type = g_strdup(mime_type);
76
        return data;
77
}
78
79
XMessageData *xfilter_message_data_read_file(const char *file, const char *mime_type)
80
{
81
        XMessageData *data;
82
        char *content;
83
84
        g_return_val_if_fail(file != NULL, NULL);
85
        g_return_val_if_fail(mime_type != NULL, NULL);
86
87
        content = xfilter_utils_get_file_contents(file);
88
        if (!content)
89
                return NULL;
90
91
        data = g_new0(XMessageData, 1);
92
        data->content = content;
93
        data->mime_type = g_strdup(mime_type);
94
        return data;
95
}
96
97
void xfilter_message_data_free(XMessageData *msgdata)
98
{
99
        if (!msgdata)
100
                return;
101
        g_free(msgdata->mime_type);
102
        g_free(msgdata->content);
103
        g_free(msgdata);
104
}
105
106
void xfilter_message_data_set_content(XMessageData *msgdata, char *content)
107
{
108
        msgdata->content = content;
109
}
110
111
const char *xfilter_message_data_get_mime_type(const XMessageData *msgdata)
112
{
113
        g_return_val_if_fail(msgdata != NULL, NULL);
114
115
        return msgdata->mime_type;
116
}
117
118
const char *xfilter_message_data_get_content(const XMessageData *msgdata)
119
{
120
        g_return_val_if_fail(msgdata != NULL, NULL);
121
122
        return msgdata->content;
123
}
124
125
void xfilter_set_content_filter_func(XContentFilter *filter, XContentFilterFunc func)
126
{
127
        g_return_if_fail(XFILTER(filter)->type == XF_CONTENT);
128
129
        filter->content_filter_func = func;
130
}
131
132
void xfilter_set_test_filter_func(XTestFilter *filter, XTestFilterFunc func)
133
{
134
        g_return_if_fail(XFILTER(filter)->type == XF_TEST);
135
136
        filter->test_filter_func = func;
137
}
138
139
XFilterStatus xfilter_exec(XFilter *filter, const XMessageData *msgdata, XFilterResult *result)
140
{
141
        g_return_val_if_fail(filter != NULL, XF_ERROR);
142
        g_return_val_if_fail(msgdata != NULL, XF_ERROR);
143
144
        if (filter->type == XF_CONTENT) {
145
                if (!X_CONTENT_FILTER(filter)->content_filter_func)
146
                        return XF_ERROR;
147
                return X_CONTENT_FILTER(filter)->content_filter_func(filter, msgdata, result);
148
        } else {
149
                if (!X_TEST_FILTER(filter)->test_filter_func)
150
                        return XF_ERROR;
151
                return X_TEST_FILTER(filter)->test_filter_func(filter, msgdata, result);
152
        }
153
}
154
155
void xfilter_result_print(XFilterResult *result)
156
{
157
        printf("XFilterResult: status = %d, probability = %f\n", result->status, result->probability);
158
}
159
160
XFilterResult *xfilter_result_new(void)
161
{
162
        XFilterResult *res;
163
164
        res = g_new0(XFilterResult, 1);
165
        res->status = XF_NONE;
166
        res->probability = 0.5;
167
        return res;
168
}
169
170
void xfilter_result_set_status(XFilterResult *result, XFilterStatus status)
171
{
172
        result->status = status;
173
}
174
175
void xfilter_result_set_message_data(XFilterResult *result, XMessageData *msgdata)
176
{
177
        if (result->msgdata)
178
                xfilter_message_data_free(result->msgdata);
179
        result->msgdata = msgdata;
180
}
181
182
void xfilter_result_set_probability(XFilterResult *result, double prob)
183
{
184
        result->probability = prob;
185
}
186
187
XFilterStatus xfilter_result_get_status(XFilterResult *result)
188
{
189
        g_return_val_if_fail(result != NULL, XF_ERROR);
190
191
        return result->status;
192
}
193
194
XMessageData *xfilter_result_get_message_data(XFilterResult *result)
195
{
196
        g_return_val_if_fail(result != NULL, NULL);
197
198
        return result->msgdata;
199
}
200
201
double xfilter_result_get_probability(XFilterResult *result)
202
{
203
        g_return_val_if_fail(result != NULL, 0.0);
204
205
        return result->probability;
206
}
207
208
void xfilter_result_free(XFilterResult *result)
209
{
210
        if (!result)
211
                return;
212
        xfilter_message_data_free(result->msgdata);
213
        g_free(result);
214
}
215
216
void xfilter_debug_print(const char *format, ...)
217
{
218
        va_list args;
219
        char buf[1024];
220
221
        if (!xfilter_debug_mode)
222
                return;
223
224
        va_start(args, format);
225
        g_vsnprintf(buf, sizeof(buf), format, args);
226
        va_end(args);
227
228
        fputs(buf, stderr);
229
}