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 | } |