Revision 54aea252 lib/filters/textcontent-filter.c
| b/lib/filters/textcontent-filter.c | ||
|---|---|---|
| 5 | 5 |
#include "textcontent-filter.h" |
| 6 | 6 |
|
| 7 | 7 |
|
| 8 |
static char *xfilter_rfc822_to_text(const XMessageData *data)
|
|
| 8 |
static XMessageData *xfilter_rfc822_to_text(const XMessageData *data)
|
|
| 9 | 9 |
{
|
| 10 | 10 |
const char *rfc822content; |
| 11 |
const char *p, *eolp; |
|
| 11 |
const char *p, *eolp, *prev_eolp = NULL, *vp = NULL; |
|
| 12 |
XMessageData *newdata; |
|
| 13 |
XMessageAttr attr = -1; |
|
| 14 |
GString *from, *to, *cc, *subject; |
|
| 12 | 15 |
|
| 13 | 16 |
p = rfc822content = xfilter_message_data_get_content(data); |
| 14 | 17 |
if (!rfc822content) |
| 15 | 18 |
return NULL; |
| 16 | 19 |
|
| 17 |
/* find empty line */ |
|
| 20 |
from = g_string_new("");
|
|
| 21 |
to = g_string_new("");
|
|
| 22 |
cc = g_string_new("");
|
|
| 23 |
subject = g_string_new("");
|
|
| 24 |
|
|
| 25 |
/* parse headers */ |
|
| 18 | 26 |
while (*p) {
|
| 19 | 27 |
eolp = strchr(p, '\n'); |
| 20 |
if (!eolp) |
|
| 21 |
return g_strdup("");
|
|
| 28 |
if (!eolp) {
|
|
| 29 |
p = NULL; |
|
| 30 |
break; |
|
| 31 |
} |
|
| 22 | 32 |
if (p == eolp || (*p == '\r' && p + 1 == eolp)) {
|
| 23 | 33 |
p = eolp + 1; |
| 24 | 34 |
break; |
| 25 | 35 |
} |
| 36 |
|
|
| 37 |
if (!g_ascii_isspace(*p)) {
|
|
| 38 |
if (vp && vp < prev_eolp) {
|
|
| 39 |
switch (attr) {
|
|
| 40 |
case XM_FROM: |
|
| 41 |
if (from->len > 0) |
|
| 42 |
g_string_append_c(from, ' '); |
|
| 43 |
g_string_append_len(from, vp, prev_eolp - vp); |
|
| 44 |
break; |
|
| 45 |
case XM_TO: |
|
| 46 |
if (to->len > 0) |
|
| 47 |
g_string_append_c(to, ' '); |
|
| 48 |
g_string_append_len(to, vp, prev_eolp - vp); |
|
| 49 |
break; |
|
| 50 |
case XM_CC: |
|
| 51 |
if (cc->len > 0) |
|
| 52 |
g_string_append_c(cc, ' '); |
|
| 53 |
g_string_append_len(cc, vp, prev_eolp - vp); |
|
| 54 |
break; |
|
| 55 |
case XM_SUBJECT: |
|
| 56 |
if (subject->len > 0) |
|
| 57 |
g_string_append_c(subject, ' '); |
|
| 58 |
g_string_append_len(subject, vp, prev_eolp - vp); |
|
| 59 |
break; |
|
| 60 |
default: |
|
| 61 |
break; |
|
| 62 |
} |
|
| 63 |
attr = -1; |
|
| 64 |
vp = NULL; |
|
| 65 |
} |
|
| 66 |
|
|
| 67 |
if (!g_ascii_strncasecmp(p, "From:", 5)) {
|
|
| 68 |
attr = XM_FROM; |
|
| 69 |
vp = p + 5; |
|
| 70 |
} else if (!g_ascii_strncasecmp(p, "To:", 3)) {
|
|
| 71 |
attr = XM_TO; |
|
| 72 |
vp = p + 3; |
|
| 73 |
} else if (!g_ascii_strncasecmp(p, "Cc:", 3)) {
|
|
| 74 |
attr = XM_CC; |
|
| 75 |
vp = p + 3; |
|
| 76 |
} else if (!g_ascii_strncasecmp(p, "Subject:", 8)) {
|
|
| 77 |
attr = XM_SUBJECT; |
|
| 78 |
vp = p + 8; |
|
| 79 |
} |
|
| 80 |
} |
|
| 81 |
|
|
| 82 |
prev_eolp = eolp; |
|
| 26 | 83 |
p = eolp + 1; |
| 27 | 84 |
} |
| 28 | 85 |
|
| 29 |
return g_strdup(p); |
|
| 86 |
newdata = xfilter_message_data_new(p ? p : "", "text/plain"); |
|
| 87 |
if (from->len) |
|
| 88 |
xfilter_message_data_set_attribute(newdata, XM_FROM, from->str, FALSE); |
|
| 89 |
if (to->len) |
|
| 90 |
xfilter_message_data_set_attribute(newdata, XM_TO, to->str, FALSE); |
|
| 91 |
if (cc->len) |
|
| 92 |
xfilter_message_data_set_attribute(newdata, XM_CC, cc->str, FALSE); |
|
| 93 |
if (subject->len) |
|
| 94 |
xfilter_message_data_set_attribute(newdata, XM_SUBJECT, subject->str, FALSE); |
|
| 95 |
|
|
| 96 |
g_string_free(subject, TRUE); |
|
| 97 |
g_string_free(cc, TRUE); |
|
| 98 |
g_string_free(to, TRUE); |
|
| 99 |
g_string_free(from, TRUE); |
|
| 100 |
|
|
| 101 |
return newdata; |
|
| 30 | 102 |
} |
| 31 | 103 |
|
| 32 | 104 |
static XFilterStatus xfilter_content_func(XFilter *filter, const XMessageData *data, XFilterResult *result) |
| 33 | 105 |
{
|
| 34 | 106 |
const char *mime_type; |
| 35 | 107 |
const char *content; |
| 36 |
char *new_content; |
|
| 37 | 108 |
XMessageData *newdata; |
| 38 | 109 |
|
| 39 | 110 |
g_return_val_if_fail(result != NULL, XF_ERROR); |
| ... | ... | |
| 47 | 118 |
newdata = xfilter_message_data_new(content, "text/plain"); |
| 48 | 119 |
xfilter_result_set_message_data(result, newdata); |
| 49 | 120 |
} else if (!g_strcasecmp(mime_type, "message/rfc822")) {
|
| 50 |
new_content = xfilter_rfc822_to_text(data); |
|
| 51 |
newdata = xfilter_message_data_new(new_content, "text/plain"); |
|
| 121 |
newdata = xfilter_rfc822_to_text(data); |
|
| 52 | 122 |
xfilter_result_set_message_data(result, newdata); |
| 53 |
g_free(new_content); |
|
| 123 |
g_print("from:%s\n", xfilter_message_data_get_attribute(newdata, XM_FROM));
|
|
| 124 |
g_print("to:%s\n", xfilter_message_data_get_attribute(newdata, XM_TO));
|
|
| 125 |
g_print("cc:%s\n", xfilter_message_data_get_attribute(newdata, XM_CC));
|
|
| 126 |
g_print("subject:%s\n", xfilter_message_data_get_attribute(newdata, XM_SUBJECT));
|
|
| 54 | 127 |
} else |
| 55 | 128 |
return XF_UNSUPPORTED_TYPE; |
| 56 | 129 |
|
Also available in: Unified diff